From 3126bdc7674d6c32b540b938f8e6297016895398 Mon Sep 17 00:00:00 2001 From: Stephen Dolan Date: Tue, 1 Feb 2022 18:20:19 +0000 Subject: [PATCH] Squashed 'ocaml/' changes from 86526aaf5a..173842ce84 173842ce84 Merge flambda-backend changes ed7eba2054 Remove leading space from LINE. (ocaml-flambda/flambda-backend#484) bd611705f7 Bump magic numbers (#5) c50c47d1f9 Add CI builds with local allocations enabled 1412792ed7 Move local allocations support behind '-extension local' 6d8e42aeb7 Better tail call behaviour in caml_applyN c7dac3da41 Typemod: toplevel bindings escape even if no variables are bound 82d6c3ead3 Several fixes for partial application and currying d05c70cc93 Pprintast support for new local syntax e0e62fcdb4 Typecheck x |> f y as (f y x), not ((f y) x) d7e34ce7bf Remove autogeneration of @ocaml.curry b9a05935ce Port ocaml-flambda/flambda-backend#493 0a872d96a1 Code review fixes from ocaml-flambda/flambda-backend#491 6c168bbc48 Remove local allocation counting 3c6e7f042c Code review fixes from ocaml-flambda/flambda-backend#478 bb97207d1c Rename Lambda.apply_position a7cb6509e1 Quieten Makefile when runtime dep files are not present c656dc9bb1 Merge flambda-backend changes 11b5424a69 Avoid printing double spaces in function argument lists 7751faa4f9 Restore locations to Typedtree.{pat,let}_bound_idents_full e450b6c0e9 add build_ocaml_compiler.sexp 0403bb3eed Revert PR 9895 to continue installing VERSION b3447dbe5d Ensure new local attributes are namespaced properly 7f213fc8b3 Allow empty functions again 8f22ad82ad Bugfix: ensure local domain state is initialised 80f54dd625 Bugfix for Selectgen with regions e8133a189a Fix external-external signature inclusion 9840051375 Bootstrap d879f23efd Merge remote-tracking branch 'jane/local-reviewed' into local-merge 94454f5f1c Use Local_store for the local allocations ref 54a164cf35 Create fewer regions, according to typechecking (#59) 1c2479bdb3 Merge flambda-backend changes ce34678606 Fix printing of modes in return types 91f228128b Hook mode variable solving into Btype.snapshot/backtrack 54e4b09d64 Move Alloc_mode and Value_mode to Btype ff4611e779 Merge flambda-backend changes ce62e451d5 Ensure allocations are initialised, even dead ones 6b6ec5a744 Fix the alloc.ml test on 32-bit builds 81e9879ac5 Merge flambda-backend changes 40a7f89c96 Update repo URL for ocaml-jst, and rename script. 0454ee73d4 Add some new locally-allocating primitives (#57) 8acdda123d Reset the local stack pointer in exception handlers (#56) 8dafa98b49 Improve typing for (||) and (&&) (#55) 8c64754035 Fix make_check_all_arches (#54) b50cd457aa Allow arguments to primitives to be local even in tail position (#53) cad125dbe3 Fix modes from or-patterns (#50) 4efdb7273c Fix tailcalls tests with inlining (#52) 4a795cb4af Flambda support (#49) 74722cbf35 Add [@ocaml.principal] and [@ocaml.noprincipal] attributes, and use in oo.mli 6d7d3b87b5 Ensure that functions are evaluated after their arguments (flambda-backend #353) 89bda6b8ad Keep Sys.opaque_identity in Cmm and Mach (port upstream PR 9412) a39126a17f Fix tailcalls within regions (#48) 4ac4cfd4b8 Fix stdlib manpages build 3a95f5edaf Merge flambda-backend changes efe80c9b8b Add jane/pull-flambda-patches script fca94c47c6 Register allocations for Omitted parameter closures (#47) 103b139794 Remove various FIXMEs (#46) 62ba2c1d50 Bootstrap a0062ad6c4 Allow local allocations for various primitives (#43) 7a2165e64c Allow primitives to be poly-moded (#43) 2af3f55db6 Fix a flaky test by refactoring TypePairs (ocaml/ocaml#10638) 58dd8078aa Bootstrap ee3be10c8f Fix modes in build_apply for partial applications fe736568e5 Tweak for evaluation order of labelled partial applications (#10653) 052757089e Fix caml_modify on local allocations (#40) e657e995f6 Relax modes for `as` patterns (#42) f815bf2b4f Add special mode handling for tuples in matches and let bindings (#38) 39f1211a5f Only take the upper bounds of modes associated with allocations (#37) aec6fde3e4 Interpret arrow types in "local positions" differently c4f3319d19 Bootstrap ff6fdade6e Add some missing regions 40d586de9e Bootstrap 66d8110784 Switch to a system with 3 modes for values f2c5a85bce Bugfix for Comballoc with local allocations. (#41) 83bcd09ef1 Fix bug with root scanning during compaction (#39) 1b5ec83383 Track modes in Lambda.lfunction and onwards (#33) f1e2e97549 Port ocaml/ocaml#10728 56703cd290 Port ocaml/ocaml#10081 eb66785575 Support local allocations in i386 and fix amd64 bug (#31) c936b1902e Disallow local recursive non-functions (#30) c7a193a0f3 GC support for local allocations (#29) 8dd72709c9 Nonlocal fields (#28) e19a2f0571 Bootstrap 694b9ac5be Add syntax to the parser for local allocations (#26) f183008978 Lower initial stack size 918226ff46 Allow local closure allocations (#27) 2552e7d257 Introduce mode variables (#25) bc41c99b24 Minor fixes for local allocations (#24) a2a4e608e3 Runtime and compiler support for more local allocations (#23) d03055416b Typechecking for local allocations (#21) 9ee2332f66 Bugfix missing from #20 02c4cef20e Retain block-structured local regions until Mach. 86dbe1c7da amd64: Move stack realloc calls out-of-line 324d218997 More typing modes and locking of environments a4080b80f9 Initial version of local allocation (unsafe) git-subtree-dir: ocaml git-subtree-split: 173842ce847607a032ed3c3753ee14f22556910d --- .github/workflows/main.yml | 40 +- Makefile | 3 + asmcomp/CSEgen.ml | 6 +- asmcomp/afl_instrument.ml | 2 + asmcomp/amd64/emit.mlp | 38 +- asmcomp/amd64/proc.ml | 3 +- asmcomp/arm/emit.mlp | 6 +- asmcomp/arm/proc.ml | 2 +- asmcomp/arm64/emit.mlp | 9 +- asmcomp/arm64/proc.ml | 3 +- asmcomp/cmm.ml | 99 +- asmcomp/cmm.mli | 21 +- asmcomp/cmm_helpers.ml | 435 +- asmcomp/cmm_helpers.mli | 69 +- asmcomp/cmm_invariants.ml | 2 + asmcomp/cmmgen.ml | 292 +- asmcomp/comballoc.ml | 23 +- asmcomp/i386/emit.mlp | 41 +- asmcomp/i386/proc.ml | 4 +- asmcomp/mach.ml | 5 +- asmcomp/mach.mli | 5 +- asmcomp/power/emit.mlp | 9 +- asmcomp/power/proc.ml | 2 +- asmcomp/printcmm.ml | 16 +- asmcomp/printmach.ml | 7 +- asmcomp/reloadgen.ml | 4 + asmcomp/riscv/emit.mlp | 6 +- asmcomp/s390x/emit.mlp | 7 +- asmcomp/s390x/proc.ml | 2 +- asmcomp/selectgen.ml | 201 +- boot/menhir/parser.ml | 13644 +++++++++------- boot/menhir/parser.mli | 3 + boot/ocamlc | Bin 2888119 -> 2969212 bytes boot/ocamllex | Bin 346027 -> 346210 bytes build_ocaml_compiler.sexp | 17 + file_formats/cmx_format.mli | 7 +- jane/pull-backend-patches | 47 + lambda/lambda.ml | 2 +- lambda/lambda.mli | 3 +- lambda/translcore.ml | 501 +- lambda/translcore.mli | 12 +- lambda/translmod.ml | 12 +- middle_end/clambda.ml | 27 +- middle_end/clambda.mli | 27 +- middle_end/clambda_primitives.ml | 50 +- middle_end/clambda_primitives.mli | 50 +- middle_end/closure/closure.ml | 406 +- middle_end/compilenv.ml | 18 +- middle_end/compilenv.mli | 6 +- middle_end/convert_primitives.ml | 86 +- .../flambda/augment_specialised_args.ml | 19 +- middle_end/flambda/build_export_info.ml | 6 +- middle_end/flambda/closure_conversion.ml | 67 +- middle_end/flambda/closure_conversion_aux.ml | 12 +- middle_end/flambda/closure_conversion_aux.mli | 4 + middle_end/flambda/effect_analysis.ml | 4 + middle_end/flambda/export_info_for_pack.ml | 4 +- middle_end/flambda/extract_projections.ml | 1 + middle_end/flambda/flambda.ml | 105 +- middle_end/flambda/flambda.mli | 23 +- middle_end/flambda/flambda_invariants.ml | 14 +- middle_end/flambda/flambda_iterators.ml | 43 +- middle_end/flambda/flambda_to_clambda.ml | 49 +- middle_end/flambda/flambda_utils.ml | 37 +- middle_end/flambda/flambda_utils.mli | 2 + middle_end/flambda/freshening.ml | 4 +- middle_end/flambda/inconstant_idents.ml | 14 +- middle_end/flambda/inline_and_simplify.ml | 84 +- middle_end/flambda/inline_and_simplify_aux.ml | 7 + .../flambda/inline_and_simplify_aux.mli | 7 + middle_end/flambda/inlining_cost.ml | 6 +- middle_end/flambda/inlining_decision.ml | 25 +- middle_end/flambda/inlining_decision.mli | 2 + middle_end/flambda/inlining_transforms.ml | 16 +- middle_end/flambda/inlining_transforms.mli | 4 + middle_end/flambda/lift_constants.ml | 4 +- .../flambda/lift_let_to_initialize_symbol.ml | 5 +- middle_end/flambda/parameter.ml | 25 +- middle_end/flambda/parameter.mli | 6 +- middle_end/flambda/ref_to_variables.ml | 10 +- .../flambda/remove_free_vars_equal_to_args.ml | 3 +- middle_end/flambda/remove_unused_arguments.ml | 11 +- middle_end/flambda/simple_value_approx.ml | 6 +- middle_end/flambda/simple_value_approx.mli | 2 + .../flambda/simplify_boxed_integer_ops.ml | 26 +- middle_end/flambda/simplify_primitives.ml | 36 +- middle_end/flambda/un_anf.ml | 78 +- middle_end/printclambda.ml | 43 +- middle_end/printclambda_primitives.ml | 130 +- middle_end/semantics_of_primitives.ml | 186 +- middle_end/semantics_of_primitives.mli | 2 + ocamldoc/Makefile.docfiles | 5 +- ocamldoc/odoc_ast.ml | 12 +- ocamldoc/odoc_sig.ml | 3 +- ocamldoc/odoc_value.ml | 2 +- otherlibs/Makefile.otherlibs.common | 2 +- otherlibs/systhreads/st_stubs.c | 8 +- parsing/builtin_attributes.ml | 22 + parsing/builtin_attributes.mli | 4 + parsing/lexer.mll | 15 +- parsing/parser.mly | 198 +- parsing/pprintast.ml | 153 +- runtime/Makefile | 2 +- runtime/alloc.c | 14 + runtime/amd64.S | 94 + runtime/array.c | 118 +- runtime/caml/address_class.h | 3 +- runtime/caml/alloc.h | 1 + runtime/caml/gc.h | 36 + runtime/caml/memory.h | 5 + runtime/caml/misc.h | 2 + runtime/caml/roots.h | 6 +- runtime/caml/stack.h | 2 + runtime/i386.S | 35 + runtime/memory.c | 130 + runtime/minor_gc.c | 45 + runtime/obj.c | 5 + runtime/roots_nat.c | 229 +- runtime/startup_byt.c | 14 +- runtime/str.c | 8 + stdlib/float.ml | 14 +- stdlib/float.mli | 14 +- stdlib/int.ml | 32 +- stdlib/int.mli | 32 +- stdlib/int32.ml | 28 +- stdlib/int32.mli | 28 +- stdlib/int64.ml | 28 +- stdlib/int64.mli | 28 +- stdlib/nativeint.ml | 28 +- stdlib/nativeint.mli | 28 +- stdlib/oo.mli | 2 + stdlib/stdlib.ml | 94 +- stdlib/stdlib.mli | 94 +- ...test_locations.dlocations.ocamlc.reference | 22 + ...t_locations.dno-locations.ocamlc.reference | 22 + .../lib-dynlink-initializers/test10_main.ml | 2 +- .../test10_main.native.reference | 3 +- testsuite/tests/parsing/multi_indices.ml | 3 +- testsuite/tests/prim-revapply/apply.ml | 5 + testsuite/tests/prim-revapply/revapply.ml | 11 + ...stop_after_typing_impl.compilers.reference | 2 +- .../array_spec.compilers.flat.reference | 4 +- testsuite/tests/translprim/array_spec.ml | 2 +- .../comparison_table.compilers.reference | 4 +- .../tests/translprim/comparison_table.ml | 2 +- .../translprim/ref_spec.compilers.reference | 21 +- testsuite/tests/translprim/ref_spec.ml | 2 +- testsuite/tests/typing-local/alloc.ml | 453 + testsuite/tests/typing-local/alloc.reference | 33 + testsuite/tests/typing-local/aritybug.ml | 560 + .../tests/typing-local/aritybug.reference | 2 + testsuite/tests/typing-local/comballoc.ml | 29 + .../tests/typing-local/comballoc.reference | 1 + .../tests/typing-local/curry.byte.reference | 6 + testsuite/tests/typing-local/curry.ml | 103 + .../tests/typing-local/curry.opt.reference | 6 + .../tests/typing-local/example_syntax.ml | 13 + testsuite/tests/typing-local/exceptions.ml | 37 + .../tests/typing-local/exceptions.reference | 4 + testsuite/tests/typing-local/lifetime.ml | 43 + .../tests/typing-local/lifetime.reference | 6 + testsuite/tests/typing-local/local.ml | 1837 +++ testsuite/tests/typing-local/mutate.ml | 11 + testsuite/tests/typing-local/mutate.reference | 1 + testsuite/tests/typing-local/partial.ml | 37 + .../tests/typing-local/partial.reference | 3 + testsuite/tests/typing-local/print_syntax.ml | 15 + testsuite/tests/typing-local/regions.ml | 213 + .../tests/typing-local/regions.reference | 24 + testsuite/tests/typing-local/tailcalls.ml | 144 + .../tests/typing-local/tailcalls.reference | 0 testsuite/tests/typing-misc/printing.ml | 6 +- testsuite/tools/parsecmm.mly | 5 +- tools/objinfo.ml | 15 +- toplevel/topdirs.ml | 11 +- toplevel/trace.ml | 4 +- typing/btype.ml | 391 + typing/btype.mli | 135 + typing/cmt2annot.ml | 2 +- typing/ctype.ml | 189 +- typing/ctype.mli | 23 +- typing/datarepr.ml | 4 +- typing/env.ml | 159 +- typing/env.mli | 11 +- typing/includecore.ml | 76 +- typing/includecore.mli | 1 + typing/oprint.ml | 85 +- typing/oprint.mli | 2 +- typing/outcometree.mli | 15 +- typing/parmatch.ml | 72 +- typing/patterns.ml | 2 + typing/primitive.ml | 6 +- typing/printtyp.ml | 33 +- typing/printtyped.ml | 28 +- typing/rec_check.ml | 35 +- typing/stypes.ml | 2 +- typing/subst.ml | 1 + typing/tast_iterator.ml | 14 +- typing/tast_mapper.ml | 22 +- typing/typeclass.ml | 91 +- typing/typecore.ml | 2022 ++- typing/typecore.mli | 23 +- typing/typedecl.ml | 75 +- typing/typedtree.ml | 54 +- typing/typedtree.mli | 41 +- typing/typemod.ml | 75 +- typing/types.ml | 29 +- typing/types.mli | 31 +- typing/typetexp.ml | 106 +- typing/typetexp.mli | 5 +- typing/untypeast.ml | 20 +- utils/clflags.ml | 8 +- utils/clflags.mli | 2 +- utils/config.mlp | 25 +- 214 files changed, 18661 insertions(+), 8016 deletions(-) create mode 100644 build_ocaml_compiler.sexp create mode 100755 jane/pull-backend-patches create mode 100644 testsuite/tests/typing-local/alloc.ml create mode 100644 testsuite/tests/typing-local/alloc.reference create mode 100644 testsuite/tests/typing-local/aritybug.ml create mode 100644 testsuite/tests/typing-local/aritybug.reference create mode 100644 testsuite/tests/typing-local/comballoc.ml create mode 100644 testsuite/tests/typing-local/comballoc.reference create mode 100644 testsuite/tests/typing-local/curry.byte.reference create mode 100644 testsuite/tests/typing-local/curry.ml create mode 100644 testsuite/tests/typing-local/curry.opt.reference create mode 100644 testsuite/tests/typing-local/example_syntax.ml create mode 100644 testsuite/tests/typing-local/exceptions.ml create mode 100644 testsuite/tests/typing-local/exceptions.reference create mode 100644 testsuite/tests/typing-local/lifetime.ml create mode 100644 testsuite/tests/typing-local/lifetime.reference create mode 100644 testsuite/tests/typing-local/local.ml create mode 100644 testsuite/tests/typing-local/mutate.ml create mode 100644 testsuite/tests/typing-local/mutate.reference create mode 100644 testsuite/tests/typing-local/partial.ml create mode 100644 testsuite/tests/typing-local/partial.reference create mode 100644 testsuite/tests/typing-local/print_syntax.ml create mode 100644 testsuite/tests/typing-local/regions.ml create mode 100644 testsuite/tests/typing-local/regions.reference create mode 100644 testsuite/tests/typing-local/tailcalls.ml create mode 100644 testsuite/tests/typing-local/tailcalls.reference diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5dc0daeb0d1..0077e5119e7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,8 +3,10 @@ name: main on: [push, pull_request] jobs: - no-naked-pointers: + no-naked-pointers-local: runs-on: ubuntu-latest + env: + OCAMLPARAM: "_,extension=local" steps: - name: Checkout uses: actions/checkout@v2 @@ -16,8 +18,10 @@ jobs: - name: Run the testsuite run: | make -C testsuite USE_RUNTIME=d all - i386-static: + i386-static-local: runs-on: ubuntu-latest + env: + OCAMLPARAM: "_,extension=local" steps: - name: Checkout uses: actions/checkout@v2 @@ -69,3 +73,35 @@ jobs: - name: Other checks run: | MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh other-checks + full-flambda-local: + runs-on: ubuntu-latest + env: + OCAMLPARAM: "_,extension=local" + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Packages + run: | + sudo apt-get update -y && sudo apt-get install -y texlive-latex-extra texlive-fonts-recommended + # Ensure that make distclean can be run from an empty tree + - name: distclean + run: | + MAKE_ARG=-j make distclean + - name: configure tree + run: | + MAKE_ARG=-j XARCH=x64 CONFIG_ARG='--enable-flambda --enable-dependency-generation' OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh configure + - name: Build + run: | + MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh build + - name: Run the testsuite + run: | + MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh test + - name: Build API Documentation + run: | + MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh api-docs + - name: Install + run: | + MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh install + - name: Other checks + run: | + MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh other-checks diff --git a/Makefile b/Makefile index 69f67ef266a..313d091f1c3 100644 --- a/Makefile +++ b/Makefile @@ -352,6 +352,9 @@ install: $(MKDIR) "$(INSTALL_LIBDIR)" $(MKDIR) "$(INSTALL_STUBLIBDIR)" $(MKDIR) "$(INSTALL_COMPLIBDIR)" + $(INSTALL_DATA) \ + VERSION \ + "$(INSTALL_LIBDIR)" $(MAKE) -C runtime install $(INSTALL_PROG) ocaml$(EXE) "$(INSTALL_BINDIR)" ifeq "$(INSTALL_BYTECODE_PROGRAMS)" "true" diff --git a/asmcomp/CSEgen.ml b/asmcomp/CSEgen.ml index 80377c37bd8..f788bf9a584 100644 --- a/asmcomp/CSEgen.ml +++ b/asmcomp/CSEgen.ml @@ -223,7 +223,7 @@ method class_of_operation op = | Imove | Ispill | Ireload -> assert false (* treated specially *) | Iconst_int _ | Iconst_float _ | Iconst_symbol _ -> Op_pure | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ - | Iextcall _ | Iprobe _ -> assert false (* treated specially *) + | Iextcall _ | Iprobe _ | Iopaque -> assert false (* treated specially *) | Istackoffset _ -> Op_other | Iload(_,_) -> Op_load | Istore(_,_,asg) -> Op_store asg @@ -237,6 +237,7 @@ method class_of_operation op = | Ispecific _ -> Op_other | Iname_for_debugger _ -> Op_pure | Iprobe_is_enabled _ -> Op_other + | Ibeginregion | Iendregion -> Op_other (* Operations that are so cheap that it isn't worth factoring them. *) @@ -278,6 +279,9 @@ method private cse n i = arguments is always a memory load. For simplicity, we just forget everything. *) {i with next = self#cse empty_numbering i.next} + | Iop Iopaque -> + (* Assume arbitrary side effects from Iopaque *) + {i with next = self#cse empty_numbering i.next} | Iop (Ialloc _) -> (* For allocations, we must avoid extending the live range of a pseudoregister across the allocation if this pseudoreg diff --git a/asmcomp/afl_instrument.ml b/asmcomp/afl_instrument.ml index c493a2505ab..32c031647fb 100644 --- a/asmcomp/afl_instrument.ml +++ b/asmcomp/afl_instrument.ml @@ -88,6 +88,8 @@ and instrument = function in Ccatch (isrec, cases, instrument body) | Cexit (ex, args) -> Cexit (ex, List.map instrument args) + | Cregion e -> Cregion (instrument e) + | Ctail e -> Ctail (instrument e) (* these are base cases and have no logging *) | Cconst_int _ | Cconst_natint _ | Cconst_float _ diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index cdd8617d0ad..32e514187ab 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -299,6 +299,19 @@ let emit_call_gc gc = def_label gc.gc_frame; I.jmp (label gc.gc_return_lbl) +(* Record calls to local stack reallocation *) + +type local_realloc_call = + { lr_lbl: label; + lr_return_lbl: label; } + +let local_realloc_sites = ref ([] : local_realloc_call list) + +let emit_local_realloc lr = + def_label lr.lr_lbl; + emit_call "caml_call_local_realloc"; + I.jmp (label lr.lr_return_lbl) + (* Record calls to caml_ml_array_bound_error. In -g mode we maintain one call to caml_ml_array_bound_error per bound check site. Without -g, we can share @@ -737,7 +750,7 @@ let emit_instr fallthrough i = | Double -> I.movsd (arg i 0) (addressing addr REAL8 i 1) end - | Lop(Ialloc { bytes = n; dbginfo }) -> + | Lop(Ialloc { bytes = n; dbginfo; mode = Alloc_heap }) -> assert (n <= (Config.max_young_wosize + 1) * Arch.size_addr); if !fastcode_flag then begin I.sub (int n) r15; @@ -767,6 +780,21 @@ let emit_instr fallthrough i = def_label label; I.lea (mem64 NONE 8 R15) (res i 0) end + | Lop(Ialloc { bytes = n; dbginfo=_; mode = Alloc_local }) -> + let r = res i 0 in + I.mov (domain_field Domainstate.Domain_local_sp) r; + I.sub (int n) r; + I.mov r (domain_field Domainstate.Domain_local_sp); + I.cmp (domain_field Domainstate.Domain_local_limit) r; + let lbl_call = new_label () in + I.j L (label lbl_call); + let lbl_after_alloc = new_label () in + def_label lbl_after_alloc; + I.add (domain_field Domainstate.Domain_local_top) r; + I.add (int 8) r; + local_realloc_sites := + { lr_lbl = lbl_call; + lr_return_lbl = lbl_after_alloc } :: !local_realloc_sites | Lop(Iintop(Icomp cmp)) -> I.cmp (arg i 1) (arg i 0); I.set (cond cmp) al; @@ -813,6 +841,8 @@ let emit_instr fallthrough i = I.cvtsi2sd (arg i 0) (res i 0) | Lop(Iintoffloat) -> I.cvttsd2si (arg i 0) (res i 0) + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc) | Lop(Ispecific(Ilea addr)) -> I.lea (addressing addr NONE i 0) (res i 0) | Lop(Ispecific(Istore_int(n, addr, _))) -> @@ -842,6 +872,10 @@ let emit_instr fallthrough i = I.movsxd (arg32 i 0) (res i 0) | Lop(Ispecific(Izextend32)) -> I.mov (arg32 i 0) (res32 i 0) + | Lop(Ibeginregion) -> + I.mov (domain_field Domainstate.Domain_local_sp) (res i 0) + | Lop(Iendregion) -> + I.mov (arg i 0) (domain_field Domainstate.Domain_local_sp) | Lop (Iname_for_debugger _) -> () | Lop (Iprobe _) -> let probe_label = new_label () in @@ -1024,6 +1058,7 @@ let fundecl fundecl = tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; stack_offset := 0; call_gc_sites := []; + local_realloc_sites := []; bound_error_sites := []; bound_error_call := 0; for i = 0 to Proc.num_register_classes - 1 do @@ -1047,6 +1082,7 @@ let fundecl fundecl = cfi_startproc (); emit_all true fundecl.fun_body; List.iter emit_call_gc !call_gc_sites; + List.iter emit_local_realloc !local_realloc_sites; emit_call_bound_errors (); if !frame_required then begin let n = frame_size() - 8 - (if fp then 8 else 0) in diff --git a/asmcomp/amd64/proc.ml b/asmcomp/amd64/proc.ml index 5dd7ba8fce5..cdcaeb54934 100644 --- a/asmcomp/amd64/proc.ml +++ b/asmcomp/amd64/proc.ml @@ -354,10 +354,11 @@ let max_register_pressure = function let op_is_pure = function | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ - | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> false + | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) | Iopaque -> false | Ispecific(Ilea _|Isextend32|Izextend32) -> true | Ispecific _ -> false | Iprobe _ | Iprobe_is_enabled _-> false + | Ibeginregion | Iendregion -> false | _ -> true (* Layout of the stack frame *) diff --git a/asmcomp/arm/emit.mlp b/asmcomp/arm/emit.mlp index 57a16539d8a..96cdcd2b9a1 100644 --- a/asmcomp/arm/emit.mlp +++ b/asmcomp/arm/emit.mlp @@ -636,7 +636,7 @@ let emit_instr i = | Double -> "fstd" | _ (* 32-bit quantities *) -> "str" in ` {emit_string instr} {emit_reg r}, {emit_addressing addr i.arg 1}\n`; 1 - | Lop(Ialloc { bytes = n; dbginfo }) -> + | Lop(Ialloc { bytes = n; dbginfo; mode = Alloc_heap }) -> let lbl_frame = record_frame_label i.live (Dbg_alloc dbginfo) in @@ -670,6 +670,8 @@ let emit_instr i = `{emit_label lbl_frame}: add {emit_reg i.res.(0)}, alloc_ptr, #4\n`; 1 + ninstr end + | Lop(Ialloc { mode = Alloc_local } | Ibeginregion | Iendregion) -> + Misc.fatal_error "Local allocations not supported on this architecture" | Lop(Iintop(Icomp cmp)) -> ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; 1 + emit_set_condition cmp i.res.(0) @@ -719,6 +721,8 @@ let emit_instr i = | Lop(Iintoffloat) -> ` ftosizd s14, {emit_reg i.arg.(0)}\n`; ` fmrs {emit_reg i.res.(0)}, s14\n`; 2 + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc); 0 | Lop(Iaddf | Isubf | Imulf | Idivf | Ispecific Inegmulf as op) -> let instr = (match op with Iaddf -> "faddd" diff --git a/asmcomp/arm/proc.ml b/asmcomp/arm/proc.ml index 1da4386b03a..188598c515c 100644 --- a/asmcomp/arm/proc.ml +++ b/asmcomp/arm/proc.ml @@ -335,7 +335,7 @@ let max_register_pressure = function let op_is_pure = function | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ - | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) + | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) | Iopaque | Ispecific(Ishiftcheckbound _) -> false | _ -> true diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp index 3cf7bba59e6..f124cba0ed1 100644 --- a/asmcomp/arm64/emit.mlp +++ b/asmcomp/arm64/emit.mlp @@ -511,6 +511,8 @@ module BR = Branch_relaxation.Make (struct | 16 | 24 | 32 -> 1 | _ -> 1 + num_instructions_for_intconst (Nativeint.of_int num_bytes) end + | Lop (Ibeginregion | Iendregion) -> + Misc.fatal_error "Local allocations not supported on this architecture" | Lop (Iintop (Icomp _)) -> 2 | Lop (Iintop_imm (Icomp _, _)) -> 2 | Lop (Iintop (Icheckbound)) -> 2 @@ -525,6 +527,7 @@ module BR = Branch_relaxation.Make (struct | Lop (Iintop_imm _) -> 1 | Lop (Ifloatofint | Iintoffloat | Iabsf | Inegf | Ispecific Isqrtf) -> 1 | Lop (Iaddf | Isubf | Imulf | Idivf | Ispecific Inegmulf) -> 1 + | Lop (Iopaque) -> 0 | Lop (Ispecific (Imuladdf | Inegmuladdf | Imulsubf | Inegmulsubf)) -> 1 | Lop (Ispecific (Ishiftarith _)) -> 1 | Lop (Ispecific (Imuladd | Imulsub)) -> 1 @@ -770,10 +773,12 @@ let emit_instr i = | Word_int | Word_val | Double -> ` str {emit_reg src}, {emit_addressing addr base}\n` end - | Lop(Ialloc { bytes = n; dbginfo }) -> + | Lop(Ialloc { bytes = n; dbginfo; mode = Alloc_heap }) -> assembly_code_for_allocation i ~n ~far:false ~dbginfo | Lop(Ispecific (Ifar_alloc { bytes = n; dbginfo })) -> assembly_code_for_allocation i ~n ~far:true ~dbginfo + | Lop(Ialloc { mode = Alloc_local } | Ibeginregion | Iendregion) -> + Misc.fatal_error "Local allocations not supported on this architecture" | Lop(Iintop_imm(Iadd, n)) -> emit_addimm i.res.(0) i.arg.(0) n | Lop(Iintop_imm(Isub, n)) -> @@ -855,6 +860,8 @@ let emit_instr i = | Inegmulsubf -> "fnmsub" | _ -> assert false) in ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}, {emit_reg i.arg.(0)}\n` + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc) | Lop(Ispecific(Ishiftarith(op, shift))) -> let instr = (match op with Ishiftadd -> "add" diff --git a/asmcomp/arm64/proc.ml b/asmcomp/arm64/proc.ml index ac849a46cbb..fed933fd3cf 100644 --- a/asmcomp/arm64/proc.ml +++ b/asmcomp/arm64/proc.ml @@ -286,7 +286,8 @@ let max_register_pressure = function let op_is_pure = function | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ - | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) + | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) | Iopaque + | Ibeginregion | Iendregion | Ispecific(Ishiftcheckbound _) -> false | _ -> true diff --git a/asmcomp/cmm.ml b/asmcomp/cmm.ml index 9d1c82a04db..f5cf2916b1c 100644 --- a/asmcomp/cmm.ml +++ b/asmcomp/cmm.ml @@ -148,10 +148,10 @@ type memory_chunk = | Double and operation = - Capply of machtype + Capply of machtype * Lambda.region_close | Cextcall of string * machtype * exttype list * bool | Cload of memory_chunk * Asttypes.mutable_flag - | Calloc + | Calloc of Lambda.alloc_mode | Cstore of memory_chunk * Lambda.initialization_or_assignment | Caddi | Csubi | Cmuli | Cmulhi | Cdivi | Cmodi | Cand | Cor | Cxor | Clsl | Clsr | Casr @@ -166,6 +166,8 @@ and operation = | Ccheckbound | Cprobe of { name: string; handler_code_sym: string; } | Cprobe_is_enabled of { name: string } + | Copaque + | Cbeginregion | Cendregion type expression = Cconst_int of int * Debuginfo.t @@ -194,6 +196,8 @@ type expression = | Cexit of int * expression list | Ctrywith of expression * Backend_var.With_provenance.t * expression * Debuginfo.t + | Cregion of expression + | Ctail of expression type codegen_option = | Reduce_code_size @@ -253,6 +257,12 @@ let iter_shallow_tail f = function f e1; f e2; true + | Cregion e -> + f e; + true + | Ctail e -> + f e; + true | Cexit _ | Cop (Craise _, _, _) -> true | Cconst_int _ @@ -265,30 +275,34 @@ let iter_shallow_tail f = function | Cop _ -> false -let rec map_tail f = function +let map_shallow_tail f = function | Clet(id, exp, body) -> - Clet(id, exp, map_tail f body) + Clet(id, exp, f body) | Clet_mut(id, kind, exp, body) -> - Clet_mut(id, kind, exp, map_tail f body) + Clet_mut(id, kind, exp, f body) | Cphantom_let(id, exp, body) -> - Cphantom_let (id, exp, map_tail f body) + Cphantom_let (id, exp, f body) | Cifthenelse(cond, ifso_dbg, ifso, ifnot_dbg, ifnot, dbg) -> Cifthenelse ( cond, - ifso_dbg, map_tail f ifso, - ifnot_dbg, map_tail f ifnot, + ifso_dbg, f ifso, + ifnot_dbg, f ifnot, dbg ) | Csequence(e1, e2) -> - Csequence(e1, map_tail f e2) + Csequence(e1, f e2) | Cswitch(e, tbl, el, dbg') -> - Cswitch(e, tbl, Array.map (fun (e, dbg) -> map_tail f e, dbg) el, dbg') + Cswitch(e, tbl, Array.map (fun (e, dbg) -> f e, dbg) el, dbg') | Ccatch(rec_flag, handlers, body) -> - let map_h (n, ids, handler, dbg) = (n, ids, map_tail f handler, dbg) in - Ccatch(rec_flag, List.map map_h handlers, map_tail f body) + let map_h (n, ids, handler, dbg) = (n, ids, f handler, dbg) in + Ccatch(rec_flag, List.map map_h handlers, f body) | Ctrywith(e1, id, e2, dbg) -> - Ctrywith(map_tail f e1, id, map_tail f e2, dbg) + Ctrywith(f e1, id, f e2, dbg) + | Cregion e -> + Cregion(f e) + | Ctail e -> + Ctail(f e) | Cexit _ | Cop (Craise _, _, _) as cmm -> cmm | Cconst_int _ @@ -298,8 +312,59 @@ let rec map_tail f = function | Cvar _ | Cassign _ | Ctuple _ - | Cop _ as c -> - f c + | Cop _ as cmm -> cmm + +let map_tail f = + let rec loop = function + | Cconst_int _ + | Cconst_natint _ + | Cconst_float _ + | Cconst_symbol _ + | Cvar _ + | Cassign _ + | Ctuple _ + | Cop _ as c -> + f c + | cmm -> map_shallow_tail loop cmm + in + loop + +let iter_shallow f = function + | Clet (_id, e1, e2) -> + f e1; f e2 + | Clet_mut (_id, _kind, e1, e2) -> + f e1; f e2 + | Cphantom_let (_id, _de, e) -> + f e + | Cassign (_id, e) -> + f e + | Ctuple el -> + List.iter f el + | Cop (_op, el, _dbg) -> + List.iter f el + | Csequence (e1, e2) -> + f e1; f e2 + | Cifthenelse(cond, _ifso_dbg, ifso, _ifnot_dbg, ifnot, _dbg) -> + f cond; f ifso; f ifnot + | Cswitch (_e, _ia, ea, _dbg) -> + Array.iter (fun (e, _) -> f e) ea + | Ccatch (_rf, hl, body) -> + let iter_h (_n, _ids, handler, _dbg) = f handler in + List.iter iter_h hl; f body + | Cexit (_n, el) -> + List.iter f el + | Ctrywith (e1, _id, e2, _dbg) -> + f e1; f e2 + | Cregion e -> + f e + | Ctail e -> + f e + | Cconst_int _ + | Cconst_natint _ + | Cconst_float _ + | Cconst_symbol _ + | Cvar _ -> + () let map_shallow f = function | Clet (id, e1, e2) -> @@ -327,6 +392,10 @@ let map_shallow f = function Cexit (n, List.map f el) | Ctrywith (e1, id, e2, dbg) -> Ctrywith (f e1, id, f e2, dbg) + | Cregion e -> + Cregion (f e) + | Ctail e -> + Ctail (f e) | Cconst_int _ | Cconst_natint _ | Cconst_float _ diff --git a/asmcomp/cmm.mli b/asmcomp/cmm.mli index c8fefe30584..44100d81863 100644 --- a/asmcomp/cmm.mli +++ b/asmcomp/cmm.mli @@ -139,13 +139,13 @@ type memory_chunk = see PR#10433 *) and operation = - Capply of machtype + Capply of machtype * Lambda.region_close | Cextcall of string * machtype * exttype list * bool (** The [machtype] is the machine type of the result. The [exttype list] describes the unboxing types of the arguments. An empty list means "all arguments are machine words [XInt]". *) | Cload of memory_chunk * Asttypes.mutable_flag - | Calloc + | Calloc of Lambda.alloc_mode | Cstore of memory_chunk * Lambda.initialization_or_assignment | Caddi | Csubi | Cmuli | Cmulhi | Cdivi | Cmodi | Cand | Cor | Cxor | Clsl | Clsr | Casr @@ -164,6 +164,8 @@ and operation = or equal to the bound. *) | Cprobe of { name: string; handler_code_sym: string; } | Cprobe_is_enabled of { name: string } + | Copaque (* Sys.opaque_identity *) + | Cbeginregion | Cendregion (** Every basic block should have a corresponding [Debuginfo.t] for its beginning. *) @@ -195,6 +197,8 @@ and expression = | Cexit of int * expression list | Ctrywith of expression * Backend_var.With_provenance.t * expression * Debuginfo.t + | Cregion of expression + | Ctail of expression type codegen_option = | Reduce_code_size @@ -242,11 +246,18 @@ val iter_shallow_tail: (expression -> unit) -> expression -> bool considered to be in tail position (because their result become the final result for the expression). *) +val map_shallow_tail: (expression -> expression) -> expression -> expression + (** Apply the transformation to those immediate sub-expressions of an + expression that are in tail position, using the same definition of "tail" + as [iter_shallow_tail] *) + val map_tail: (expression -> expression) -> expression -> expression (** Apply the transformation to an expression, trying to push it - to all inner sub-expressions that can produce the final result. - Same disclaimer as for [iter_shallow_tail] about the notion - of "tail" sub-expression. *) + to all inner sub-expressions that can produce the final result, + by recursively applying map_shallow_tail *) + +val iter_shallow: (expression -> unit) -> expression -> unit + (** Apply the callback to each immediate sub-expression. *) val map_shallow: (expression -> expression) -> expression -> expression (** Apply the transformation to each immediate sub-expression. *) diff --git a/asmcomp/cmm_helpers.ml b/asmcomp/cmm_helpers.ml index 6783699642d..948ea353f33 100644 --- a/asmcomp/cmm_helpers.ml +++ b/asmcomp/cmm_helpers.ml @@ -38,6 +38,7 @@ let bind_nonvar name arg fn = | _ -> let id = V.create_local name in Clet(VP.create id, arg, fn (Cvar id)) let caml_black = Nativeint.shift_left (Nativeint.of_int 3) 8 +let caml_local = Nativeint.shift_left (Nativeint.of_int 2) 8 (* cf. runtime/caml/gc.h *) (* Block headers. Meaning of the tag field: see stdlib/obj.ml *) @@ -51,10 +52,13 @@ let block_header tag sz = in no-naked-pointers mode. See [caml_darken] and the code below that emits structured constants and static module definitions. *) let black_block_header tag sz = Nativeint.logor (block_header tag sz) caml_black +let local_block_header tag sz = Nativeint.logor (block_header tag sz) caml_local let white_closure_header sz = block_header Obj.closure_tag sz let black_closure_header sz = black_block_header Obj.closure_tag sz +let local_closure_header sz = local_block_header Obj.closure_tag sz let infix_header ofs = block_header Obj.infix_tag ofs let float_header = block_header Obj.double_tag (size_float / size_addr) +let float_local_header = local_block_header Obj.double_tag (size_float / size_addr) let floatarray_header len = (* Zero-sized float arrays have tag zero for consistency with [caml_alloc_float_array]. *) @@ -66,6 +70,9 @@ let string_header len = let boxedint32_header = block_header Obj.custom_tag 2 let boxedint64_header = block_header Obj.custom_tag (1 + 8 / size_addr) let boxedintnat_header = block_header Obj.custom_tag 2 +let boxedint32_local_header = local_block_header Obj.custom_tag 2 +let boxedint64_local_header = local_block_header Obj.custom_tag (1 + 8 / size_addr) +let boxedintnat_local_header = local_block_header Obj.custom_tag 2 let caml_nativeint_ops = "caml_nativeint_ops" let caml_int32_ops = "caml_int32_ops" let caml_int64_ops = "caml_int64_ops" @@ -74,21 +81,41 @@ let pos_arity_in_closinfo = 8 * size_addr - 8 (* arity = the top 8 bits of the closinfo word *) let closure_info ~arity ~startenv = + let arity = + match arity with + | Lambda.Tupled, n -> -n + | Lambda.Curried _, n -> n + in assert (-128 <= arity && arity <= 127); assert (0 <= startenv && startenv < 1 lsl (pos_arity_in_closinfo - 1)); Nativeint.(add (shift_left (of_int arity) pos_arity_in_closinfo) (add (shift_left (of_int startenv) 1) 1n)) -let alloc_float_header dbg = Cconst_natint (float_header, dbg) +let alloc_float_header mode dbg = + match mode with + | Lambda.Alloc_heap -> Cconst_natint (float_header, dbg) + | Lambda.Alloc_local -> Cconst_natint (float_local_header, dbg) let alloc_floatarray_header len dbg = Cconst_natint (floatarray_header len, dbg) -let alloc_closure_header sz dbg = Cconst_natint (white_closure_header sz, dbg) +let alloc_closure_header ~mode sz dbg = + match (mode : Lambda.alloc_mode) with + | Alloc_heap -> Cconst_natint (white_closure_header sz, dbg) + | Alloc_local -> Cconst_natint (local_closure_header sz, dbg) let alloc_infix_header ofs dbg = Cconst_natint (infix_header ofs, dbg) let alloc_closure_info ~arity ~startenv dbg = Cconst_natint (closure_info ~arity ~startenv, dbg) -let alloc_boxedint32_header dbg = Cconst_natint (boxedint32_header, dbg) -let alloc_boxedint64_header dbg = Cconst_natint (boxedint64_header, dbg) -let alloc_boxedintnat_header dbg = Cconst_natint (boxedintnat_header, dbg) +let alloc_boxedint32_header mode dbg = + match mode with + | Lambda.Alloc_heap -> Cconst_natint (boxedint32_header, dbg) + | Lambda.Alloc_local -> Cconst_natint (boxedint32_local_header, dbg) +let alloc_boxedint64_header mode dbg = + match mode with + | Lambda.Alloc_heap -> Cconst_natint (boxedint64_header, dbg) + | Lambda.Alloc_local -> Cconst_natint (boxedint64_local_header, dbg) +let alloc_boxedintnat_header mode dbg = + match mode with + | Lambda.Alloc_heap -> Cconst_natint (boxedintnat_header, dbg) + | Lambda.Alloc_local -> Cconst_natint (boxedintnat_local_header, dbg) (* Integers *) @@ -558,12 +585,12 @@ let test_bool dbg cmm = (* Float *) -let box_float dbg c = Cop(Calloc, [alloc_float_header dbg; c], dbg) +let box_float dbg m c = Cop(Calloc m, [alloc_float_header m dbg; c], dbg) let unbox_float dbg = map_tail (function - | Cop(Calloc, [Cconst_natint (hdr, _); c], _) + | Cop(Calloc _, [Cconst_natint (hdr, _); c], _) when Nativeint.equal hdr float_header -> c | Cconst_symbol (s, _dbg) as cmm -> @@ -579,7 +606,7 @@ let unbox_float dbg = (* Complex *) let box_complex dbg c_re c_im = - Cop(Calloc, [alloc_floatarray_header 2 dbg; c_re; c_im], dbg) + Cop(Calloc Alloc_heap, [alloc_floatarray_header 2 dbg; c_re; c_im], dbg) let complex_re c dbg = Cop(Cload (Double, Immutable), [c], dbg) let complex_im c dbg = Cop(Cload (Double, Immutable), @@ -611,8 +638,8 @@ let rec remove_unit = function Ctrywith(remove_unit body, exn, remove_unit handler, dbg) | Clet(id, c1, c2) -> Clet(id, c1, remove_unit c2) - | Cop(Capply _mty, args, dbg) -> - Cop(Capply typ_void, args, dbg) + | Cop(Capply(_mty, pos), args, dbg) -> + Cop(Capply(typ_void, pos), args, dbg) | Cop(Cextcall(proc, _ty_res, ty_args, alloc), args, dbg) -> Cop(Cextcall(proc, typ_void, ty_args, alloc), args, dbg) | Cexit (_,_) as c -> c @@ -733,14 +760,11 @@ let unboxed_float_array_ref arr ofs dbg = Cop(Cload (Double, Mutable), [array_indexing log2_size_float arr ofs dbg], dbg) let float_array_ref arr ofs dbg = - box_float dbg (unboxed_float_array_ref arr ofs dbg) + box_float dbg Alloc_heap (unboxed_float_array_ref arr ofs dbg) let addr_array_set arr ofs newval dbg = Cop(Cextcall("caml_modify", typ_void, [], false), [array_indexing log2_size_addr arr ofs dbg; newval], dbg) -let addr_array_initialize arr ofs newval dbg = - Cop(Cextcall("caml_initialize", typ_void, [], false), - [array_indexing log2_size_addr arr ofs dbg; newval], dbg) let int_array_set arr ofs newval dbg = Cop(Cstore (Word_int, Lambda.Assignment), [array_indexing log2_size_addr arr ofs dbg; newval], dbg) @@ -748,6 +772,10 @@ let float_array_set arr ofs newval dbg = Cop(Cstore (Double, Lambda.Assignment), [array_indexing log2_size_float arr ofs dbg; newval], dbg) +let addr_array_set_local arr ofs newval dbg = + Cop(Cextcall("caml_modify_local", typ_void, [], false), + [arr; untag_int ofs dbg; newval], dbg) + (* String length *) (* Length of string block *) @@ -784,20 +812,29 @@ let lookup_label obj lab dbg = let table = Cop (Cload (Word_val, Mutable), [obj], dbg) in addr_array_ref table lab dbg) -let call_cached_method obj tag cache pos args dbg = +let send_function_name n (mode : Lambda.alloc_mode) = + let suff = match mode with Alloc_heap -> "" | Alloc_local -> "L" in + "caml_send" ^ Int.to_string n ^ suff + +let call_cached_method obj tag cache pos args (apos,mode) dbg = let arity = List.length args in let cache = array_indexing log2_size_addr cache pos dbg in - Compilenv.need_send_fun arity; - Cop(Capply typ_val, - Cconst_symbol("caml_send" ^ Int.to_string arity, dbg) :: + Compilenv.need_send_fun arity mode; + Cop(Capply(typ_val, apos), + Cconst_symbol(send_function_name arity mode, dbg) :: obj :: tag :: cache :: args, dbg) (* Allocation *) -let make_alloc_generic set_fn dbg tag wordsize args = - if wordsize <= Config.max_young_wosize then - Cop(Calloc, Cconst_natint(block_header tag wordsize, dbg) :: args, dbg) +let make_alloc_generic ~mode set_fn dbg tag wordsize args = + if mode = Lambda.Alloc_local || wordsize <= Config.max_young_wosize then + let hdr = + match mode with + | Lambda.Alloc_local -> local_block_header tag wordsize + | Lambda.Alloc_heap -> block_header tag wordsize + in + Cop(Calloc mode, Cconst_natint(hdr, dbg) :: args, dbg) else begin let id = V.create_local "*alloc*" in let rec fill_fields idx = function @@ -810,15 +847,15 @@ let make_alloc_generic set_fn dbg tag wordsize args = fill_fields 1 args) end -let make_alloc dbg tag args = +let make_alloc ~mode dbg tag args = let addr_array_init arr ofs newval dbg = Cop(Cextcall("caml_initialize", typ_void, [], false), [array_indexing log2_size_addr arr ofs dbg; newval], dbg) in - make_alloc_generic addr_array_init dbg tag (List.length args) args + make_alloc_generic ~mode addr_array_init dbg tag (List.length args) args -let make_float_alloc dbg tag args = - make_alloc_generic float_array_set dbg tag +let make_float_alloc ~mode dbg tag args = + make_alloc_generic ~mode float_array_set dbg tag (List.length args * size_float / size_addr) args (* Bounds checking *) @@ -831,14 +868,21 @@ let make_checkbound dbg = function Cop(Ccheckbound, args, dbg) (* Record application and currying functions *) - -let apply_function_sym n = - Compilenv.need_apply_fun n; "caml_apply" ^ Int.to_string n -let curry_function_sym n = - Compilenv.need_curry_fun n; - if n >= 0 - then "caml_curry" ^ Int.to_string n - else "caml_tuplify" ^ Int.to_string (-n) +let apply_function_name (n, (mode : Lambda.alloc_mode)) = + let suff = match mode with Alloc_heap -> "" | Alloc_local -> "L" in + "caml_apply" ^ Int.to_string n ^ suff +let apply_function_sym n mode = + assert (n > 0); + Compilenv.need_apply_fun n mode; + apply_function_name (n, mode) +let curry_function_sym ar = + Compilenv.need_curry_fun ar; + match ar with + | Lambda.Curried {nlocal}, n -> + "caml_curry" ^ Int.to_string n ^ + (if nlocal > 0 then "L" ^ Int.to_string nlocal else "") + | Lambda.Tupled, n -> + "caml_tuplify" ^ Int.to_string n (* Big arrays *) @@ -1005,13 +1049,13 @@ let operations_boxed_int (bi : Primitive.boxed_integer) = | Pint32 -> caml_int32_ops | Pint64 -> caml_int64_ops -let alloc_header_boxed_int (bi : Primitive.boxed_integer) = +let alloc_header_boxed_int (bi : Primitive.boxed_integer) mode dbg = match bi with - Pnativeint -> alloc_boxedintnat_header - | Pint32 -> alloc_boxedint32_header - | Pint64 -> alloc_boxedint64_header + Pnativeint -> alloc_boxedintnat_header mode dbg + | Pint32 -> alloc_boxedint32_header mode dbg + | Pint64 -> alloc_boxedint64_header mode dbg -let box_int_gen dbg (bi : Primitive.boxed_integer) arg = +let box_int_gen dbg (bi : Primitive.boxed_integer) mode arg = let arg' = if bi = Primitive.Pint32 && size_int = 8 then if big_endian @@ -1019,9 +1063,10 @@ let box_int_gen dbg (bi : Primitive.boxed_integer) arg = else sign_extend_32 dbg arg else arg in - Cop(Calloc, [alloc_header_boxed_int bi dbg; - Cconst_symbol(operations_boxed_int bi, dbg); - arg'], dbg) + Cop(Calloc mode, + [alloc_header_boxed_int bi mode dbg; + Cconst_symbol(operations_boxed_int bi, dbg); + arg'], dbg) let split_int64_for_32bit_target arg dbg = bind "split_int64" arg (fun arg -> @@ -1055,20 +1100,20 @@ let unbox_int dbg bi = in map_tail (function - | Cop(Calloc, + | Cop(Calloc _, [hdr; ops; Cop(Clsl, [contents; Cconst_int (32, _)], _dbg')], _dbg) when bi = Primitive.Pint32 && size_int = 8 && big_endian && alloc_matches_boxed_int bi ~hdr ~ops -> (* Force sign-extension of low 32 bits *) sign_extend_32 dbg contents - | Cop(Calloc, + | Cop(Calloc _, [hdr; ops; contents], _dbg) when bi = Primitive.Pint32 && size_int = 8 && not big_endian && alloc_matches_boxed_int bi ~hdr ~ops -> (* Force sign-extension of low 32 bits *) sign_extend_32 dbg contents - | Cop(Calloc, [hdr; ops; contents], _dbg) + | Cop(Calloc _, [hdr; ops; contents], _dbg) when alloc_matches_boxed_int bi ~hdr ~ops -> contents | Cconst_symbol (s, _dbg) as cmm -> @@ -1331,6 +1376,9 @@ let check_bound safety access_size dbg length a2 k = in Csequence(make_checkbound dbg [max_or_zero a1 dbg; a2], k) +let opaque e dbg = + Cop(Copaque, [e], dbg) + let unaligned_set size ptr idx newval dbg = match (size : Clambda_primitives.memory_access_size) with | Sixteen -> unaligned_set_16 ptr idx newval dbg @@ -1343,11 +1391,11 @@ let unaligned_load size ptr idx dbg = | Thirty_two -> unaligned_load_32 ptr idx dbg | Sixty_four -> unaligned_load_64 ptr idx dbg -let box_sized size dbg exp = +let box_sized size mode dbg exp = match (size : Clambda_primitives.memory_access_size) with | Sixteen -> tag_int exp dbg - | Thirty_two -> box_int_gen dbg Pint32 exp - | Sixty_four -> box_int_gen dbg Pint64 exp + | Thirty_two -> box_int_gen dbg Pint32 mode exp + | Sixty_four -> box_int_gen dbg Pint64 mode exp (* Simplification of some primitives into C calls *) @@ -1367,37 +1415,39 @@ let int64_native_prim name arity ~alloc = ~native_repr_args:(make_args arity) ~native_repr_res:u64 +(* TODO: On 32-bit, these will do heap allocations even in situations + where local allocs are allowed *) let simplif_primitive_32bits : Clambda_primitives.primitive -> Clambda_primitives.primitive = function - Pbintofint Pint64 -> Pccall (default_prim "caml_int64_of_int") + Pbintofint (Pint64,_) -> Pccall (default_prim "caml_int64_of_int") | Pintofbint Pint64 -> Pccall (default_prim "caml_int64_to_int") - | Pcvtbint(Pint32, Pint64) -> Pccall (default_prim "caml_int64_of_int32") - | Pcvtbint(Pint64, Pint32) -> Pccall (default_prim "caml_int64_to_int32") - | Pcvtbint(Pnativeint, Pint64) -> + | Pcvtbint(Pint32, Pint64,_) -> Pccall (default_prim "caml_int64_of_int32") + | Pcvtbint(Pint64, Pint32,_) -> Pccall (default_prim "caml_int64_to_int32") + | Pcvtbint(Pnativeint, Pint64,_) -> Pccall (default_prim "caml_int64_of_nativeint") - | Pcvtbint(Pint64, Pnativeint) -> + | Pcvtbint(Pint64, Pnativeint,_) -> Pccall (default_prim "caml_int64_to_nativeint") - | Pnegbint Pint64 -> Pccall (int64_native_prim "caml_int64_neg" 1 + | Pnegbint(Pint64,_) -> Pccall (int64_native_prim "caml_int64_neg" 1 ~alloc:false) - | Paddbint Pint64 -> Pccall (int64_native_prim "caml_int64_add" 2 + | Paddbint(Pint64,_) -> Pccall (int64_native_prim "caml_int64_add" 2 ~alloc:false) - | Psubbint Pint64 -> Pccall (int64_native_prim "caml_int64_sub" 2 + | Psubbint(Pint64,_) -> Pccall (int64_native_prim "caml_int64_sub" 2 ~alloc:false) - | Pmulbint Pint64 -> Pccall (int64_native_prim "caml_int64_mul" 2 + | Pmulbint(Pint64,_) -> Pccall (int64_native_prim "caml_int64_mul" 2 ~alloc:false) | Pdivbint {size=Pint64} -> Pccall (int64_native_prim "caml_int64_div" 2 ~alloc:true) | Pmodbint {size=Pint64} -> Pccall (int64_native_prim "caml_int64_mod" 2 ~alloc:true) - | Pandbint Pint64 -> Pccall (int64_native_prim "caml_int64_and" 2 + | Pandbint(Pint64,_) -> Pccall (int64_native_prim "caml_int64_and" 2 ~alloc:false) - | Porbint Pint64 -> Pccall (int64_native_prim "caml_int64_or" 2 + | Porbint(Pint64,_) -> Pccall (int64_native_prim "caml_int64_or" 2 ~alloc:false) - | Pxorbint Pint64 -> Pccall (int64_native_prim "caml_int64_xor" 2 + | Pxorbint(Pint64,_) -> Pccall (int64_native_prim "caml_int64_xor" 2 ~alloc:false) - | Plslbint Pint64 -> Pccall (default_prim "caml_int64_shift_left") - | Plsrbint Pint64 -> Pccall (default_prim "caml_int64_shift_right_unsigned") - | Pasrbint Pint64 -> Pccall (default_prim "caml_int64_shift_right") + | Plslbint(Pint64,_) -> Pccall (default_prim "caml_int64_shift_left") + | Plsrbint(Pint64,_) -> Pccall (default_prim "caml_int64_shift_right_unsigned") + | Pasrbint(Pint64,_) -> Pccall (default_prim "caml_int64_shift_right") | Pbintcomp(Pint64, Lambda.Ceq) -> Pccall (default_prim "caml_equal") | Pbintcomp(Pint64, Lambda.Cne) -> Pccall (default_prim "caml_notequal") | Pbintcomp(Pint64, Lambda.Clt) -> Pccall (default_prim "caml_lessthan") @@ -1409,12 +1459,12 @@ let simplif_primitive_32bits : Pccall (default_prim ("caml_ba_get_" ^ Int.to_string n)) | Pbigarrayset(_unsafe, n, Pbigarray_int64, _layout) -> Pccall (default_prim ("caml_ba_set_" ^ Int.to_string n)) - | Pstring_load(Sixty_four, _) -> Pccall (default_prim "caml_string_get64") - | Pbytes_load(Sixty_four, _) -> Pccall (default_prim "caml_bytes_get64") + | Pstring_load(Sixty_four, _, _) -> Pccall (default_prim "caml_string_get64") + | Pbytes_load(Sixty_four, _, _) -> Pccall (default_prim "caml_bytes_get64") | Pbytes_set(Sixty_four, _) -> Pccall (default_prim "caml_bytes_set64") - | Pbigstring_load(Sixty_four,_) -> Pccall (default_prim "caml_ba_uint8_get64") + | Pbigstring_load(Sixty_four,_,_) -> Pccall (default_prim "caml_ba_uint8_get64") | Pbigstring_set(Sixty_four,_) -> Pccall (default_prim "caml_ba_uint8_set64") - | Pbbswap Pint64 -> Pccall (default_prim "caml_int64_bswap") + | Pbbswap (Pint64,_) -> Pccall (default_prim "caml_int64_bswap") | p -> p let simplif_primitive p : Clambda_primitives.primitive = @@ -1682,27 +1732,27 @@ let ptr_offset ptr offset dbg = then ptr else Cop(Caddv, [ptr; Cconst_int(offset * size_addr, dbg)], dbg) -let direct_apply lbl args dbg = - Cop(Capply typ_val, Cconst_symbol (lbl, dbg) :: args, dbg) +let direct_apply lbl args (pos, _mode) dbg = + Cop(Capply(typ_val, pos), Cconst_symbol (lbl, dbg) :: args, dbg) -let generic_apply mut clos args dbg = +let generic_apply mut clos args (pos, mode) dbg = match args with | [arg] -> bind "fun" clos (fun clos -> - Cop(Capply typ_val, [get_field_gen mut clos 0 dbg; arg; clos], + Cop(Capply(typ_val, pos), [get_field_gen mut clos 0 dbg; arg; clos], dbg)) | _ -> let arity = List.length args in let cargs = - Cconst_symbol(apply_function_sym arity, dbg) :: args @ [clos] + Cconst_symbol(apply_function_sym arity mode, dbg) :: args @ [clos] in - Cop(Capply typ_val, cargs, dbg) + Cop(Capply(typ_val, pos), cargs, dbg) -let send kind met obj args dbg = +let send kind met obj args akind dbg = let call_met obj args clos = (* met is never a simple expression, so it never gets turned into an Immutable load *) - generic_apply Asttypes.Mutable clos (obj :: args) dbg + generic_apply Asttypes.Mutable clos (obj :: args) akind dbg in bind "obj" obj (fun obj -> match (kind : Lambda.meth_kind), args with @@ -1710,7 +1760,7 @@ let send kind met obj args dbg = bind "met" (lookup_label obj met dbg) (call_met obj args) | Cached, cache :: pos :: args -> - call_cached_method obj met cache pos args dbg + call_cached_method obj met cache pos args akind dbg | _ -> bind "met" (lookup_tag obj met dbg) (call_met obj args)) @@ -1776,6 +1826,52 @@ let cache_public_method meths tag cache dbg = Csequence(Cop (Cstore (Word_int, Assignment), [cache; Cvar tagged], dbg), Cvar tagged))))) +let has_local_allocs e = + let rec loop = function + | Cregion e -> + (* Local allocations within a nested region do not affect this region, + except inside a Ctail block *) + loop_until_tail e + | Cop (Calloc Alloc_local, _, _) + | Cop ((Cextcall _ | Capply _), _, _) -> + raise Exit + | e -> + iter_shallow loop e + and loop_until_tail = function + | Ctail e -> loop e + | Cregion _ -> () + | e -> ignore (iter_shallow_tail loop_until_tail e) + in + match loop e with + | () -> false + | exception Exit -> true + +let remove_region_tail e = + let rec has_tail = function + | Ctail _ + | Cop(Capply(_, Rc_close_at_apply), _, _) -> raise Exit + | Cregion _ -> () + | e -> ignore (iter_shallow_tail has_tail e) + in + let rec remove_tail = function + | Ctail e -> e + | Cop(Capply(mach, Rc_close_at_apply), args, dbg) -> + Cop(Capply(mach, Rc_normal), args, dbg) + | Cregion _ as e -> e + | e -> + map_shallow_tail remove_tail e + in + match has_tail e with + | () -> e + | exception Exit -> remove_tail e + +let region e = + (* [Cregion e] is equivalent to [e] if [e] contains no local allocs *) + if has_local_allocs e then + Cregion e + else + remove_region_tail e + (* CR mshinwell: These will be filled in by later pull requests. *) let placeholder_dbg () = Debuginfo.none let placeholder_fun_dbg ~human_name:_ = Debuginfo.none @@ -1791,48 +1887,80 @@ let placeholder_fun_dbg ~human_name:_ = Debuginfo.none (app closN-1.code aN closN-1)))) *) -let apply_function_body arity = +let apply_function_body (arity, (mode : Lambda.alloc_mode)) = let dbg = placeholder_dbg in let arg = Array.make arity (V.create_local "arg") in for i = 1 to arity - 1 do arg.(i) <- V.create_local "arg" done; let clos = V.create_local "clos" in + (* In the slowpath, a region is necessary in case + the initial applications do local allocations *) + let region = + match mode with + | Alloc_heap -> Some (V.create_local "region") + | Alloc_local -> None + in let rec app_fun clos n = - if n = arity-1 then - Cop(Capply typ_val, - [get_field_gen Asttypes.Mutable (Cvar clos) 0 (dbg ()); - Cvar arg.(n); - Cvar clos], - dbg ()) - else begin + if n = arity-1 then begin + let app = + Cop(Capply(typ_val, Rc_normal), + [get_field_gen Asttypes.Mutable (Cvar clos) 0 (dbg ()); + Cvar arg.(n); + Cvar clos], + dbg ()) + in + match region with + | None -> app + | Some region -> + (* To preserve tail-call behaviour, we do a runtime check whether + anything has been allocated in [region]. If not, then we can do + a direct tail call without waiting to end the region afterwards. *) + Cifthenelse( + Cop(Ccmpi Ceq, [Cvar region; + Cop (Cbeginregion, [], dbg())], dbg ()), + dbg (), + app, + dbg (), + (let res = V.create_local "result" in + Clet(VP.create res, app, + Csequence(Cop(Cendregion, [Cvar region], dbg ()), Cvar res))), + dbg ()) + end else begin let newclos = V.create_local "clos" in Clet(VP.create newclos, - Cop(Capply typ_val, + Cop(Capply(typ_val, Rc_normal), [get_field_gen Asttypes.Mutable (Cvar clos) 0 (dbg ()); Cvar arg.(n); Cvar clos], dbg ()), app_fun newclos (n+1)) end in + let code = + match region with + | None -> app_fun clos 0 + | Some reg -> + Clet(VP.create reg, Cop(Cbeginregion, [], dbg ()), + app_fun clos 0) + in let args = Array.to_list arg in let all_args = args @ [clos] in (args, clos, - if arity = 1 then app_fun clos 0 else + if arity = 1 then code else Cifthenelse( Cop(Ccmpi Ceq, [Cop(Casr, [get_field_gen Asttypes.Mutable (Cvar clos) 1 (dbg()); Cconst_int(pos_arity_in_closinfo, dbg())], dbg()); Cconst_int(arity, dbg())], dbg()), dbg (), - Cop(Capply typ_val, + Cop(Capply(typ_val, Rc_normal), get_field_gen Asttypes.Mutable (Cvar clos) 2 (dbg ()) :: List.map (fun s -> Cvar s) all_args, dbg ()), dbg (), - app_fun clos 0, + code, dbg ())) -let send_function arity = +let send_function (arity, mode) = let dbg = placeholder_dbg in let cconst_int i = Cconst_int (i, dbg ()) in - let (args, clos', body) = apply_function_body (1+arity) in + let (args, clos', body) = apply_function_body (1+arity, mode) in let cache = V.create_local "cache" and obj = List.hd args and tag = V.create_local "tag" in @@ -1866,7 +1994,7 @@ let send_function arity = in let body = Clet(VP.create clos', clos, body) in let cache = cache in - let fun_name = "caml_send" ^ Int.to_string arity in + let fun_name = send_function_name arity mode in let fun_args = [obj, typ_val; tag, typ_int; cache, typ_val] @ List.map (fun id -> (id, typ_val)) (List.tl args) in @@ -1882,7 +2010,7 @@ let send_function arity = let apply_function arity = let (args, clos, body) = apply_function_body arity in let all_args = args @ [clos] in - let fun_name = "caml_apply" ^ Int.to_string arity in + let fun_name = apply_function_name arity in let fun_dbg = placeholder_fun_dbg ~human_name:fun_name in Cfunction {fun_name; @@ -1912,7 +2040,7 @@ let tuplify_function arity = {fun_name; fun_args = [VP.create arg, typ_val; VP.create clos, typ_val]; fun_body = - Cop(Capply typ_val, + Cop(Capply(typ_val, Rc_normal), get_field_gen Asttypes.Mutable (Cvar clos) 2 (dbg ()) :: access_components 0 @ [Cvar clos], (dbg ())); @@ -1949,13 +2077,13 @@ let tuplify_function arity = *) let max_arity_optimized = 15 -let final_curry_function arity = +let final_curry_function ~nlocal ~arity = let dbg = placeholder_dbg in let last_arg = V.create_local "arg" in let last_clos = V.create_local "clos" in let rec curry_fun args clos n = if n = 0 then - Cop(Capply typ_val, + Cop(Capply(typ_val, Rc_normal), get_field_gen Asttypes.Mutable (Cvar clos) 2 (dbg ()) :: args @ [Cvar last_arg; Cvar clos], dbg ()) @@ -1978,7 +2106,9 @@ let final_curry_function arity = newclos (n-1)) end in let fun_name = - "caml_curry" ^ Int.to_string arity ^ "_" ^ Int.to_string (arity-1) + "caml_curry" ^ Int.to_string arity + ^ (if nlocal > 0 then "L" ^ Int.to_string nlocal else "") + ^ "_" ^ Int.to_string (arity-1) in let fun_dbg = placeholder_fun_dbg ~human_name:fun_name in Cfunction @@ -1989,34 +2119,38 @@ let final_curry_function arity = fun_dbg; } -let rec intermediate_curry_functions arity num = +let rec intermediate_curry_functions ~nlocal ~arity num = let dbg = placeholder_dbg in if num = arity - 1 then - [final_curry_function arity] + [final_curry_function ~nlocal ~arity] else begin - let name1 = "caml_curry" ^ Int.to_string arity in + let name1 = "caml_curry" ^ Int.to_string arity + ^ (if nlocal > 0 then "L" ^ Int.to_string nlocal else "") in let name2 = if num = 0 then name1 else name1 ^ "_" ^ Int.to_string num in let arg = V.create_local "arg" and clos = V.create_local "clos" in let fun_dbg = placeholder_fun_dbg ~human_name:name2 in + let mode : Lambda.alloc_mode = + if num >= arity - nlocal then Alloc_local else Alloc_heap in + let curried n : Clambda.arity = (Curried {nlocal=min nlocal n}, n) in Cfunction {fun_name = name2; fun_args = [VP.create arg, typ_val; VP.create clos, typ_val]; fun_body = if arity - num > 2 && arity <= max_arity_optimized then - Cop(Calloc, - [alloc_closure_header 5 (dbg ()); + Cop(Calloc mode, + [alloc_closure_header ~mode 5 (dbg ()); Cconst_symbol(name1 ^ "_" ^ Int.to_string (num+1), dbg ()); - alloc_closure_info ~arity:(arity - num - 1) + alloc_closure_info ~arity:(curried (arity - num - 1)) ~startenv:3 (dbg ()); Cconst_symbol(name1 ^ "_" ^ Int.to_string (num+1) ^ "_app", dbg ()); Cvar arg; Cvar clos], dbg ()) else - Cop(Calloc, - [alloc_closure_header 4 (dbg ()); + Cop(Calloc mode, + [alloc_closure_header ~mode 4 (dbg ()); Cconst_symbol(name1 ^ "_" ^ Int.to_string (num+1), dbg ()); - alloc_closure_info ~arity:1 ~startenv:2 (dbg ()); + alloc_closure_info ~arity:(curried 1) ~startenv:2 (dbg ()); Cvar arg; Cvar clos], dbg ()); fun_codegen_options = []; @@ -2033,7 +2167,7 @@ let rec intermediate_curry_functions arity num = let direct_args = iter (num+2) in let rec iter i args clos = if i = 0 then - Cop(Capply typ_val, + Cop(Capply(typ_val, Rc_normal), (get_field_gen Asttypes.Mutable (Cvar clos) 2 (dbg ())) :: args @ [Cvar clos], dbg ()) @@ -2062,21 +2196,24 @@ let rec intermediate_curry_functions arity num = fun_dbg; } in - cf :: intermediate_curry_functions arity (num+1) + cf :: intermediate_curry_functions ~nlocal ~arity (num+1) else - intermediate_curry_functions arity (num+1)) + intermediate_curry_functions ~nlocal ~arity (num+1)) end -let curry_function arity = - assert(arity <> 0); - (* Functions with arity = 0 does not have a curry_function *) - if arity > 0 - then intermediate_curry_functions arity 0 - else [tuplify_function (-arity)] +let curry_function = function + | Lambda.Tupled, n -> + assert (n > 0); [tuplify_function n] + | Lambda.Curried {nlocal}, n -> + assert (n > 0); + intermediate_curry_functions ~nlocal ~arity:n 0 -module Int = Numbers.Int +module ApplyFnSet = + Set.Make (struct type t = int * Lambda.alloc_mode let compare = compare end) +module AritySet = + Set.Make (struct type t = Clambda.arity let compare = compare end) -let default_apply = Int.Set.add 2 (Int.Set.add 3 Int.Set.empty) +let default_apply = ApplyFnSet.of_list [2,Alloc_heap; 3,Alloc_heap] (* These apply funs are always present in the main program because the run-time system needs them (cf. runtime/.S) . *) @@ -2084,15 +2221,15 @@ let generic_functions shared units = let (apply,send,curry) = List.fold_left (fun (apply,send,curry) (ui : Cmx_format.unit_infos) -> - List.fold_right Int.Set.add ui.ui_apply_fun apply, - List.fold_right Int.Set.add ui.ui_send_fun send, - List.fold_right Int.Set.add ui.ui_curry_fun curry) - (Int.Set.empty,Int.Set.empty,Int.Set.empty) + List.fold_right ApplyFnSet.add ui.ui_apply_fun apply, + List.fold_right ApplyFnSet.add ui.ui_send_fun send, + List.fold_right AritySet.add ui.ui_curry_fun curry) + (ApplyFnSet.empty,ApplyFnSet.empty,AritySet.empty) units in - let apply = if shared then apply else Int.Set.union apply default_apply in - let accu = Int.Set.fold (fun n accu -> apply_function n :: accu) apply [] in - let accu = Int.Set.fold (fun n accu -> send_function n :: accu) send accu in - Int.Set.fold (fun n accu -> curry_function n @ accu) curry accu + let apply = if shared then apply else ApplyFnSet.union apply default_apply in + let accu = ApplyFnSet.fold (fun nr accu -> apply_function nr :: accu) apply [] in + let accu = ApplyFnSet.fold (fun nr accu -> send_function nr :: accu) send accu in + AritySet.fold (fun arity accu -> curry_function arity @ accu) curry accu (* Primitives *) @@ -2174,17 +2311,17 @@ type binary_primitive = expression -> expression -> Debuginfo.t -> expression (* Helper for compilation of initialization and assignment operations *) -type assignment_kind = Caml_modify | Caml_initialize | Simple +type assignment_kind = Caml_modify | Caml_modify_local | Simple let assignment_kind (ptr: Lambda.immediate_or_pointer) (init: Lambda.initialization_or_assignment) = match init, ptr with - | Local_assignment, _ -> assert false (* temporary *) | Assignment, Pointer -> Caml_modify - | Heap_initialization, Pointer -> Caml_initialize - | Assignment, Immediate - | Heap_initialization, Immediate + | Local_assignment, Pointer -> Caml_modify_local + | Heap_initialization, _ -> + Misc.fatal_error "Cmm_helpers: Lambda.Heap_initialization unsupported" + | (Assignment | Local_assignment), Immediate | Root_initialization, (Immediate | Pointer) -> Simple let setfield n ptr init arg1 arg2 dbg = @@ -2194,10 +2331,10 @@ let setfield n ptr init arg1 arg2 dbg = (Cop(Cextcall("caml_modify", typ_void, [], false), [field_address arg1 n dbg; arg2], dbg)) - | Caml_initialize -> + | Caml_modify_local -> return_unit dbg - (Cop(Cextcall("caml_initialize", typ_void, [], false), - [field_address arg1 n dbg; arg2], + (Cop(Cextcall("caml_modify_local", typ_void, [], false), + [arg1; Cconst_int (n,dbg); arg2], dbg)) | Simple -> return_unit dbg (set_field arg1 n arg2 init dbg) @@ -2285,16 +2422,16 @@ let stringref_safe arg1 arg2 dbg = Cop(Cload (Byte_unsigned, Mutable), [add_int str idx dbg], dbg))))) dbg -let string_load size unsafe arg1 arg2 dbg = - box_sized size dbg +let string_load size unsafe mode arg1 arg2 dbg = + box_sized size mode dbg (bind "index" (untag_int arg2 dbg) (fun idx -> bind "str" arg1 (fun str -> check_bound unsafe size dbg (string_length str dbg) idx (unaligned_load size str idx dbg)))) -let bigstring_load size unsafe arg1 arg2 dbg = - box_sized size dbg +let bigstring_load size unsafe mode arg1 arg2 dbg = + box_sized size mode dbg (bind "index" (untag_int arg2 dbg) (fun idx -> bind "ba" arg1 (fun ba -> bind "ba_data" @@ -2367,7 +2504,7 @@ let arrayref_safe kind arg1 arg2 dbg = (get_header_without_profinfo arr dbg) dbg; idx], int_array_ref arr idx dbg))) | Pfloatarray -> - box_float dbg ( + box_float dbg Alloc_heap ( bind "index" arg2 (fun idx -> bind "arr" arg1 (fun arr -> Csequence( @@ -2384,8 +2521,8 @@ let setfield_computed ptr init arg1 arg2 arg3 dbg = match assignment_kind ptr init with | Caml_modify -> return_unit dbg (addr_array_set arg1 arg2 arg3 dbg) - | Caml_initialize -> - return_unit dbg (addr_array_initialize arg1 arg2 arg3 dbg) + | Caml_modify_local -> + return_unit dbg (addr_array_set_local arg1 arg2 arg3 dbg) | Simple -> return_unit dbg (int_array_set arg1 arg2 arg3 dbg) @@ -2587,7 +2724,7 @@ let entry_point namelist = List.fold_right (fun name next -> let entry_sym = Compilenv.make_symbol ~unitname:name (Some "entry") in - Csequence(Cop(Capply typ_void, + Csequence(Cop(Capply(typ_void, Rc_normal), [cconst_symbol entry_sym], dbg ()), Csequence(incr_global_inited (), next))) namelist (cconst_int 1) in @@ -2695,7 +2832,7 @@ let fundecls_size fundecls = (fun (f : Clambda.ufunction) -> let indirect_call_code_pointer_size = match f.arity with - | 0 | 1 -> 0 + | Curried _, (0 | 1) -> 0 (* arity 1 does not need an indirect call handler. arity 0 cannot be indirect called *) | _ -> 1 @@ -2728,30 +2865,32 @@ let emit_constant_closure ((_, global_symb) as symb) fundecls clos_vars cont = let rec emit_others pos = function [] -> clos_vars @ cont | (f2 : Clambda.ufunction) :: rem -> - if f2.arity = 1 || f2.arity = 0 then + match f2.arity with + | Curried _, (0|1) as arity -> Cint(infix_header pos) :: (closure_symbol f2) @ Csymbol_address f2.label :: - Cint(closure_info ~arity:f2.arity ~startenv:(startenv - pos)) :: + Cint(closure_info ~arity ~startenv:(startenv - pos)) :: emit_others (pos + 3) rem - else + | arity -> Cint(infix_header pos) :: (closure_symbol f2) @ Csymbol_address(curry_function_sym f2.arity) :: - Cint(closure_info ~arity:f2.arity ~startenv:(startenv - pos)) :: + Cint(closure_info ~arity ~startenv:(startenv - pos)) :: Csymbol_address f2.label :: emit_others (pos + 4) rem in Cint(black_closure_header (fundecls_size fundecls + List.length clos_vars)) :: cdefine_symbol symb @ (closure_symbol f1) @ - if f1.arity = 1 || f1.arity = 0 then + match f1.arity with + | Curried _, (0|1) as arity -> Csymbol_address f1.label :: - Cint(closure_info ~arity:f1.arity ~startenv) :: + Cint(closure_info ~arity ~startenv) :: emit_others 3 remainder - else + | arity -> Csymbol_address(curry_function_sym f1.arity) :: - Cint(closure_info ~arity:f1.arity ~startenv) :: + Cint(closure_info ~arity ~startenv) :: Csymbol_address f1.label :: emit_others 4 remainder diff --git a/asmcomp/cmm_helpers.mli b/asmcomp/cmm_helpers.mli index debc84b4ffd..183ca1bba4d 100644 --- a/asmcomp/cmm_helpers.mli +++ b/asmcomp/cmm_helpers.mli @@ -53,30 +53,19 @@ val infix_header : int -> nativeint (** Header for a boxed float value *) val float_header : nativeint -(** Header for an unboxed float array of the given size *) -val floatarray_header : int -> nativeint - -(** Header for a string (or bytes) of the given length *) -val string_header : int -> nativeint - (** Boxed integer headers *) val boxedint32_header : nativeint val boxedint64_header : nativeint val boxedintnat_header : nativeint (** Closure info for a closure of given arity and distance to environment *) -val closure_info : arity:int -> startenv:int -> nativeint +val closure_info : arity:Clambda.arity -> startenv:int -> nativeint (** Wrappers *) -val alloc_float_header : Debuginfo.t -> expression -val alloc_floatarray_header : int -> Debuginfo.t -> expression -val alloc_closure_header : int -> Debuginfo.t -> expression val alloc_infix_header : int -> Debuginfo.t -> expression val alloc_closure_info : - arity:int -> startenv:int -> Debuginfo.t -> expression -val alloc_boxedint32_header : Debuginfo.t -> expression -val alloc_boxedint64_header : Debuginfo.t -> expression -val alloc_boxedintnat_header : Debuginfo.t -> expression + arity:(Lambda.function_kind * int) -> startenv:int -> + Debuginfo.t -> expression (** Integers *) @@ -173,7 +162,7 @@ val raise_symbol : Debuginfo.t -> string -> expression val test_bool : Debuginfo.t -> expression -> expression (** Float boxing and unboxing *) -val box_float : Debuginfo.t -> expression -> expression +val box_float : Debuginfo.t -> Lambda.alloc_mode -> expression -> expression val unbox_float : Debuginfo.t -> expression -> expression (** Complex number creation and access *) @@ -258,7 +247,7 @@ val unboxed_float_array_ref : val float_array_ref : expression -> expression -> Debuginfo.t -> expression val addr_array_set : expression -> expression -> expression -> Debuginfo.t -> expression -val addr_array_initialize : +val addr_array_set_local : expression -> expression -> expression -> Debuginfo.t -> expression val int_array_set : expression -> expression -> expression -> Debuginfo.t -> expression @@ -294,15 +283,17 @@ val lookup_label : expression -> expression -> Debuginfo.t -> expression - args : the additional arguments to the method call *) val call_cached_method : expression -> expression -> expression -> expression -> expression list -> - Debuginfo.t -> expression + Clambda.apply_kind -> Debuginfo.t -> expression (** Allocations *) (** Allocate a block of regular values with the given tag *) -val make_alloc : Debuginfo.t -> int -> expression list -> expression +val make_alloc : + mode:Lambda.alloc_mode -> Debuginfo.t -> int -> expression list -> expression (** Allocate a block of unboxed floats with the given tag *) -val make_float_alloc : Debuginfo.t -> int -> expression list -> expression +val make_float_alloc : + mode:Lambda.alloc_mode -> Debuginfo.t -> int -> expression list -> expression (** Bounds checking *) @@ -318,16 +309,18 @@ val check_bound : expression -> expression -> expression -> expression +(** Sys.opaque_identity *) +val opaque : expression -> Debuginfo.t -> expression + (** Generic application functions *) (** Get the symbol for the generic application with [n] arguments, and ensure its presence in the set of defined symbols *) -val apply_function_sym : int -> string +val apply_function_sym : int -> Lambda.alloc_mode -> string -(** If [n] is positive, get the symbol for the generic currying wrapper with - [n] arguments, and ensure its presence in the set of defined symbols. - Otherwise, do the same for the generic tuple wrapper with [-n] arguments. *) -val curry_function_sym : int -> string +(** Get the symbol for the generic currying or tuplifying wrapper with + [n] arguments, and ensure its presence in the set of defined symbols. *) +val curry_function_sym : Clambda.arity -> string (** Bigarrays *) @@ -371,7 +364,8 @@ val caml_int64_ops : string (** Box a given integer, without sharing of constants *) val box_int_gen : - Debuginfo.t -> Primitive.boxed_integer -> expression -> expression + Debuginfo.t -> Primitive.boxed_integer -> Lambda.alloc_mode -> + expression -> expression (** Unbox a given boxed integer *) val unbox_int : @@ -405,7 +399,7 @@ val unaligned_load : (** [box_sized size dbg exp] *) val box_sized : - Clambda_primitives.memory_access_size -> + Clambda_primitives.memory_access_size -> Lambda.alloc_mode -> Debuginfo.t -> expression -> expression (** Primitives *) @@ -447,8 +441,6 @@ val bswap16 : unary_primitive type binary_primitive = expression -> expression -> Debuginfo.t -> expression -type assignment_kind = Caml_modify | Caml_initialize | Simple - (** [setfield offset value_is_ptr init ptr value dbg] *) val setfield : int -> Lambda.immediate_or_pointer -> Lambda.initialization_or_assignment -> @@ -481,9 +473,11 @@ val stringref_safe : binary_primitive (** Load by chunk from string/bytes, bigstring. Args: string, index *) val string_load : - Clambda_primitives.memory_access_size -> Lambda.is_safe -> binary_primitive + Clambda_primitives.memory_access_size -> Lambda.is_safe -> + Lambda.alloc_mode -> binary_primitive val bigstring_load : - Clambda_primitives.memory_access_size -> Lambda.is_safe -> binary_primitive + Clambda_primitives.memory_access_size -> Lambda.is_safe -> + Lambda.alloc_mode -> binary_primitive (** Arrays *) @@ -553,7 +547,9 @@ val strmatch_compile : val ptr_offset : expression -> int -> Debuginfo.t -> expression (** Direct application of a function via a symbol *) -val direct_apply : string -> expression list -> Debuginfo.t -> expression +val direct_apply : + string -> expression list -> Clambda.apply_kind + -> Debuginfo.t -> expression (** Generic application of a function to one or several arguments. The mutable_flag argument annotates the loading of the code pointer @@ -561,8 +557,8 @@ val direct_apply : string -> expression list -> Debuginfo.t -> expression default, with a special case when the load is from (the first function of) the currently defined closure. *) val generic_apply : - Asttypes.mutable_flag -> - expression -> expression list -> Debuginfo.t -> expression + Asttypes.mutable_flag -> expression -> expression list + -> Clambda.apply_kind -> Debuginfo.t -> expression (** Method call : [send kind met obj args dbg] - [met] is a method identifier, which can be a hashed variant or an index @@ -572,8 +568,11 @@ val generic_apply : of any way for the frontend to generate any arguments other than the cache and cache position) *) val send : - Lambda.meth_kind -> expression -> expression -> expression list -> - Debuginfo.t -> expression + Lambda.meth_kind -> expression -> expression -> expression list + -> Clambda.apply_kind -> Debuginfo.t -> expression + +(** Construct [Cregion e], eliding some useless regions *) +val region : expression -> expression (** Generic Cmm fragments *) diff --git a/asmcomp/cmm_invariants.ml b/asmcomp/cmm_invariants.ml index df102df718f..cce1e267304 100644 --- a/asmcomp/cmm_invariants.ml +++ b/asmcomp/cmm_invariants.ml @@ -173,6 +173,8 @@ let rec check env (expr : Cmm.expression) = not reported as an error. *) check env body; check env handler + | Cregion e -> check env e + | Ctail e -> check env e let run ppf (fundecl : Cmm.fundecl) = let env = Env.init () in diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index 4992e980954..aa80de56a60 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -36,8 +36,8 @@ open Cmm_helpers (* Environments used for translation to Cmm. *) type boxed_number = - | Boxed_float of Debuginfo.t - | Boxed_integer of boxed_integer * Debuginfo.t + | Boxed_float of alloc_mode * Debuginfo.t + | Boxed_integer of boxed_integer * alloc_mode * Debuginfo.t type env = { unboxed_ids : (V.t * boxed_number) V.tbl; @@ -144,11 +144,11 @@ let rec expr_size env = function expr_size env body | Uprim(Pmakeblock _, args, _) -> RHS_block (List.length args) - | Uprim(Pmakearray((Paddrarray | Pintarray), _), args, _) -> + | Uprim(Pmakearray((Paddrarray | Pintarray), _, _), args, _) -> RHS_block (List.length args) - | Uprim(Pmakearray(Pfloatarray, _), args, _) -> + | Uprim(Pmakearray(Pfloatarray, _, _), args, _) -> RHS_floatblock (List.length args) - | Uprim(Pmakearray(Pgenarray, _), _, _) -> + | Uprim(Pmakearray(Pgenarray, _, _), _, _) -> (* Pgenarray is excluded from recursive bindings by the check in Translcore.check_recursive_lambda *) RHS_nonrec @@ -171,6 +171,10 @@ let rec expr_size env = function | RHS_block blocksize -> RHS_infix { blocksize; offset } | RHS_nonrec -> RHS_nonrec | _ -> assert false) + | Uregion exp -> + expr_size env exp + | Utail _ -> + Misc.fatal_error "Utail in non-tail position" | _ -> RHS_nonrec (* Translate structured constants to Cmm data items *) @@ -227,7 +231,7 @@ let box_int_constant sym bi n = let n = Int64.of_nativeint n in emit_int64_constant (sym, Local) n [] -let box_int dbg bi arg = +let box_int dbg bi mode arg = match arg with | Cconst_int (n, _) -> let sym = Compilenv.new_const_symbol () in @@ -240,13 +244,13 @@ let box_int dbg bi arg = Cmmgen_state.add_data_items data_items; Cconst_symbol (sym, dbg) | _ -> - box_int_gen dbg bi arg + box_int_gen dbg bi mode arg (* Boxed numbers *) let typ_of_boxed_number = function | Boxed_float _ -> Cmm.typ_float - | Boxed_integer (Pint64, _) when size_int = 4 -> [|Int;Int|] + | Boxed_integer (Pint64, _,_) when size_int = 4 -> [|Int;Int|] | Boxed_integer _ -> Cmm.typ_int let equal_unboxed_integer ui1 ui2 = @@ -259,24 +263,24 @@ let equal_unboxed_integer ui1 ui2 = let equal_boxed_number bn1 bn2 = match bn1, bn2 with | Boxed_float _, Boxed_float _ -> true - | Boxed_integer(ui1, _), Boxed_integer(ui2, _) -> - equal_unboxed_integer ui1 ui2 + | Boxed_integer(ui1, m, _), Boxed_integer(ui2, m', _) -> + equal_unboxed_integer ui1 ui2 && Lambda.eq_mode m m' | _, _ -> false let box_number bn arg = match bn with - | Boxed_float dbg -> box_float dbg arg - | Boxed_integer (bi, dbg) -> box_int dbg bi arg + | Boxed_float (m, dbg) -> box_float dbg m arg + | Boxed_integer (bi, m, dbg) -> box_int dbg bi m arg (* Returns the unboxed representation of a boxed float or integer. For Pint32 on 64-bit archs, the high 32 bits of the result are undefined. *) let unbox_number dbg bn arg = match bn with - | Boxed_float dbg -> + | Boxed_float (_, dbg) -> unbox_float dbg arg - | Boxed_integer (Pint32, _) -> + | Boxed_integer (Pint32, _, _) -> low_32 dbg (unbox_int dbg Pint32 arg) - | Boxed_integer (bi, _) -> + | Boxed_integer (bi, _, _) -> unbox_int dbg bi arg (* Auxiliary functions for optimizing "let" of boxed numbers (floats and @@ -314,36 +318,36 @@ let is_unboxed_number_cmm ~strict cmm = r := join_unboxed_number_kind ~strict !r k in let rec aux = function - | Cop(Calloc, [Cconst_natint (hdr, _); _], dbg) + | Cop(Calloc mode, [Cconst_natint (hdr, _); _], dbg) when Nativeint.equal hdr float_header -> - notify (Boxed (Boxed_float dbg, false)) - | Cop(Calloc, [Cconst_natint (hdr, _); Cconst_symbol (ops, _); _], dbg) -> + notify (Boxed (Boxed_float (mode,dbg), false)) + | Cop(Calloc mode, [Cconst_natint (hdr, _); Cconst_symbol (ops, _); _], dbg) -> if Nativeint.equal hdr boxedintnat_header && String.equal ops caml_nativeint_ops then - notify (Boxed (Boxed_integer (Pnativeint, dbg), false)) + notify (Boxed (Boxed_integer (Pnativeint, mode, dbg), false)) else if Nativeint.equal hdr boxedint32_header && String.equal ops caml_int32_ops then - notify (Boxed (Boxed_integer (Pint32, dbg), false)) + notify (Boxed (Boxed_integer (Pint32, mode, dbg), false)) else if Nativeint.equal hdr boxedint64_header && String.equal ops caml_int64_ops then - notify (Boxed (Boxed_integer (Pint64, dbg), false)) + notify (Boxed (Boxed_integer (Pint64, mode, dbg), false)) else notify No_unboxing | Cconst_symbol (s, _) -> begin match Cmmgen_state.structured_constant_of_sym s with | Some (Uconst_float _) -> - notify (Boxed (Boxed_float Debuginfo.none, true)) + notify (Boxed (Boxed_float (Alloc_heap, Debuginfo.none), true)) | Some (Uconst_nativeint _) -> - notify (Boxed (Boxed_integer (Pnativeint, Debuginfo.none), true)) + notify (Boxed (Boxed_integer (Pnativeint, Alloc_heap, Debuginfo.none), true)) | Some (Uconst_int32 _) -> - notify (Boxed (Boxed_integer (Pint32, Debuginfo.none), true)) + notify (Boxed (Boxed_integer (Pint32, Alloc_heap, Debuginfo.none), true)) | Some (Uconst_int64 _) -> - notify (Boxed (Boxed_integer (Pint64, Debuginfo.none), true)) + notify (Boxed (Boxed_integer (Pint64, Alloc_heap, Debuginfo.none), true)) | _ -> notify No_unboxing end @@ -377,6 +381,16 @@ let rec transl env e = Cconst_symbol (sym, dbg) | Uclosure(fundecls, clos_vars) -> let startenv = fundecls_size fundecls in + let mode = + Option.get @@ + List.fold_left (fun s { mode; dbg; _ } -> + match s with + | None -> Some mode + | Some m' -> + if not (Lambda.eq_mode mode m') then + Misc.fatal_errorf "Inconsistent modes in let rec at %s" + (Debuginfo.to_string dbg); + s) None fundecls in let rec transl_fundecls pos = function [] -> List.map (transl env) clos_vars @@ -384,14 +398,15 @@ let rec transl env e = Cmmgen_state.add_function f; let dbg = f.dbg in let without_header = - if f.arity = 1 || f.arity = 0 then + match f.arity with + | Curried _, (1|0) as arity -> Cconst_symbol (f.label, dbg) :: - alloc_closure_info ~arity:f.arity + alloc_closure_info ~arity ~startenv:(startenv - pos) dbg :: transl_fundecls (pos + 3) rem - else + | arity -> Cconst_symbol (curry_function_sym f.arity, dbg) :: - alloc_closure_info ~arity:f.arity + alloc_closure_info ~arity ~startenv:(startenv - pos) dbg :: Cconst_symbol (f.label, dbg) :: transl_fundecls (pos + 4) rem @@ -405,28 +420,28 @@ let rec transl env e = | [] -> Debuginfo.none | fundecl::_ -> fundecl.dbg in - make_alloc dbg Obj.closure_tag (transl_fundecls 0 fundecls) + make_alloc ~mode dbg Obj.closure_tag (transl_fundecls 0 fundecls) | Uoffset(arg, offset) -> (* produces a valid Caml value, pointing just after an infix header *) let ptr = transl env arg in let dbg = Debuginfo.none in ptr_offset ptr offset dbg - | Udirect_apply(handler_code_sym, args, Some { name; }, dbg) -> + | Udirect_apply(handler_code_sym, args, Some { name; }, _, dbg) -> let args = List.map (transl env) args in return_unit dbg (Cop(Cprobe { name; handler_code_sym; }, args, dbg)) - | Udirect_apply(lbl, args, None, dbg) -> + | Udirect_apply(lbl, args, None, kind, dbg) -> let args = List.map (transl env) args in - direct_apply lbl args dbg - | Ugeneric_apply(clos, args, dbg) -> + direct_apply lbl args kind dbg + | Ugeneric_apply(clos, args, kind, dbg) -> let clos = transl env clos in let args = List.map (transl env) args in - generic_apply (mut_from_env env clos) clos args dbg - | Usend(kind, met, obj, args, dbg) -> + generic_apply (mut_from_env env clos) clos args kind dbg + | Usend(kind, met, obj, args, pos, dbg) -> let met = transl env met in let obj = transl env obj in let args = List.map (transl env) args in - send kind met obj args dbg + send kind met obj args pos dbg | Ulet(str, kind, id, exp, body) -> transl_let env str kind id exp body | Uphantom_let (var, defining_expr, body) -> @@ -463,11 +478,11 @@ let rec transl env e = Cconst_symbol (sym, dbg) | (Pmakeblock _, []) -> assert false - | (Pmakeblock(tag, _mut, _kind), args) -> - make_alloc dbg tag (List.map (transl env) args) + | (Pmakeblock(tag, _mut, _kind, mode), args) -> + make_alloc ~mode dbg tag (List.map (transl env) args) | (Pccall prim, args) -> transl_ccall env prim args dbg - | (Pduparray (kind, _), [Uprim (Pmakearray (kind', _), args, _dbg)]) -> + | (Pduparray (kind, _), [Uprim (Pmakearray (kind', _, _), args, _dbg)]) -> (* We arrive here in two cases: 1. When using Closure, all the time. 2. When using Flambda, if a float array longer than @@ -479,7 +494,7 @@ let rec transl env e = state of [Translcore], we will in fact only get here with [Pfloatarray]s. *) assert (kind = kind'); - transl_make_array dbg env kind args + transl_make_array dbg env kind Alloc_heap args | (Pduparray _, [arg]) -> let prim_obj_dup = Primitive.simple ~name:"caml_obj_dup" ~arity:1 ~alloc:true @@ -487,17 +502,19 @@ let rec transl env e = transl_ccall env prim_obj_dup [arg] dbg | (Pmakearray _, []) -> Misc.fatal_error "Pmakearray is not allowed for an empty array" - | (Pmakearray (kind, _), args) -> transl_make_array dbg env kind args + | (Pmakearray (kind, _, mode), args) -> + transl_make_array dbg env kind mode args | (Pbigarrayref(unsafe, _num_dims, elt_kind, layout), arg1 :: argl) -> let elt = bigarray_get unsafe elt_kind layout (transl env arg1) (List.map (transl env) argl) dbg in begin match elt_kind with - Pbigarray_float32 | Pbigarray_float64 -> box_float dbg elt + (* TODO: local allocation of bigarray elements *) + Pbigarray_float32 | Pbigarray_float64 -> box_float dbg Alloc_heap elt | Pbigarray_complex32 | Pbigarray_complex64 -> elt - | Pbigarray_int32 -> box_int dbg Pint32 elt - | Pbigarray_int64 -> box_int dbg Pint64 elt - | Pbigarray_native_int -> box_int dbg Pnativeint elt + | Pbigarray_int32 -> box_int dbg Pint32 Alloc_heap elt + | Pbigarray_int64 -> box_int dbg Pint64 Alloc_heap elt + | Pbigarray_native_int -> box_int dbg Pnativeint Alloc_heap elt | Pbigarray_caml_int -> tag_int elt dbg | Pbigarray_sint8 | Pbigarray_uint8 | Pbigarray_sint16 | Pbigarray_uint16 -> tag_int elt dbg @@ -546,9 +563,9 @@ let rec transl env e = | ((Pfield_computed|Psequand | Psequor | Pnot | Pnegint | Paddint | Psubint | Pmulint | Pandint | Porint | Pxorint | Plslint - | Plsrint | Pasrint | Pintoffloat | Pfloatofint - | Pnegfloat | Pabsfloat | Paddfloat | Psubfloat - | Pmulfloat | Pdivfloat | Pstringlength | Pstringrefu + | Plsrint | Pasrint | Pintoffloat | Pfloatofint _ + | Pnegfloat _ | Pabsfloat _ | Paddfloat _ | Psubfloat _ + | Pmulfloat _ | Pdivfloat _ | Pstringlength | Pstringrefu | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets | Pisint | Pisout | Pbswap16 | Pint_as_pointer | Popaque | Pfield _ @@ -558,7 +575,7 @@ let rec transl env e = | Pcompare_ints | Pcompare_floats | Pcompare_bints _ | Poffsetref _ | Pfloatcomp _ | Parraylength _ | Parrayrefu _ | Parraysetu _ | Parrayrefs _ | Parraysets _ - | Pbintofint _ | Pintofbint _ | Pcvtbint (_, _) | Pnegbint _ + | Pbintofint _ | Pintofbint _ | Pcvtbint _ | Pnegbint _ | Paddbint _ | Psubbint _ | Pmulbint _ | Pdivbint _ | Pmodbint _ | Pandbint _ | Porbint _ | Pxorbint _ | Plslbint _ | Plsrbint _ | Pasrbint _ | Pbintcomp (_, _) | Pstring_load _ | Pbytes_load _ @@ -679,6 +696,10 @@ let rec transl env e = | Uunreachable -> let dbg = Debuginfo.none in Cop(Cload (Word_int, Mutable), [Cconst_int (0, dbg)], dbg) + | Uregion e -> + region (transl env e) + | Utail e -> + Ctail (transl env e) and transl_catch env nfail ids body handler dbg = let ids = List.map (fun (id, kind) -> (id, kind, ref No_result)) ids in @@ -733,32 +754,37 @@ and transl_catch env nfail ids body handler dbg = in ccatch (new_nfail, ids, body, transl new_env handler, dbg) -and transl_make_array dbg env kind args = +and transl_make_array dbg env kind mode args = match kind with | Pgenarray -> - Cop(Cextcall("caml_make_array", typ_val, [], true), - [make_alloc dbg 0 (List.map (transl env) args)], dbg) + let prim = + match (mode : Lambda.alloc_mode) with + | Alloc_heap -> "caml_make_array" + | Alloc_local -> "caml_make_array_local" + in + Cop(Cextcall(prim, typ_val, [], true), + [make_alloc ~mode dbg 0 (List.map (transl env) args)], dbg) | Paddrarray | Pintarray -> - make_alloc dbg 0 (List.map (transl env) args) + make_alloc ~mode dbg 0 (List.map (transl env) args) | Pfloatarray -> - make_float_alloc dbg Obj.double_array_tag + make_float_alloc ~mode dbg Obj.double_array_tag (List.map (transl_unbox_float dbg env) args) and transl_ccall env prim args dbg = let transl_arg native_repr arg = match native_repr with - | _, Same_as_ocaml_repr -> + | Same_as_ocaml_repr -> (XInt, transl env arg) - | _, Unboxed_float -> + | Unboxed_float -> (XFloat, transl_unbox_float dbg env arg) - | _, Unboxed_integer bi -> + | Unboxed_integer bi -> let xty = match bi with | Pnativeint -> XInt | Pint32 -> XInt32 | Pint64 -> XInt64 in (xty, transl_unbox_int dbg env bi arg) - | _, Untagged_int -> + | Untagged_int -> (XInt, untag_int (transl env arg) dbg) in let rec transl_args native_repr_args args = @@ -769,7 +795,7 @@ and transl_ccall env prim args dbg = (List.map (fun _ -> XInt) args, List.map (transl env) args) | _, [] -> assert false - | native_repr :: native_repr_args, arg :: args -> + | (_, native_repr) :: native_repr_args, arg :: args -> let (ty1, arg') = transl_arg native_repr arg in let (tys, args') = transl_args native_repr_args args in (ty1 :: tys, arg' :: args') @@ -777,10 +803,11 @@ and transl_ccall env prim args dbg = let typ_res, wrap_result = match prim.prim_native_repr_res with | _, Same_as_ocaml_repr -> (typ_val, fun x -> x) - | _, Unboxed_float -> (typ_float, box_float dbg) + (* TODO: Allow Alloc_local on suitably typed C stubs *) + | _, Unboxed_float -> (typ_float, box_float dbg Alloc_heap) | _, Unboxed_integer Pint64 when size_int = 4 -> - ([|Int; Int|], box_int dbg Pint64) - | _, Unboxed_integer bi -> (typ_int, box_int dbg bi) + ([|Int; Int|], box_int dbg Pint64 Alloc_heap) + | _, Unboxed_integer bi -> (typ_int, box_int dbg bi Alloc_heap) | _, Untagged_int -> (typ_int, (fun i -> tag_int i dbg)) in let typ_args, args = transl_args prim.prim_native_repr_args args in @@ -792,13 +819,13 @@ and transl_prim_1 env p arg dbg = match p with (* Generic operations *) Popaque -> - transl env arg + opaque (transl env arg) dbg (* Heap operations *) | Pfield n -> get_field env (transl env arg) n dbg - | Pfloatfield n -> + | Pfloatfield (n,mode) -> let ptr = transl env arg in - box_float dbg (floatfield n ptr dbg) + box_float dbg mode (floatfield n ptr dbg) | Pint_as_pointer -> int_as_pointer (transl env arg) dbg (* Exceptions *) @@ -812,14 +839,14 @@ and transl_prim_1 env p arg dbg = | Poffsetref n -> offsetref n (transl env arg) dbg (* Floating-point operations *) - | Pfloatofint -> - box_float dbg (Cop(Cfloatofint, [untag_int(transl env arg) dbg], dbg)) + | Pfloatofint m -> + box_float dbg m (Cop(Cfloatofint, [untag_int(transl env arg) dbg], dbg)) | Pintoffloat -> tag_int(Cop(Cintoffloat, [transl_unbox_float dbg env arg], dbg)) dbg - | Pnegfloat -> - box_float dbg (Cop(Cnegf, [transl_unbox_float dbg env arg], dbg)) - | Pabsfloat -> - box_float dbg (Cop(Cabsf, [transl_unbox_float dbg env arg], dbg)) + | Pnegfloat m -> + box_float dbg m (Cop(Cnegf, [transl_unbox_float dbg env arg], dbg)) + | Pabsfloat m -> + box_float dbg m (Cop(Cabsf, [transl_unbox_float dbg env arg], dbg)) (* String operations *) | Pstringlength | Pbyteslength -> tag_int(string_length (transl env arg) dbg) dbg @@ -836,30 +863,30 @@ and transl_prim_1 env p arg dbg = | Pisint -> tag_int(Cop(Cand, [transl env arg; Cconst_int (1, dbg)], dbg)) dbg (* Boxed integers *) - | Pbintofint bi -> - box_int dbg bi (untag_int (transl env arg) dbg) + | Pbintofint (bi, m) -> + box_int dbg bi m (untag_int (transl env arg) dbg) | Pintofbint bi -> tag_int (transl_unbox_int dbg env bi arg) dbg - | Pcvtbint(bi1, bi2) -> - box_int dbg bi2 (transl_unbox_int dbg env bi1 arg) - | Pnegbint bi -> - box_int dbg bi + | Pcvtbint(bi1, bi2, m) -> + box_int dbg bi2 m (transl_unbox_int dbg env bi1 arg) + | Pnegbint (bi, m) -> + box_int dbg bi m (Cop(Csubi, [Cconst_int (0, dbg); transl_unbox_int dbg env bi arg], dbg)) - | Pbbswap bi -> - box_int dbg bi (bbswap bi (transl_unbox_int dbg env bi arg) dbg) + | Pbbswap (bi, m) -> + box_int dbg bi m (bbswap bi (transl_unbox_int dbg env bi arg) dbg) | Pbswap16 -> tag_int (bswap16 (ignore_high_bit_int (untag_int (transl env arg) dbg)) dbg) dbg | (Pfield_computed | Psequand | Psequor | Paddint | Psubint | Pmulint | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint - | Paddfloat | Psubfloat | Pmulfloat | Pdivfloat + | Paddfloat _ | Psubfloat _ | Pmulfloat _ | Pdivfloat _ | Pstringrefu | Pstringrefs | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets | Pisout | Pread_symbol _ - | Pmakeblock (_, _, _) | Psetfield (_, _, _) | Psetfield_computed (_, _) + | Pmakeblock (_, _, _, _) | Psetfield (_, _, _) | Psetfield_computed (_, _) | Psetfloatfield (_, _) | Pduprecord (_, _) | Pccall _ | Pdivint _ - | Pmodint _ | Pintcomp _ | Pfloatcomp _ | Pmakearray (_, _) + | Pmodint _ | Pintcomp _ | Pfloatcomp _ | Pmakearray (_, _, _) | Pcompare_ints | Pcompare_floats | Pcompare_bints _ | Pduparray (_, _) | Parrayrefu _ | Parraysetu _ | Parrayrefs _ | Parraysets _ | Paddbint _ | Psubbint _ | Pmulbint _ @@ -941,23 +968,23 @@ and transl_prim_2 env p arg1 arg2 dbg = | Pisout -> transl_isout (transl env arg1) (transl env arg2) dbg (* Float operations *) - | Paddfloat -> - box_float dbg (Cop(Caddf, + | Paddfloat m -> + box_float dbg m (Cop(Caddf, [transl_unbox_float dbg env arg1; transl_unbox_float dbg env arg2], dbg)) - | Psubfloat -> - box_float dbg (Cop(Csubf, + | Psubfloat m -> + box_float dbg m (Cop(Csubf, [transl_unbox_float dbg env arg1; transl_unbox_float dbg env arg2], dbg)) - | Pmulfloat -> - box_float dbg (Cop(Cmulf, + | Pmulfloat m -> + box_float dbg m (Cop(Cmulf, [transl_unbox_float dbg env arg1; transl_unbox_float dbg env arg2], dbg)) - | Pdivfloat -> - box_float dbg (Cop(Cdivf, + | Pdivfloat m -> + box_float dbg m (Cop(Cdivf, [transl_unbox_float dbg env arg1; transl_unbox_float dbg env arg2], dbg)) @@ -972,10 +999,10 @@ and transl_prim_2 env p arg1 arg2 dbg = stringref_unsafe (transl env arg1) (transl env arg2) dbg | Pstringrefs | Pbytesrefs -> stringref_safe (transl env arg1) (transl env arg2) dbg - | Pstring_load(size, unsafe) | Pbytes_load(size, unsafe) -> - string_load size unsafe (transl env arg1) (transl env arg2) dbg - | Pbigstring_load(size, unsafe) -> - bigstring_load size unsafe (transl env arg1) (transl env arg2) dbg + | Pstring_load(size, unsafe, mode) | Pbytes_load(size, unsafe, mode) -> + string_load size unsafe mode (transl env arg1) (transl env arg2) dbg + | Pbigstring_load(size, unsafe, mode) -> + bigstring_load size unsafe mode (transl env arg1) (transl env arg2) dbg (* Array operations *) | Parrayrefu kind -> @@ -984,64 +1011,65 @@ and transl_prim_2 env p arg1 arg2 dbg = arrayref_safe kind (transl env arg1) (transl env arg2) dbg (* Boxed integers *) - | Paddbint bi -> - box_int dbg bi (add_int + | Paddbint (bi, mode) -> + box_int dbg bi mode (add_int (transl_unbox_int_low dbg env bi arg1) (transl_unbox_int_low dbg env bi arg2) dbg) - | Psubbint bi -> - box_int dbg bi (sub_int + | Psubbint (bi, mode) -> + box_int dbg bi mode (sub_int (transl_unbox_int_low dbg env bi arg1) (transl_unbox_int_low dbg env bi arg2) dbg) - | Pmulbint bi -> - box_int dbg bi (mul_int + | Pmulbint (bi, mode) -> + box_int dbg bi mode (mul_int (transl_unbox_int_low dbg env bi arg1) (transl_unbox_int_low dbg env bi arg2) dbg) - | Pdivbint { size = bi; is_safe } -> - box_int dbg bi (safe_div_bi is_safe + | Pdivbint { size = bi; is_safe; mode } -> + box_int dbg bi mode (safe_div_bi is_safe (transl_unbox_int dbg env bi arg1) (transl_unbox_int dbg env bi arg2) bi dbg) - | Pmodbint { size = bi; is_safe } -> - box_int dbg bi (safe_mod_bi is_safe + | Pmodbint { size = bi; is_safe; mode } -> + box_int dbg bi mode (safe_mod_bi is_safe (transl_unbox_int dbg env bi arg1) (transl_unbox_int dbg env bi arg2) bi dbg) - | Pandbint bi -> - box_int dbg bi (Cop(Cand, + | Pandbint (bi,mode) -> + box_int dbg bi mode (Cop(Cand, [transl_unbox_int_low dbg env bi arg1; transl_unbox_int_low dbg env bi arg2], dbg)) - | Porbint bi -> - box_int dbg bi (Cop(Cor, + | Porbint (bi, mode) -> + box_int dbg bi mode (Cop(Cor, [transl_unbox_int_low dbg env bi arg1; transl_unbox_int_low dbg env bi arg2], dbg)) - | Pxorbint bi -> - box_int dbg bi (Cop(Cxor, + | Pxorbint (bi, mode) -> + box_int dbg bi mode (Cop(Cxor, [transl_unbox_int_low dbg env bi arg1; transl_unbox_int_low dbg env bi arg2], dbg)) - | Plslbint bi -> - box_int dbg bi (lsl_int + | Plslbint (bi, mode) -> + box_int dbg bi mode (lsl_int (transl_unbox_int_low dbg env bi arg1) (untag_int(transl env arg2) dbg) dbg) - | Plsrbint bi -> - box_int dbg bi (lsr_int + | Plsrbint (bi, mode) -> + box_int dbg bi mode (lsr_int (make_unsigned_int bi (transl_unbox_int dbg env bi arg1) dbg) (untag_int(transl env arg2) dbg) dbg) - | Pasrbint bi -> - box_int dbg bi (asr_int + | Pasrbint (bi, mode) -> + box_int dbg bi mode (asr_int (transl_unbox_int dbg env bi arg1) (untag_int(transl env arg2) dbg) dbg) | Pbintcomp(bi, cmp) -> tag_int (Cop(Ccmpi cmp, [transl_unbox_int dbg env bi arg1; transl_unbox_int dbg env bi arg2], dbg)) dbg - | Pnot | Pnegint | Pintoffloat | Pfloatofint | Pnegfloat - | Pabsfloat | Pstringlength | Pbyteslength | Pbytessetu | Pbytessets + | Pnot | Pnegint | Pintoffloat | Pfloatofint _ | Pnegfloat _ + | Pabsfloat _ | Pstringlength | Pbyteslength | Pbytessetu | Pbytessets | Pisint | Pbswap16 | Pint_as_pointer | Popaque | Pread_symbol _ - | Pmakeblock (_, _, _) | Pfield _ | Psetfield_computed (_, _) | Pfloatfield _ + | Pmakeblock (_, _, _, _) | Pfield _ | Psetfield_computed (_, _) + | Pfloatfield _ | Pduprecord (_, _) | Pccall _ | Praise _ | Poffsetint _ | Poffsetref _ - | Pmakearray (_, _) | Pduparray (_, _) | Parraylength _ | Parraysetu _ - | Parraysets _ | Pbintofint _ | Pintofbint _ | Pcvtbint (_, _) + | Pmakearray (_, _, _) | Pduparray (_, _) | Parraylength _ | Parraysetu _ + | Parraysets _ | Pbintofint _ | Pintofbint _ | Pcvtbint (_, _, _) | Pnegbint _ | Pbigarrayref (_, _, _, _) | Pbigarrayset (_, _, _, _) | Pbigarraydim _ | Pbytes_set _ | Pbigstring_set _ | Pbbswap _ | Pprobe_is_enabled _ @@ -1089,16 +1117,17 @@ and transl_prim_3 env p arg1 arg2 arg3 dbg = | Pfield_computed | Psequand | Psequor | Pnot | Pnegint | Paddint | Psubint | Pmulint | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint - | Pintoffloat | Pfloatofint | Pnegfloat | Pabsfloat | Paddfloat | Psubfloat - | Pmulfloat | Pdivfloat | Pstringlength | Pstringrefu | Pstringrefs + | Pintoffloat | Pfloatofint _ | Pnegfloat _ | Pabsfloat _ | Paddfloat _ | Psubfloat _ + | Pmulfloat _ | Pdivfloat _ | Pstringlength | Pstringrefu | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytesrefs | Pisint | Pisout - | Pbswap16 | Pint_as_pointer | Popaque | Pread_symbol _ | Pmakeblock (_, _, _) + | Pbswap16 | Pint_as_pointer | Popaque | Pread_symbol _ + | Pmakeblock (_, _, _, _) | Pfield _ | Psetfield (_, _, _) | Pfloatfield _ | Psetfloatfield (_, _) | Pduprecord (_, _) | Pccall _ | Praise _ | Pdivint _ | Pmodint _ | Pintcomp _ | Pcompare_ints | Pcompare_floats | Pcompare_bints _ - | Poffsetint _ | Poffsetref _ | Pfloatcomp _ | Pmakearray (_, _) + | Poffsetint _ | Poffsetref _ | Pfloatcomp _ | Pmakearray (_, _, _) | Pduparray (_, _) | Parraylength _ | Parrayrefu _ | Parrayrefs _ - | Pbintofint _ | Pintofbint _ | Pcvtbint (_, _) | Pnegbint _ | Paddbint _ + | Pbintofint _ | Pintofbint _ | Pcvtbint _ | Pnegbint _ | Paddbint _ | Psubbint _ | Pmulbint _ | Pdivbint _ | Pmodbint _ | Pandbint _ | Porbint _ | Pxorbint _ | Plslbint _ | Plsrbint _ | Pasrbint _ | Pbintcomp (_, _) | Pbigarrayref (_, _, _, _) | Pbigarrayset (_, _, _, _) | Pbigarraydim _ @@ -1134,12 +1163,15 @@ and transl_let env str kind id exp body = reference) and it contains a type of unboxable numbers, then force unboxing. Indeed, if not boxed, each assignment to the variable might require some boxing, but such local references are often - used in loops and we really want to avoid repeated boxing. *) + used in loops and we really want to avoid repeated boxing. + + We conservatively mark these as Alloc_heap, although with more tracking + of allocation mode it may be possible to mark some Alloc_local *) match str, kind with | Mutable, Pfloatval -> - Boxed (Boxed_float dbg, false) + Boxed (Boxed_float (Alloc_heap, dbg), false) | Mutable, Pboxedintval bi -> - Boxed (Boxed_integer (bi, dbg), false) + Boxed (Boxed_integer (bi, Alloc_heap, dbg), false) | _, (Pfloatval | Pboxedintval _) -> (* It would be safe to always unbox in this case, but we do it only if this indeed allows us to get rid of diff --git a/asmcomp/comballoc.ml b/asmcomp/comballoc.ml index 33b5e26ae51..1d1a6585295 100644 --- a/asmcomp/comballoc.ml +++ b/asmcomp/comballoc.ml @@ -20,7 +20,8 @@ open Mach type pending_alloc = { reg: Reg.t; (* register holding the result of the last allocation *) dbginfos: Debuginfo.alloc_dbginfo; (* debug info for each pending alloc *) - totalsz: int } (* amount to be allocated in this block *) + totalsz: int; (* amount to be allocated in this block *) + mode: Lambda.alloc_mode } (* heap or stack allocation *) type allocation_state = No_alloc @@ -30,16 +31,19 @@ let rec combine i allocstate = match i.desc with Iend | Ireturn | Iexit _ | Iraise _ -> (i, allocstate) - | Iop(Ialloc { bytes = sz; dbginfo; _ }) -> + | Iop(Ialloc { bytes = sz; dbginfo; mode }) -> assert (List.length dbginfo = 1); begin match allocstate with - | Pending_alloc {reg; dbginfos; totalsz} - when totalsz + sz <= (Config.max_young_wosize + 1) * Arch.size_addr -> + | Pending_alloc {reg; dbginfos; totalsz; mode = prev_mode} + when (mode = prev_mode) && + ((totalsz + sz <= (Config.max_young_wosize + 1) * Arch.size_addr) + || mode = Lambda.Alloc_local) -> let (next, state) = combine i.next (Pending_alloc { reg = i.res.(0); dbginfos = dbginfo @ dbginfos; - totalsz = totalsz + sz }) in + totalsz = totalsz + sz; + mode }) in (instr_cons_debug (Iop(Iintop_imm(Iadd, -sz))) [| reg |] i.res i.dbg next, state) @@ -48,18 +52,21 @@ let rec combine i allocstate = combine i.next (Pending_alloc { reg = i.res.(0); dbginfos = dbginfo; - totalsz = sz }) in + totalsz = sz; + mode }) in let totalsz, dbginfo = match state with | No_alloc -> assert false - | Pending_alloc { totalsz; dbginfos; _ } -> totalsz, dbginfos in + | Pending_alloc { totalsz; dbginfos; mode = m; _ } -> + assert (Lambda.eq_mode m mode); + totalsz, dbginfos in let next = let offset = totalsz - sz in if offset = 0 then next else instr_cons_debug (Iop(Iintop_imm(Iadd, offset))) i.res i.res i.dbg next in - (instr_cons_debug (Iop(Ialloc {bytes = totalsz; dbginfo; })) + (instr_cons_debug (Iop(Ialloc {bytes = totalsz; dbginfo; mode})) i.arg i.res i.dbg next, allocstate) end | Iop(Icall_ind | Icall_imm _ | Iextcall _ | diff --git a/asmcomp/i386/emit.mlp b/asmcomp/i386/emit.mlp index 19f6e5b3d7e..588e21a72bc 100644 --- a/asmcomp/i386/emit.mlp +++ b/asmcomp/i386/emit.mlp @@ -236,6 +236,19 @@ let emit_call_gc gc = def_label gc.gc_frame; I.jmp (label gc.gc_return_lbl) +(* Record calls to local stack reallocation *) + +type local_realloc_call = + { lr_lbl: label; + lr_return_lbl: label; } + +let local_realloc_sites = ref ([] : local_realloc_call list) + +let emit_local_realloc lr = + def_label lr.lr_lbl; + emit_call "caml_call_local_realloc"; + I.jmp (label lr.lr_return_lbl) + (* Record calls to caml_ml_array_bound_error. In -g mode, we maintain one call to caml_ml_array_bound_error per bound check site. Without -g, we can share a single call. *) @@ -608,7 +621,7 @@ let emit_instr fallthrough i = I.fstp (addressing addr REAL8 i 1) end end - | Lop(Ialloc { bytes = n; dbginfo }) -> + | Lop(Ialloc { bytes = n; dbginfo; mode = Alloc_heap }) -> if !fastcode_flag then begin load_domain_state ebx; I.mov (domain_field Domain_young_ptr RBX) eax; @@ -643,6 +656,21 @@ let emit_instr fallthrough i = def_label label; I.lea (mem32 NONE 4 RAX) (reg i.res.(0)) end + | Lop(Ialloc {bytes = n; dbginfo=_; mode = Alloc_local }) -> + load_domain_state ebx; + I.mov (domain_field Domainstate.Domain_local_sp RBX) eax; + I.sub (int n) eax; + I.mov eax (domain_field Domainstate.Domain_local_sp RBX); + I.cmp (domain_field Domainstate.Domain_local_limit RBX) eax; + let lbl_call = new_label () in + I.j L (label lbl_call); + let lbl_after_alloc = new_label () in + def_label lbl_after_alloc; + I.add (domain_field Domainstate.Domain_local_top RBX) eax; + I.lea (mem32 NONE 4 RAX) (reg i.res.(0)); + local_realloc_sites := + { lr_lbl = lbl_call; + lr_return_lbl = lbl_after_alloc } :: !local_realloc_sites | Lop(Iintop(Icomp cmp)) -> I.cmp (reg i.arg.(1)) (reg i.arg.(0)); I.set (cond cmp) al; @@ -731,6 +759,8 @@ let emit_instr fallthrough i = I.add (int 8) esp; cfi_adjust_cfa_offset (-8); stack_offset := !stack_offset + 8 + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc) | Lop(Ispecific(Ilea addr)) -> I.lea (addressing addr DWORD i 0) (reg i.res.(0)) | Lop(Ispecific(Istore_int(n, addr, _))) -> @@ -799,6 +829,13 @@ let emit_instr fallthrough i = if Array.length i.arg = 2 && is_tos i.arg.(1) then I.fxch st1; emit_floatspecial s + | Lop (Ibeginregion) -> + load_domain_state ebx; + I.mov (domain_field Domainstate.Domain_local_sp RBX) (reg i.res.(0)) + | Lop (Iendregion) -> + I.mov (reg i.arg.(0)) eax; + load_domain_state ebx; + I.mov eax (domain_field Domainstate.Domain_local_sp RBX) | Lop (Iname_for_debugger _) -> () | Lop (Iprobe _ |Iprobe_is_enabled _) -> assert false | Lreloadretaddr -> @@ -923,6 +960,7 @@ let fundecl fundecl = tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; stack_offset := 0; call_gc_sites := []; + local_realloc_sites := []; bound_error_sites := []; bound_error_call := 0; for i = 0 to Proc.num_register_classes - 1 do @@ -938,6 +976,7 @@ let fundecl fundecl = cfi_startproc (); emit_all true fundecl.fun_body; List.iter emit_call_gc !call_gc_sites; + List.iter emit_local_realloc !local_realloc_sites; emit_call_bound_errors (); cfi_endproc (); begin match system with diff --git a/asmcomp/i386/proc.ml b/asmcomp/i386/proc.ml index 59798ffe2c7..58169051815 100644 --- a/asmcomp/i386/proc.ml +++ b/asmcomp/i386/proc.ml @@ -207,6 +207,7 @@ let destroyed_at_oper = function | Iop(Iintop Imulh) -> [| eax |] | Iop(Iintop(Icomp _) | Iintop_imm(Icomp _, _)) -> [| eax |] | Iop(Iintoffloat) -> [| eax |] + | Iop(Ibeginregion|Iendregion) -> [| eax; ebx |] | Iifthenelse(Ifloattest _, _, _) -> [| eax |] | Itrywith _ -> [| edx |] | _ -> [||] @@ -232,9 +233,10 @@ let max_register_pressure = function let op_is_pure = function | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ - | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> false + | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) | Iopaque -> false | Ispecific(Ilea _) -> true | Ispecific _ -> false + | Ibeginregion | Iendregion -> false | _ -> true (* Layout of the stack frame *) diff --git a/asmcomp/mach.ml b/asmcomp/mach.ml index 17f7f4edecd..f2d7b5840a1 100644 --- a/asmcomp/mach.ml +++ b/asmcomp/mach.ml @@ -53,16 +53,19 @@ type operation = | Istackoffset of int | Iload of Cmm.memory_chunk * Arch.addressing_mode | Istore of Cmm.memory_chunk * Arch.addressing_mode * bool - | Ialloc of { bytes : int; dbginfo : Debuginfo.alloc_dbginfo; } + | Ialloc of { bytes : int; dbginfo : Debuginfo.alloc_dbginfo; + mode : Lambda.alloc_mode } | Iintop of integer_operation | Iintop_imm of integer_operation * int | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf | Ifloatofint | Iintoffloat + | Iopaque | Ispecific of Arch.specific_operation | Iname_for_debugger of { ident : Backend_var.t; which_parameter : int option; provenance : unit option; is_assignment : bool; } | Iprobe of { name: string; handler_code_sym: string; } | Iprobe_is_enabled of { name: string } + | Ibeginregion | Iendregion type instruction = { desc: instruction_desc; diff --git a/asmcomp/mach.mli b/asmcomp/mach.mli index 9e0fd12d5bd..8d14173c115 100644 --- a/asmcomp/mach.mli +++ b/asmcomp/mach.mli @@ -54,11 +54,13 @@ type operation = | Iload of Cmm.memory_chunk * Arch.addressing_mode | Istore of Cmm.memory_chunk * Arch.addressing_mode * bool (* false = initialization, true = assignment *) - | Ialloc of { bytes : int; dbginfo : Debuginfo.alloc_dbginfo; } + | Ialloc of { bytes : int; dbginfo : Debuginfo.alloc_dbginfo; + mode: Lambda.alloc_mode } | Iintop of integer_operation | Iintop_imm of integer_operation * int | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf | Ifloatofint | Iintoffloat + | Iopaque | Ispecific of Arch.specific_operation | Iname_for_debugger of { ident : Backend_var.t; which_parameter : int option; provenance : unit option; is_assignment : bool; } @@ -70,6 +72,7 @@ type operation = identifier is forgotten. *) | Iprobe of { name: string; handler_code_sym: string; } | Iprobe_is_enabled of { name: string } + | Ibeginregion | Iendregion type instruction = { desc: instruction_desc; diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp index 4aba2fbcf37..83153a1d0ea 100644 --- a/asmcomp/power/emit.mlp +++ b/asmcomp/power/emit.mlp @@ -488,6 +488,8 @@ module BR = Branch_relaxation.Make (struct | Lop(Istore(_chunk, addr, _)) -> load_store_size addr | Lop(Ialloc _) -> 5 | Lop(Ispecific(Ialloc_far _)) -> 6 + | Lop(Ibeginregion | Iendregion) -> + Misc.fatal_error "Local allocations not supported on this architecture" | Lop(Iintop Imod) -> 3 | Lop(Iintop(Icomp _)) -> 4 | Lop(Iintop _) -> 1 @@ -496,6 +498,7 @@ module BR = Branch_relaxation.Make (struct | Lop(Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf) -> 1 | Lop(Ifloatofint) -> 9 | Lop(Iintoffloat) -> 4 + | Lop(Iopaque) -> 0 | Lop(Ispecific _) -> 1 | Lop (Iname_for_debugger _) -> 0 | Lop (Iprobe _ |Iprobe_is_enabled _) -> @@ -776,10 +779,12 @@ let emit_instr i = | Single -> "stfs" | Double -> "stfd" in emit_load_store storeinstr addr i.arg 1 i.arg.(0) - | Lop(Ialloc { bytes; dbginfo }) -> + | Lop(Ialloc { bytes; dbginfo; mode = Alloc_heap }) -> emit_alloc i bytes dbginfo false | Lop(Ispecific(Ialloc_far { bytes; dbginfo })) -> emit_alloc i bytes dbginfo true + | Lop(Ialloc { mode = Alloc_local } | Ibeginregion | Iendregion) -> + Misc.fatal_error "Local allocations not supported on this architecture" | Lop(Iintop Isub) -> (* subfc has swapped arguments *) ` subfc {emit_reg i.res.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n` | Lop(Iintop Imod) -> @@ -857,6 +862,8 @@ let emit_instr i = ` lwz {emit_reg i.res.(0)}, 4(1)\n`; ` addi 1, 1, 16\n` end + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc) | Lop(Ispecific sop) -> let instr = name_for_specific sop in ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}\n` diff --git a/asmcomp/power/proc.ml b/asmcomp/power/proc.ml index 24f95ff62b8..ca0e11a95fa 100644 --- a/asmcomp/power/proc.ml +++ b/asmcomp/power/proc.ml @@ -325,7 +325,7 @@ let max_register_pressure = function let op_is_pure = function | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ - | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> false + | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) | Iopaque -> false | Ispecific(Imultaddf | Imultsubf) -> true | Ispecific _ -> false | _ -> true diff --git a/asmcomp/printcmm.ml b/asmcomp/printcmm.ml index 58b6f49fe8a..f70952b02b0 100644 --- a/asmcomp/printcmm.ml +++ b/asmcomp/printcmm.ml @@ -114,19 +114,20 @@ let location d = else Debuginfo.to_string d let operation d = function - | Capply _ty -> "app" ^ location d + | Capply(_ty, _) -> "app" ^ location d | Cextcall(lbl, _ty_res, _ty_args, _alloc) -> Printf.sprintf "extcall \"%s\"%s" lbl (location d) | Cload (c, Asttypes.Immutable) -> Printf.sprintf "load %s" (chunk c) | Cload (c, Asttypes.Mutable) -> Printf.sprintf "load_mut %s" (chunk c) - | Calloc -> "alloc" ^ location d + | Calloc Alloc_heap -> "alloc" ^ location d + | Calloc Alloc_local -> "alloc_local" ^ location d | Cstore (c, init) -> let init = match init with | Lambda.Heap_initialization -> "(heap-init)" | Lambda.Root_initialization -> "(root-init)" | Lambda.Assignment -> "" - | Lambda.Local_assignment -> "(local)" + | Local_assignment -> "(local)" in Printf.sprintf "store %s%s" (chunk c) init | Caddi -> "+" @@ -159,6 +160,9 @@ let operation d = function | Cprobe { name; handler_code_sym } -> Printf.sprintf "probe[%s %s]" name handler_code_sym | Cprobe_is_enabled {name} -> Printf.sprintf "probe_is_enabled[%s]" name + | Copaque -> "opaque" + | Cbeginregion -> "beginregion" + | Cendregion -> "endregion" let rec expr ppf = function | Cconst_int (n, _dbg) -> fprintf ppf "%i" n @@ -221,7 +225,7 @@ let rec expr ppf = function fprintf ppf "@[<2>(%s" (operation dbg op); List.iter (fun e -> fprintf ppf "@ %a" expr e) el; begin match op with - | Capply mty -> fprintf ppf "@ %a" machtype mty + | Capply(mty, _) -> fprintf ppf "@ %a" machtype mty | Cextcall(_, ty_res, ty_args, _) -> fprintf ppf "@ %a" extcall_signature (ty_res, ty_args) | _ -> () @@ -268,6 +272,10 @@ let rec expr ppf = function | Ctrywith(e1, id, e2, _dbg) -> fprintf ppf "@[<2>(try@ %a@;<1 -2>with@ %a@ %a)@]" sequence e1 VP.print id sequence e2 + | Cregion e -> + fprintf ppf "@[<2>(region@ %a)@]" sequence e + | Ctail e -> + fprintf ppf "@[<2>(tail@ %a)@]" sequence e and sequence ppf = function | Csequence(e1, e2) -> fprintf ppf "%a@ %a" sequence e1 sequence e2 diff --git a/asmcomp/printmach.ml b/asmcomp/printmach.ml index 992ad290140..b79281e0852 100644 --- a/asmcomp/printmach.ml +++ b/asmcomp/printmach.ml @@ -132,8 +132,10 @@ let operation op arg ppf res = (Array.sub arg 1 (Array.length arg - 1)) reg arg.(0) (if is_assign then "(assign)" else "(init)") - | Ialloc { bytes = n; } -> + | Ialloc { bytes = n; mode = Alloc_heap } -> fprintf ppf "alloc %i" n; + | Ialloc { bytes = n; mode = Alloc_local } -> + fprintf ppf "alloc_local %i" n; | Iintop(op) -> fprintf ppf "%a%s%a" reg arg.(0) (intop op) reg arg.(1) | Iintop_imm(op, n) -> fprintf ppf "%a%s%i" reg arg.(0) (intop op) n | Inegf -> fprintf ppf "-f %a" reg arg.(0) @@ -144,6 +146,7 @@ let operation op arg ppf res = | Idivf -> fprintf ppf "%a /f %a" reg arg.(0) reg arg.(1) | Ifloatofint -> fprintf ppf "floatofint %a" reg arg.(0) | Iintoffloat -> fprintf ppf "intoffloat %a" reg arg.(0) + | Iopaque -> fprintf ppf "opaque %a" reg arg.(0) | Iname_for_debugger { ident; which_parameter; } -> fprintf ppf "name_for_debugger %a%s=%a" V.print ident @@ -151,6 +154,8 @@ let operation op arg ppf res = | None -> "" | Some index -> sprintf "[P%d]" index) reg arg.(0) + | Ibeginregion -> fprintf ppf "beginregion" + | Iendregion -> fprintf ppf "endregion %a" reg arg.(0) | Ispecific op -> Arch.print_specific_operation reg op ppf arg | Iprobe {name;handler_code_sym} -> diff --git a/asmcomp/reloadgen.ml b/asmcomp/reloadgen.ml index a91443aab8f..2f548bc4f05 100644 --- a/asmcomp/reloadgen.ml +++ b/asmcomp/reloadgen.ml @@ -75,6 +75,10 @@ method reload_operation op arg res = so that the presence of a probe does not affect register allocation of the rest of the code. *) (arg, res) + | Iopaque -> + (* arg = result, can be on stack or register *) + assert (arg.(0).stamp = res.(0).stamp); + (arg, res) | _ -> (self#makeregs arg, self#makeregs res) diff --git a/asmcomp/riscv/emit.mlp b/asmcomp/riscv/emit.mlp index 1a7f067f9af..3611411b4d9 100644 --- a/asmcomp/riscv/emit.mlp +++ b/asmcomp/riscv/emit.mlp @@ -368,7 +368,7 @@ let emit_instr i = | Double -> "fsd" in ` {emit_string instr} {emit_reg i.arg.(0)}, {emit_int ofs}({emit_reg i.arg.(1)})\n` - | Lop(Ialloc {bytes; dbginfo}) -> + | Lop(Ialloc {bytes; dbginfo; mode = Alloc_heap}) -> let lbl_frame_lbl = record_frame_label i.live (Dbg_alloc dbginfo) in let lbl_after_alloc = new_label () in let lbl_call_gc = new_label () in @@ -388,6 +388,8 @@ let emit_instr i = { gc_lbl = lbl_call_gc; gc_return_lbl = lbl_after_alloc; gc_frame_lbl = lbl_frame_lbl } :: !call_gc_sites + | Lop(Ialloc { mode = Alloc_local } | Ibeginregion | Iendregion) -> + Misc.fatal_error "Local allocations not supported on this architecture" | Lop(Iintop(Icomp cmp)) -> begin match cmp with | Isigned Clt -> @@ -438,6 +440,8 @@ let emit_instr i = ` fcvt.d.l {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}\n` | Lop(Iintoffloat) -> ` fcvt.l.d {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, rtz\n` + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc) | Lop(Ispecific sop) -> let instr = name_for_specific sop in ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}\n` diff --git a/asmcomp/s390x/emit.mlp b/asmcomp/s390x/emit.mlp index 208812daea3..4f1f7a92e26 100644 --- a/asmcomp/s390x/emit.mlp +++ b/asmcomp/s390x/emit.mlp @@ -420,7 +420,7 @@ let emit_instr i = | Double -> "stdy" in emit_load_store storeinstr addr i.arg 1 i.arg.(0) - | Lop(Ialloc { bytes = n; dbginfo }) -> + | Lop(Ialloc { bytes = n; dbginfo; mode = Alloc_heap }) -> let lbl_after_alloc = new_label() in let lbl_call_gc = new_label() in let lbl_frame = @@ -437,6 +437,9 @@ let emit_instr i = `{emit_label lbl_after_alloc}:`; ` la {emit_reg i.res.(0)}, 8(%r11)\n` + | Lop(Ialloc { mode = Alloc_local } | Ibeginregion | Iendregion) -> + Misc.fatal_error "Local allocations not supported on this architecture" + | Lop(Iintop Imulh) -> (* Hacker's Delight section 8.3: mul-high-signed(a, b) = mul-high-unsigned(a, b) @@ -539,6 +542,8 @@ let emit_instr i = | Lop(Iintoffloat) -> (* rounding method #5 = round toward 0 *) ` cgdbr {emit_reg i.res.(0)}, 5, {emit_reg i.arg.(0)}\n` + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc) | Lop(Ispecific sop) -> assert (i.arg.(2).loc = i.res.(0).loc); let instr = name_for_specific sop in diff --git a/asmcomp/s390x/proc.ml b/asmcomp/s390x/proc.ml index d9aa9ea3c1c..0333554e9b6 100644 --- a/asmcomp/s390x/proc.ml +++ b/asmcomp/s390x/proc.ml @@ -215,7 +215,7 @@ let max_register_pressure = function let op_is_pure = function | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ - | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> false + | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) | Iopaque -> false | Ispecific(Imultaddf | Imultsubf) -> true | _ -> true diff --git a/asmcomp/selectgen.ml b/asmcomp/selectgen.ml index 0bc64bbba7e..a4c1562c1e4 100644 --- a/asmcomp/selectgen.ml +++ b/asmcomp/selectgen.ml @@ -24,13 +24,17 @@ module Int = Numbers.Int module V = Backend_var module VP = Backend_var.With_provenance +type region_stack = Reg.t array list + type environment = { vars : (Reg.t array * Backend_var.Provenance.t option * Asttypes.mutable_flag) V.Map.t; - static_exceptions : Reg.t array list Int.Map.t; + static_exceptions : (Reg.t array list * region_stack) Int.Map.t; (** Which registers must be populated when jumping to the given handler. *) + regions : region_stack; + region_tail : bool; } let env_add ?(mut=Asttypes.Immutable) var regs env = @@ -39,7 +43,8 @@ let env_add ?(mut=Asttypes.Immutable) var regs env = { env with vars = V.Map.add var (regs, provenance, mut) env.vars } let env_add_static_exception id v env = - { env with static_exceptions = Int.Map.add id v env.static_exceptions } + { env with static_exceptions = + Int.Map.add id (v, env.regions) env.static_exceptions } let env_find id env = let regs, _provenance, _mut = V.Map.find id env.vars in @@ -60,12 +65,28 @@ let env_find_static_exception id env = let env_empty = { vars = V.Map.empty; static_exceptions = Int.Map.empty; + regions = []; + region_tail = false; } +(* Assuming [rs] is equal to or a suffix of [env.regions], + return the last region in [env.regions] but not [rs] + (or None if they are equal) *) +let env_close_regions env rs = + let rec aux v es rs = + match es, rs with + | [], [] -> v + | (r :: _), (r' :: _) when r == r' -> v + | [], _::_ -> + Misc.fatal_error "Selectgen.env_close_regions: not a suffix" + | r :: es, rs -> aux (Some r) es rs + in + aux None env.regions rs + (* Infer the type of the result of an operation *) let oper_result_type = function - Capply ty -> ty + | Capply(ty, _) -> ty | Cextcall(_s, ty_res, _ty_args, _alloc) -> ty_res | Cload (c, _) -> begin match c with @@ -73,7 +94,7 @@ let oper_result_type = function | Single | Double -> typ_float | _ -> typ_int end - | Calloc -> typ_val + | Calloc _ -> typ_val | Cstore (_c, _) -> typ_void | Caddi | Csubi | Cmuli | Cmulhi | Cdivi | Cmodi | Cand | Cor | Cxor | Clsl | Clsr | Casr | @@ -87,6 +108,12 @@ let oper_result_type = function | Ccheckbound -> typ_void | Cprobe _ -> typ_void | Cprobe_is_enabled _ -> typ_int + | Copaque -> typ_val + | Cbeginregion -> + (* This must not be typ_val; the begin-region operation returns a + naked pointer into the local allocation stack. *) + typ_int + | Cendregion -> typ_void (* Infer the size in bytes of the result of an expression whose evaluation may be deferred (cf. [emit_parts]). *) @@ -324,9 +351,10 @@ method is_simple_expr = function | Cop(op, args, _) -> begin match op with (* The following may have side effects *) - | Capply _ | Cextcall _ | Calloc | Cstore _ + | Capply _ | Cextcall _ | Calloc _ | Cstore _ | Craise _ | Ccheckbound - | Cprobe _ | Cprobe_is_enabled _ -> false + | Cprobe _ | Cprobe_is_enabled _ | Copaque -> false + | Cbeginregion | Cendregion -> false (* avoid reordering *) (* The remaining operations are simple if their args are *) | Cload _ | Caddi | Csubi | Cmuli | Cmulhi | Cdivi | Cmodi | Cand | Cor | Cxor | Clsl | Clsr | Casr | Ccmpi _ | Caddv | Cadda | Ccmpa _ | Cnegf @@ -334,7 +362,7 @@ method is_simple_expr = function | Ccmpf _ -> List.for_all self#is_simple_expr args end | Cassign _ | Cifthenelse _ | Cswitch _ | Ccatch _ | Cexit _ - | Ctrywith _ -> false + | Ctrywith _ | Cregion _ | Ctail _ -> false (* Analyses the effects and coeffects of an expression. This is used across a whole list of expressions with a view to determining which expressions @@ -365,9 +393,11 @@ method effects_of exp = | Cop (op, args, _) -> let from_op = match op with - | Capply _ | Cextcall _ | Cprobe _ -> EC.arbitrary - | Calloc -> EC.none + | Capply _ | Cextcall _ | Cprobe _ | Copaque -> EC.arbitrary + | Calloc Alloc_heap -> EC.none + | Calloc Alloc_local -> EC.coeffect_only Coeffect.Arbitrary | Cstore _ -> EC.effect_only Effect.Arbitrary + | Cbeginregion | Cendregion -> EC.arbitrary | Craise _ | Ccheckbound -> EC.effect_only Effect.Raise | Cload (_, Asttypes.Immutable) -> EC.none | Cload (_, Asttypes.Mutable) -> EC.coeffect_only Coeffect.Read_mutable @@ -378,7 +408,8 @@ method effects_of exp = EC.none in EC.join from_op (EC.join_list_map args self#effects_of) - | Cassign _ | Cswitch _ | Ccatch _ | Cexit _ | Ctrywith _ -> + | Cassign _ | Cswitch _ | Ccatch _ | Cexit _ | Ctrywith _ + | Cregion _ | Ctail _ -> EC.arbitrary (* Says whether an integer constant is a suitable immediate argument for @@ -465,7 +496,7 @@ method select_operation op args _dbg = (Istore(chunk, addr, is_assign), [arg2; eloc]) (* Inversion addr/datum in Istore *) end - | (Calloc, _) -> (Ialloc {bytes = 0; dbginfo = []}), args + | (Calloc mode, _) -> (Ialloc {bytes = 0; dbginfo = []; mode}), args | (Caddi, _) -> self#select_arith_comm Iadd args | (Csubi, _) -> self#select_arith Isub args | (Cmuli, _) -> self#select_arith_comm Imul args @@ -495,6 +526,8 @@ method select_operation op args _dbg = | (Cprobe { name; handler_code_sym; }, _) -> Iprobe { name; handler_code_sym; }, args | (Cprobe_is_enabled {name}, _) -> Iprobe_is_enabled {name}, [] + | (Cbeginregion, _) -> Ibeginregion, [] + | (Cendregion, _) -> Iendregion, args | _ -> Misc.fatal_error "Selection.select_oper" method private select_arith_comm op = function @@ -610,6 +643,9 @@ method insert_op env op rs rd = at the end of the self sequence *) method emit_expr (env:environment) exp = + (* Environment used in recursive calls not in tail position *) + let env' = + if env.region_tail then {env with region_tail=false} else env in match exp with Cconst_int (n, _dbg) -> let r = self#regs_for typ_int in @@ -637,12 +673,12 @@ method emit_expr (env:environment) exp = Misc.fatal_error("Selection.emit_expr: unbound var " ^ V.unique_name v) end | Clet(v, e1, e2) -> - begin match self#emit_expr env e1 with + begin match self#emit_expr env' e1 with None -> None | Some r1 -> self#emit_expr (self#bind_let env v r1) e2 end | Clet_mut(v, k, e1, e2) -> - begin match self#emit_expr env e1 with + begin match self#emit_expr env' e1 with None -> None | Some r1 -> self#emit_expr (self#bind_let_mut env v k r1) e2 end @@ -654,7 +690,7 @@ method emit_expr (env:environment) exp = env_find_mut v env with Not_found -> Misc.fatal_error ("Selection.emit_expr: unbound var " ^ V.name v) in - begin match self#emit_expr env e1 with + begin match self#emit_expr env' e1 with None -> None | Some r1 -> self#insert_moves env r1 rv; Some [||] @@ -662,13 +698,13 @@ method emit_expr (env:environment) exp = | Ctuple [] -> Some [||] | Ctuple exp_list -> - begin match self#emit_parts_list env exp_list with + begin match self#emit_parts_list env' exp_list with None -> None | Some(simple_list, ext_env) -> Some(self#emit_tuple ext_env simple_list) end | Cop(Craise k, [arg], dbg) -> - begin match self#emit_expr env arg with + begin match self#emit_expr env' arg with None -> None | Some r1 -> let rd = [|Proc.loc_exn_bucket|] in @@ -682,9 +718,16 @@ method emit_expr (env:environment) exp = dbg, Cconst_int (1, dbg), dbg, Cconst_int (0, dbg), dbg)) - | Cop(op, args, dbg) -> + | Cop(Copaque, args, dbg) -> begin match self#emit_parts_list env args with None -> None + | Some (simple_args, env) -> + let rs = self#emit_tuple env simple_args in + Some (self#insert_op_debug env Iopaque dbg rs rs) + end + | Cop(op, args, dbg) -> + begin match self#emit_parts_list env' args with + None -> None | Some(simple_args, env) -> let ty = oper_result_type op in let (new_op, new_args) = self#select_operation op simple_args dbg in @@ -718,13 +761,15 @@ method emit_expr (env:environment) exp = loc_arg (Proc.loc_external_results (Reg.typv rd)) in self#insert_move_results env loc_res rd stack_ofs; Some rd - | Ialloc { bytes = _; } -> + | Ialloc { bytes = _; mode } -> let rd = self#regs_for typ_val in let bytes = size_expr env (Ctuple new_args) in assert (bytes mod Arch.size_addr = 0); let alloc_words = bytes / Arch.size_addr in let op = - Ialloc { bytes; dbginfo = [{alloc_words; alloc_dbg = dbg}] } + Ialloc { bytes; + dbginfo = [{alloc_words; alloc_dbg = dbg}]; + mode } in self#insert_debug env (Iop op) dbg [||] rd; self#emit_stores env new_args rd; @@ -735,13 +780,13 @@ method emit_expr (env:environment) exp = Some (self#insert_op_debug env op dbg r1 rd) end | Csequence(e1, e2) -> - begin match self#emit_expr env e1 with + begin match self#emit_expr env' e1 with None -> None | Some _ -> self#emit_expr env e2 end | Cifthenelse(econd, _ifso_dbg, eif, _ifnot_dbg, eelse, _dbg) -> let (cond, earg) = self#select_condition econd in - begin match self#emit_expr env earg with + begin match self#emit_expr env' earg with None -> None | Some rarg -> let (rif, sif) = self#emit_sequence env eif in @@ -752,7 +797,7 @@ method emit_expr (env:environment) exp = r end | Cswitch(esel, index, ecases, _dbg) -> - begin match self#emit_expr env esel with + begin match self#emit_expr env' esel with None -> None | Some rsel -> let rscases = @@ -777,6 +822,9 @@ method emit_expr (env:environment) exp = (nfail, ids, rs, e2, dbg)) handlers in + let env = + (* Disable region-fusion on loops *) + match rec_flag with Recursive -> env' | Nonrecursive -> env in let env = (* Since the handlers may be recursive, and called from the body, the same environment is used for translating both the handlers and @@ -803,11 +851,11 @@ method emit_expr (env:environment) exp = [||] [||]; r | Cexit (nfail,args) -> - begin match self#emit_parts_list env args with + begin match self#emit_parts_list env' args with None -> None | Some (simple_list, ext_env) -> let src = self#emit_tuple ext_env simple_list in - let dest_args = + let dest_args, dest_regions = try env_find_static_exception nfail env with Not_found -> Misc.fatal_error ("Selection.emit_expr: unbound label "^ @@ -820,10 +868,16 @@ method emit_expr (env:environment) exp = Array.iter (fun reg -> assert(reg.typ <> Addr)) src; self#insert_moves env src tmp_regs ; self#insert_moves env tmp_regs (Array.concat dest_args) ; + begin match env_close_regions env dest_regions with + | None -> () + | Some regs -> self#insert env (Iop Iendregion) regs [||] + end; self#insert env (Iexit nfail) [||] [||]; None end | Ctrywith(e1, v, e2, _dbg) -> + let reg = self#regs_for typ_int in + self#insert env (Iop Ibeginregion) [| |] reg; let (r1, s1) = self#emit_sequence env e1 in let rv = self#regs_for typ_val in let (r2, s2) = self#emit_sequence (env_add v rv env) e2 in @@ -831,9 +885,22 @@ method emit_expr (env:environment) exp = self#insert env (Itrywith(s1#extract, instr_cons (Iop Imove) [|Proc.loc_exn_bucket|] rv - (s2#extract))) + (instr_cons (Iop Iendregion) reg [| |] s2#extract))) [||] [||]; r + | Cregion e -> + let reg = self#regs_for typ_int in + self#insert env (Iop Ibeginregion) [| |] reg; + let env = { env with regions = reg::env.regions; region_tail = true } in + begin match self#emit_expr env e with + None -> None + | Some _ as res -> + self#insert env (Iop Iendregion) reg [| |]; + res + end + | Ctail e -> + assert env.region_tail; + self#emit_expr env e method private emit_sequence (env:environment) exp = let s = {< instr_seq = dummy_instr >} in @@ -1008,39 +1075,51 @@ method emit_stores env data regs_addr = (* Same, but in tail position *) -method private emit_return (env:environment) exp = - match self#emit_expr env exp with +method private insert_return (env:environment) r = + match r with None -> () | Some r -> let loc = Proc.loc_results (Reg.typv r) in + if env.region_tail then + self#insert env (Iop Iendregion) (List.hd env.regions) [||]; self#insert_moves env r loc; self#insert env Ireturn loc [||] +method private emit_return (env:environment) exp = + self#insert_return env (self#emit_expr env exp) + method emit_tail (env:environment) exp = + let env' = + if env.region_tail then {env with region_tail=false} else env in match exp with Clet(v, e1, e2) -> - begin match self#emit_expr env e1 with + begin match self#emit_expr env' e1 with None -> () | Some r1 -> self#emit_tail (self#bind_let env v r1) e2 end | Clet_mut (v, k, e1, e2) -> - begin match self#emit_expr env e1 with + begin match self#emit_expr env' e1 with None -> () | Some r1 -> self#emit_tail (self#bind_let_mut env v k r1) e2 end | Cphantom_let (_var, _defining_expr, body) -> self#emit_tail env body - | Cop((Capply ty) as op, args, dbg) -> - begin match self#emit_parts_list env args with + | Cop((Capply(ty, pos)) as op, args, dbg) -> + let tail = (pos = Lambda.Rc_close_at_apply) in + let endregion = env.region_tail in + begin match self#emit_parts_list env' args with None -> () | Some(simple_args, env) -> let (new_op, new_args) = self#select_operation op simple_args dbg in match new_op with Icall_ind -> let r1 = self#emit_tuple env new_args in + if endregion && tail then + self#insert env (Iop Iendregion) (List.hd env.regions) [||]; + let endregion = endregion && not tail in let rarg = Array.sub r1 1 (Array.length r1 - 1) in let (loc_arg, stack_ofs) = Proc.loc_arguments (Reg.typv rarg) in - if stack_ofs = 0 then begin + if stack_ofs = 0 && not endregion then begin let call = Iop (Itailcall_ind) in self#insert_moves env rarg loc_arg; self#insert_debug env call dbg @@ -1051,17 +1130,27 @@ method emit_tail (env:environment) exp = self#insert_move_args env rarg loc_arg stack_ofs; self#insert_debug env (Iop new_op) dbg (Array.append [|r1.(0)|] loc_arg) loc_res; - self#insert env (Iop(Istackoffset(-stack_ofs))) [||] [||]; + if not endregion then begin + self#insert env (Iop(Istackoffset(-stack_ofs))) [||] [||] + end else begin + self#insert_move_results env loc_res rd stack_ofs; + self#insert env (Iop Iendregion) (List.hd env.regions) [||]; + self#insert_moves env rd loc_res + end; self#insert env Ireturn loc_res [||] end | Icall_imm { func; } -> let r1 = self#emit_tuple env new_args in + if endregion && tail then + self#insert env (Iop Iendregion) (List.hd env.regions) [||]; + let endregion = endregion && not tail in let (loc_arg, stack_ofs) = Proc.loc_arguments (Reg.typv r1) in - if stack_ofs = 0 then begin + if stack_ofs = 0 && not endregion then begin let call = Iop (Itailcall_imm { func; }) in self#insert_moves env r1 loc_arg; self#insert_debug env call dbg loc_arg [||]; - end else if func = !current_function_name then begin + end else if func = !current_function_name + && not endregion then begin let call = Iop (Itailcall_imm { func; }) in let loc_arg' = Proc.loc_parameters (Reg.typv r1) in self#insert_moves env r1 loc_arg'; @@ -1071,19 +1160,25 @@ method emit_tail (env:environment) exp = let loc_res = Proc.loc_results (Reg.typv rd) in self#insert_move_args env r1 loc_arg stack_ofs; self#insert_debug env (Iop new_op) dbg loc_arg loc_res; - self#insert env (Iop(Istackoffset(-stack_ofs))) [||] [||]; + if not endregion then begin + self#insert env (Iop(Istackoffset(-stack_ofs))) [||] [||] + end else begin + self#insert_move_results env loc_res rd stack_ofs; + self#insert env (Iop Iendregion) (List.hd env.regions) [||]; + self#insert_moves env rd loc_res + end; self#insert env Ireturn loc_res [||] end | _ -> Misc.fatal_error "Selection.emit_tail" end | Csequence(e1, e2) -> - begin match self#emit_expr env e1 with + begin match self#emit_expr env' e1 with None -> () | Some _ -> self#emit_tail env e2 end | Cifthenelse(econd, _ifso_dbg, eif, _ifnot_dbg, eelse, _dbg) -> let (cond, earg) = self#select_condition econd in - begin match self#emit_expr env earg with + begin match self#emit_expr env' earg with None -> () | Some rarg -> self#insert env @@ -1092,7 +1187,7 @@ method emit_tail (env:environment) exp = rarg [||] end | Cswitch(esel, index, ecases, _dbg) -> - begin match self#emit_expr env esel with + begin match self#emit_expr env' esel with None -> () | Some rsel -> let cases = @@ -1113,6 +1208,9 @@ method emit_tail (env:environment) exp = ids in (nfail, ids, rs, e2, dbg)) handlers in + let env = + (* Disable region-fusion on loops *) + match rec_flag with Recursive -> env' | Nonrecursive -> env in let env = List.fold_left (fun env (nfail, _ids, rs, _e2, _dbg) -> env_add_static_exception nfail rs env) @@ -1129,20 +1227,31 @@ method emit_tail (env:environment) exp = self#insert env (Icatch(rec_flag, List.map aux handlers, s_body)) [||] [||] | Ctrywith(e1, v, e2, _dbg) -> + let reg = self#regs_for typ_int in + self#insert env (Iop Ibeginregion) [| |] reg; let (opt_r1, s1) = self#emit_sequence env e1 in let rv = self#regs_for typ_val in let s2 = self#emit_tail_sequence (env_add v rv env) e2 in self#insert env (Itrywith(s1#extract, - instr_cons (Iop Imove) [|Proc.loc_exn_bucket|] rv s2)) + instr_cons (Iop Imove) [|Proc.loc_exn_bucket|] rv + (instr_cons (Iop Iendregion) reg [| |] s2))) [||] [||]; - begin match opt_r1 with - None -> () - | Some r1 -> - let loc = Proc.loc_results (Reg.typv r1) in - self#insert_moves env r1 loc; - self#insert env Ireturn loc [||] + self#insert_return env opt_r1 + | Cregion e -> + if env.region_tail then + self#emit_return env exp + else begin + let reg = self#regs_for typ_int in + self#insert env (Iop Ibeginregion) [| |] reg; + let env' = { env with regions = reg::env.regions; region_tail = true } in + self#emit_tail env' e end + | Ctail e -> + assert env.region_tail; + self#insert env' (Iop Iendregion) (List.hd env.regions) [| |]; + self#emit_tail { env with regions = List.tl env.regions; + region_tail = false } e | Cop _ | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ | Cvar _ diff --git a/boot/menhir/parser.ml b/boot/menhir/parser.ml index 3aa62d1080d..b9581b9ee29 100644 --- a/boot/menhir/parser.ml +++ b/boot/menhir/parser.ml @@ -16,7 +16,7 @@ module MenhirBasics = struct | VAL | UNDERSCORE | UIDENT of ( -# 701 "parsing/parser.mly" +# 781 "parsing/parser.mly" (string) # 22 "parsing/parser.ml" ) @@ -28,7 +28,7 @@ module MenhirBasics = struct | THEN | STRUCT | STRING of ( -# 689 "parsing/parser.mly" +# 769 "parsing/parser.mly" (string * Location.t * string option) # 34 "parsing/parser.ml" ) @@ -41,12 +41,12 @@ module MenhirBasics = struct | RBRACKET | RBRACE | QUOTED_STRING_ITEM of ( -# 693 "parsing/parser.mly" +# 773 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) # 47 "parsing/parser.ml" ) | QUOTED_STRING_EXPR of ( -# 691 "parsing/parser.mly" +# 771 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) # 52 "parsing/parser.ml" ) @@ -54,7 +54,7 @@ module MenhirBasics = struct | QUESTION | PRIVATE | PREFIXOP of ( -# 675 "parsing/parser.mly" +# 755 "parsing/parser.mly" (string) # 60 "parsing/parser.ml" ) @@ -64,7 +64,7 @@ module MenhirBasics = struct | PERCENT | OR | OPTLABEL of ( -# 668 "parsing/parser.mly" +# 748 "parsing/parser.mly" (string) # 70 "parsing/parser.ml" ) @@ -72,6 +72,7 @@ module MenhirBasics = struct | OF | OBJECT | NONREC + | NONLOCAL | NEW | MUTABLE | MODULE @@ -81,15 +82,16 @@ module MenhirBasics = struct | METHOD | MATCH | LPAREN + | LOCAL | LIDENT of ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 88 "parsing/parser.ml" +# 90 "parsing/parser.ml" ) | LETOP of ( -# 633 "parsing/parser.mly" +# 711 "parsing/parser.mly" (string) -# 93 "parsing/parser.ml" +# 95 "parsing/parser.ml" ) | LET | LESSMINUS @@ -107,62 +109,63 @@ module MenhirBasics = struct | LBRACE | LAZY | LABEL of ( -# 638 "parsing/parser.mly" +# 716 "parsing/parser.mly" (string) -# 113 "parsing/parser.ml" +# 115 "parsing/parser.ml" ) | INT of ( -# 637 "parsing/parser.mly" +# 715 "parsing/parser.mly" (string * char option) -# 118 "parsing/parser.ml" +# 120 "parsing/parser.ml" ) | INITIALIZER | INHERIT | INFIXOP4 of ( -# 631 "parsing/parser.mly" +# 709 "parsing/parser.mly" (string) -# 125 "parsing/parser.ml" +# 127 "parsing/parser.ml" ) | INFIXOP3 of ( -# 630 "parsing/parser.mly" +# 708 "parsing/parser.mly" (string) -# 130 "parsing/parser.ml" +# 132 "parsing/parser.ml" ) | INFIXOP2 of ( -# 629 "parsing/parser.mly" +# 707 "parsing/parser.mly" (string) -# 135 "parsing/parser.ml" +# 137 "parsing/parser.ml" ) | INFIXOP1 of ( -# 628 "parsing/parser.mly" +# 706 "parsing/parser.mly" (string) -# 140 "parsing/parser.ml" +# 142 "parsing/parser.ml" ) | INFIXOP0 of ( -# 627 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 145 "parsing/parser.ml" +# 147 "parsing/parser.ml" ) | INCLUDE | IN | IF | HASHOP of ( -# 686 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 153 "parsing/parser.ml" +# 155 "parsing/parser.ml" ) | HASH | GREATERRBRACKET | GREATERRBRACE | GREATER + | GLOBAL | FUNCTOR | FUNCTION | FUN | FOR | FLOAT of ( -# 616 "parsing/parser.mly" +# 693 "parsing/parser.mly" (string * char option) -# 166 "parsing/parser.ml" +# 169 "parsing/parser.ml" ) | FALSE | EXTERNAL @@ -174,24 +177,24 @@ module MenhirBasics = struct | ELSE | DOWNTO | DOTOP of ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 180 "parsing/parser.ml" +# 183 "parsing/parser.ml" ) | DOTDOT | DOT | DONE | DOCSTRING of ( -# 709 "parsing/parser.mly" +# 789 "parsing/parser.mly" (Docstrings.docstring) -# 188 "parsing/parser.ml" +# 191 "parsing/parser.ml" ) | DO | CONSTRAINT | COMMENT of ( -# 708 "parsing/parser.mly" +# 788 "parsing/parser.mly" (string * Location.t) -# 195 "parsing/parser.ml" +# 198 "parsing/parser.ml" ) | COMMA | COLONGREATER @@ -200,9 +203,9 @@ module MenhirBasics = struct | COLON | CLASS | CHAR of ( -# 596 "parsing/parser.mly" +# 673 "parsing/parser.mly" (char) -# 206 "parsing/parser.ml" +# 209 "parsing/parser.ml" ) | BEGIN | BARRBRACKET @@ -213,9 +216,9 @@ module MenhirBasics = struct | ASSERT | AS | ANDOP of ( -# 634 "parsing/parser.mly" +# 712 "parsing/parser.mly" (string) -# 219 "parsing/parser.ml" +# 222 "parsing/parser.ml" ) | AND | AMPERSAND @@ -371,6 +374,83 @@ let mkuplus ~oploc name arg = | _ -> Pexp_apply(mkoperator ~loc:oploc ("~" ^ name), [Nolabel, arg]) + +let local_loc = mknoloc "ocaml.local" +let local_ext_loc = mknoloc "extension.local" + +let local_attr = + Attr.mk ~loc:Location.none local_loc (PStr []) + +let local_extension = + Exp.mk ~loc:Location.none (Pexp_extension(local_ext_loc, PStr [])) + +let mkexp_stack ~loc exp = + ghexp ~loc (Pexp_apply(local_extension, [Nolabel, exp])) + +let mkpat_stack pat = + {pat with ppat_attributes = local_attr :: pat.ppat_attributes} + +let mktyp_stack typ = + {typ with ptyp_attributes = local_attr :: typ.ptyp_attributes} + +let wrap_exp_stack exp = + {exp with pexp_attributes = local_attr :: exp.pexp_attributes} + +let mkexp_local_if p ~loc exp = + if p then mkexp_stack ~loc exp else exp + +let mkpat_local_if p pat = + if p then mkpat_stack pat else pat + +let mktyp_local_if p typ = + if p then mktyp_stack typ else typ + +let wrap_exp_local_if p exp = + if p then wrap_exp_stack exp else exp + +let curry_attr = + Attr.mk ~loc:Location.none (mknoloc "ocaml.curry") (PStr []) + +let is_curry_attr attr = + attr.attr_name.txt = "ocaml.curry" + +let mktyp_curry typ = + {typ with ptyp_attributes = curry_attr :: typ.ptyp_attributes} + +let maybe_curry_typ typ = + match typ.ptyp_desc with + | Ptyp_arrow _ -> + if List.exists is_curry_attr typ.ptyp_attributes then typ + else mktyp_curry typ + | _ -> typ + +let global_loc = mknoloc "ocaml.global" + +let global_attr = + Attr.mk ~loc:Location.none global_loc (PStr []) + +let nonlocal_loc = mknoloc "ocaml.nonlocal" + +let nonlocal_attr = + Attr.mk ~loc:Location.none nonlocal_loc (PStr []) + +let mkld_global ld = + { ld with pld_attributes = global_attr :: ld.pld_attributes } + +let mkld_nonlocal ld = + { ld with pld_attributes = nonlocal_attr :: ld.pld_attributes } + +type global_flag = + | Global + | Nonlocal + | Nothing + +let mkld_global_maybe gbl ld = + match gbl with + | Global -> mkld_global ld + | Nonlocal -> mkld_nonlocal ld + | Nothing -> ld + (* TODO define an abstraction boundary between locations-as-pairs and locations-as-Location.t; it should be clear when we move from one world to the other *) @@ -793,7 +873,7 @@ let mk_directive ~loc name arg = } -# 797 "parsing/parser.ml" +# 877 "parsing/parser.ml" module Tables = struct @@ -803,172 +883,178 @@ module Tables = struct fun _tok -> match _tok with | AMPERAMPER -> - 123 + 126 | AMPERSAND -> - 122 + 125 | AND -> - 121 + 124 | ANDOP _ -> - 120 + 123 | AS -> - 119 + 122 | ASSERT -> - 118 + 121 | BACKQUOTE -> - 117 + 120 | BANG -> - 116 + 119 | BAR -> - 115 + 118 | BARBAR -> - 114 + 117 | BARRBRACKET -> - 113 + 116 | BEGIN -> - 112 + 115 | CHAR _ -> - 111 + 114 | CLASS -> - 110 + 113 | COLON -> - 109 + 112 | COLONCOLON -> - 108 + 111 | COLONEQUAL -> - 107 + 110 | COLONGREATER -> - 106 + 109 | COMMA -> - 105 + 108 | COMMENT _ -> - 104 + 107 | CONSTRAINT -> - 103 + 106 | DO -> - 102 + 105 | DOCSTRING _ -> - 101 + 104 | DONE -> - 100 + 103 | DOT -> - 99 + 102 | DOTDOT -> - 98 + 101 | DOTOP _ -> - 97 + 100 | DOWNTO -> - 96 + 99 | ELSE -> - 95 + 98 | END -> - 94 + 97 | EOF -> - 93 + 96 | EOL -> - 92 + 95 | EQUAL -> - 91 + 94 | EXCEPTION -> - 90 + 93 | EXTERNAL -> - 89 + 92 | FALSE -> - 88 + 91 | FLOAT _ -> - 87 + 90 | FOR -> - 86 + 89 | FUN -> - 85 + 88 | FUNCTION -> - 84 + 87 | FUNCTOR -> - 83 + 86 + | GLOBAL -> + 85 | GREATER -> - 82 + 84 | GREATERRBRACE -> - 81 + 83 | GREATERRBRACKET -> - 80 + 82 | HASH -> - 79 + 81 | HASHOP _ -> - 78 + 80 | IF -> - 77 + 79 | IN -> - 76 + 78 | INCLUDE -> - 75 + 77 | INFIXOP0 _ -> - 74 + 76 | INFIXOP1 _ -> - 73 + 75 | INFIXOP2 _ -> - 72 + 74 | INFIXOP3 _ -> - 71 + 73 | INFIXOP4 _ -> - 70 + 72 | INHERIT -> - 69 + 71 | INITIALIZER -> - 68 + 70 | INT _ -> - 67 + 69 | LABEL _ -> - 66 + 68 | LAZY -> - 65 + 67 | LBRACE -> - 64 + 66 | LBRACELESS -> - 63 + 65 | LBRACKET -> - 62 + 64 | LBRACKETAT -> - 61 + 63 | LBRACKETATAT -> - 60 + 62 | LBRACKETATATAT -> - 59 + 61 | LBRACKETBAR -> - 58 + 60 | LBRACKETGREATER -> - 57 + 59 | LBRACKETLESS -> - 56 + 58 | LBRACKETPERCENT -> - 55 + 57 | LBRACKETPERCENTPERCENT -> - 54 + 56 | LESS -> - 53 + 55 | LESSMINUS -> - 52 + 54 | LET -> - 51 + 53 | LETOP _ -> - 50 + 52 | LIDENT _ -> - 49 + 51 + | LOCAL -> + 50 | LPAREN -> - 48 + 49 | MATCH -> - 47 + 48 | METHOD -> - 46 + 47 | MINUS -> - 45 + 46 | MINUSDOT -> - 44 + 45 | MINUSGREATER -> - 43 + 44 | MODULE -> - 42 + 43 | MUTABLE -> - 41 + 42 | NEW -> + 41 + | NONLOCAL -> 40 | NONREC -> 39 @@ -1137,6 +1223,8 @@ module Tables = struct Obj.repr () | FUNCTOR -> Obj.repr () + | GLOBAL -> + Obj.repr () | GREATER -> Obj.repr () | GREATERRBRACE -> @@ -1205,6 +1293,8 @@ module Tables = struct Obj.repr _v | LIDENT _v -> Obj.repr _v + | LOCAL -> + Obj.repr () | LPAREN -> Obj.repr () | MATCH -> @@ -1223,6 +1313,8 @@ module Tables = struct Obj.repr () | NEW -> Obj.repr () + | NONLOCAL -> + Obj.repr () | NONREC -> Obj.repr () | OBJECT -> @@ -1303,22 +1395,22 @@ module Tables = struct Obj.repr () and default_reduction = - (16, "\000\000\000\000\000\000\003\b\003\007\003\006\003\005\003\004\002\215\003\003\003\002\003\001\003\000\002\255\002\254\002\253\002\252\002\251\002\250\002\249\002\248\002\247\002\246\002\245\002\244\002\243\002\242\002\241\002\214\002\240\002\239\002\238\002\237\002\236\002\235\002\234\002\233\002\232\002\231\002\230\002\229\002\228\002\227\002\226\002\225\002\224\002\223\002\222\002\221\002\220\002\219\002\218\002\217\002\216\000\000\000\000\000*\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003M\001\179\001\158\001\176\001\175\001\174\001\180\001\184\000\000\003N\001\178\001\177\001\159\001\182\001\173\001\172\001\171\001\170\001\169\001\167\001\183\001\181\000\000\000\000\000\000\000\230\000\000\000\000\001\162\000\000\000\000\000\000\001\164\000\000\000\000\000\000\001\166\001\188\001\185\001\168\001\160\001\186\001\187\000\000\003L\003K\003O\000\000\000\000\000\024\001M\000\198\000\000\000\226\000\227\000\023\000\000\000\000\001\210\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003H\000\000\003C\000\000\000\000\003E\000\000\003G\000\000\003D\003F\000\000\003>\000\000\003=\0039\002?\000\000\003<\000\000\002@\000\000\000\000\000\000\000\000\000t\000\000\000\000\000r\000\000\000\000\001K\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\194\001Y\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\000o\000\000\000\000\000\000\000\000\001W\000\000\000\000\001Z\001X\001`\000A\002\147\000\000\001\029\000\000\000\000\000\000\000\015\000\014\000\000\000\000\000\000\000\000\002\196\000\000\002r\002s\000\000\002p\002q\000\000\000\000\000\000\000\000\000\000\001p\001o\000\000\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\003 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000q\000\000\000\241\000\000\002u\002t\000\000\000\000\000\000\001\192\000\000\000\000\000%\000\000\000\000\000\000\000\000\000\000\001_\000\000\001^\000\000\001N\001]\000\000\001L\000b\000\030\000\000\000\000\001\135\000\025\000\000\000\000\000\000\000\000\0038\000(\000\000\000\000\000\031\000\026\000\000\000\000\000\000\000\211\000\000\000\000\000\000\000\213\002I\002;\000\000\000\"\000\000\002<\000\000\000\000\001\189\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\017\003\"\000\000\003#\000\000\000\131\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\000m\000\000\002\201\000p\000s\000n\002\190\003P\002\191\001\250\002\193\000\000\000\000\002\198\002o\002\200\000\000\000\000\000\000\002\207\002\204\000\000\000\000\000\000\001\247\001\233\000\000\000\000\000\000\000\000\001\237\000\000\001\232\000\000\001\249\002\213\000\000\001\248\000{\001\240\000\000\000y\000\000\002\206\002\205\000\000\001\243\000\000\000\000\001\239\000\000\000\000\001\235\001\234\000\000\002\203\000\000\002w\002v\000\000\000\000\002S\002\202\002\199\000\000\000\000\000\000\000\000\001\194\0018\0019\002y\000\000\002z\002x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\252\000\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\000\000\000\000\000\000\000\003e\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\000\000\000\000\000\000\000\000\0029\000\000\000\000\002:\000\000\000\000\001y\000\000\000\000\000\000\001V\001\127\001U\001}\002+\002*\000\000\001x\001w\000\000\000\215\000\000\000\000\001i\000\000\000\000\001m\000\000\001\214\001\213\000\000\000\000\001\212\001\211\001l\001j\000\000\001n\000\000\000\000\000\000\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\151\001[\002\156\002\154\000\000\000\000\000\000\002\167\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\189\000\000\002\188\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\005\000\000\000\000\000\000\000\000\000\000\000\000\000\250\002\004\000\251\000\000\000\000\000\000\001\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\0034\000\000\000\000\000\000\000\000\000\245\000\244\000\000\000\246\000\000\000\000\000\000\002\164\000\000\000\000\000\000\002\127\002~\000\000\000\000\000\000\000\000\003Q\002\166\002\153\002\152\000\000\000\000\000\179\000\000\000\000\000\000\000\000\000\000\000\193\000\000\000\000\000\000\000\178\000\000\000\000\000\000\002Z\002Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\000\003\011\000\000\000\000\000\205\000\204\000\255\000\000\003\012\003\r\000\000\000\000\000z\000\000\002\208\002\192\000\000\002\211\000\000\002\210\002\209\000\000\000\000\000\000\000\000\000\000\000\000\001\003\000\000\000\000\0021\000\000\000\000\000\000\001\002\000\000\000\000\001\001\001\000\000\000\000\000\000\000\000\000\001\005\000\000\000\000\001\004\000\000\001\246\000\000\000\000\002\001\000\000\000\000\002\003\000\000\000\000\001\255\001\254\001\252\001\253\000\000\000\000\000\000\000\000\000\000\001#\000\018\001\007\000\000\000\000\000\000\002\129\002\128\000\000\000\000\002\143\002\142\000\000\000\000\000\000\000\000\002\139\002\138\000\000\000\000\002M\000\000\000\000\002\137\002\136\000\000\000\000\002\141\002\140\002\160\000\000\000\000\000\000\000\000\000\000\002\133\000\000\000\000\000\000\000\000\000\000\002\131\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\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\002-\002,\000\177\000\000\002\132\000\000\000\000\002\130\000\000\000\000\002\134\000\000\000\132\000\133\000\000\000\000\000\000\000\000\000\148\000\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\207\000\000\000\208\000\209\000\141\000\000\000\140\000\000\000\000\001;\000\000\001<\001:\0023\000\000\000\000\0024\0022\000\000\000\000\000\000\000\000\000\000\001\014\000\000\000\000\001\015\000\000\000\000\000\180\000\000\001\017\001\016\000\000\000\000\002\168\002\161\000\000\002\177\000\000\002\178\002\176\000\000\000\000\000\000\000\000\000\000\000f\000h\000e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0028\000g\0027\002\184\000\000\002\186\000\000\002\187\002\185\000\000\000\000\000\000\000\000\000\000\000j\000l\000i\000k\002\183\000\000\000\000\002\163\002\162\000\000\000\000\000\000\002\027\000\000\001\208\000\000\000\000\000\000\002V\002\026\000\000\002\172\002\171\000\000\000\000\000\000\001\\\000\000\002\145\000\000\002\146\002\144\000\000\002\170\002\169\000\000\000\000\000\000\002P\002\159\000\000\002\158\002\157\000\000\002\180\002\179\000\000\002\181\000\138\000\000\000\000\000\000\000\000\000\137\000\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\000\000\001c\000\000\000\000\000\000\000u\000\000\000\000\000v\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\235\000\000\000\000\000\127\000\000\000\238\000\236\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\136\000w\000\000\000\000\002\025\000\000\000\000\001\006\001\206\000\000\000\248\000\249\001\r\000\000\000\000\000\000\000\000\000\000\001\221\001\215\000\000\001\220\000\000\001\218\000\000\001\219\000\000\001\216\000\000\000\000\001\217\000\000\001\155\000\000\000\000\000\000\001\154\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\001\025\003\026\000\000\000\000\003\025\000\000\000\000\000\000\000\000\000\000\002\n\000\000\000\000\000\000\000\000\000\000\000\000\003\031\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\139\000\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\n\000\000\000\000\002[\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\157\000\000\000\000\000\000\001\156\000\000\000\000\000\000\000\000\000\000\001r\000\000\001q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\027\002i\000\000\000\000\000\000\002g\000\000\000\000\000\000\002f\000\000\001e\000\000\000\000\000\000\000\000\002l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003Y\000\000\000\000\000\000\000\203\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000E\000\000\000\000\000\000\000\000\001\134\000\000\001\133\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\002\023\000\000\002\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000I\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\000\000\000\000\000\000\000O\000M\000\000\000R\000\000\000\000\000\000\000\000\000\000\000G\000\000\000\000\000\000\000\000\000\000\000\000\000J\000\000\000Q\000P\000\000\000K\000L\000\000\001,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\023\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000^\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\021\002m\002_\000\000\002e\002`\002k\002j\002h\001&\000\000\002]\000\000\000\000\000\000\000\000\000\000\002(\000\000\000\000\001\031\002a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\150\001\146\000\000\000\000\000\000\000\220\000\000\000\000\002\030\002(\000\000\000\000\001!\002\028\002\029\000\000\000\000\000\000\000\000\000\000\001\153\001\149\001\145\000\000\000\000\000\221\000\000\000\000\001\152\001\148\001\144\001\142\002b\002^\002n\001%\002\007\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\003T\000\000\000\000\003V\000\000\0006\000\000\000\000\003\\\000\000\003[\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003S\000\000\000\000\003U\000\000\000\000\000\000\002\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001J\000\000\000\000\001H\001F\000\000\0007\000\000\000\000\003_\000\000\003^\000\000\000\000\000\000\001D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\000\000\000\001G\001E\000\000\000\000\000\000\0009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000X\000\000\000\000\000\000\000\000\000\000\000\000\0003\000\000\000\000\000W\000\000\0001\001\n\000\000\000@\000-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000V\000U\000\000\000\000\000[\000Z\000\000\000\000\001\196\000\000\0005\000\000\000\000\000\000\0004\000\000\000\000\000\000\0008\000\000\000Y\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\001\019\003\029\003\020\000\000\000\000\003\024\003\t\003\019\003\028\003\027\001*\000\000\000\000\003\017\000\000\003\021\003\018\003\030\002\006\000\000\000\000\003\015\000\000\000\201\003\014\000\000\000\000\000\232\000\000\000\000\001)\001(\000\000\001g\001f\000\000\000\000\002\212\002\195\000\000\000B\000\000\000\000\000C\000\000\000\000\000\152\000\151\002\175\000\000\002\174\002\173\000\000\002\182\002\155\000\000\000\000\000\000\000\000\002\148\000\000\002\150\000\000\002\149\000\000\002|\002{\000\000\002}\000\000\000\000\000\144\000\000\000\000\002\015\000\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\199\000\000\003\023\002#\002$\002\031\002!\002 \002\"\000\000\000\000\000\000\000\200\000\000\000\000\002(\000\000\000\224\000\000\000\000\000\000\000\000\003\022\000\000\000\197\000\000\000\000\000\000\000\000\001C\001=\000\000\000\000\001>\000\029\000\000\000\028\000\000\000\000\000\212\000\000\000\000\000\000\000 \000\027\000\000\000\000\000\000\000\021\000\000\000\000\000\000\000\000\001\151\001\147\000\000\001\143\0037\000\000\002(\000\000\000\223\000\000\000\000\000\000\000\000\002d\002'\002%\002&\000\000\000\000\000\000\002(\000\000\000\222\000\000\000\000\000\000\000\000\002c\000\000\001t\001s\000\000\000\022\000\000\003W\000\000\000+\000\000\000\000\000\000\000\000\000\147\000\000\000\228\000\001\000\000\000\000\000\231\000\002\000\000\000\000\000\000\001P\001Q\000\003\000\000\000\000\000\000\000\000\001S\001T\001R\000\019\001O\000\020\000\000\001\222\000\000\000\004\000\000\001\223\000\000\000\005\000\000\001\224\000\000\000\000\001\225\000\006\000\000\000\007\000\000\001\226\000\000\000\b\000\000\001\227\000\000\000\t\000\000\001\228\000\000\000\000\001\229\000\n\000\000\000\000\001\230\000\011\000\000\000\000\000\000\000\000\000\000\003*\003%\003&\003)\003'\000\000\003.\000\012\000\000\003-\000\000\0010\000\000\000\000\003+\000\000\003,\000\000\000\000\000\000\000\000\0014\0015\000\000\000\000\0013\0012\000\r\000\000\000\000\000\000\003J\000\000\003I") + (16, "\000\000\000\000\000\000\003\026\003\025\003\024\003\023\003\022\002\231\003\021\003\020\003\019\003\018\003\017\003\016\003\015\003\014\003\r\003\012\003\011\003\n\003\t\003\b\002\250\003\007\003\006\003\005\003\004\003\003\003\002\002\230\003\001\003\000\002\255\002\254\002\253\002\252\002\251\002\249\002\248\002\247\002\246\002\245\002\244\002\243\002\242\002\241\002\240\002\239\002\238\002\237\002\236\002\235\002\234\002\233\002\232\000\000\000\000\000*\000\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003q\001\195\001\174\001\192\001\191\001\190\001\196\001\200\000\000\003r\001\194\001\193\001\175\001\198\001\189\001\188\001\187\001\186\001\185\001\183\001\199\001\197\000\000\000\000\000\000\000\229\000\000\000\000\001\178\000\000\000\000\000\000\001\180\000\000\000\000\000\000\001\182\001\204\001\201\001\184\001\176\001\202\001\203\000\000\003p\003o\003s\000\000\000\000\000\024\001Y\000\199\000\000\000\225\000\226\000\023\000\000\000\000\001\226\001\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003l\000\000\003g\000\000\000\000\003i\000\000\003k\000\000\003h\003j\000\000\003b\000\000\003a\003]\002O\000\000\003`\000\000\002P\000\000\000\000\000\000\000\000\000t\000\000\000\000\000r\000\000\001W\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\194\001e\000\000\000\000\000\000\000\000\000\000\000\000\0028\000\000\000\000\000\000\000\000\000\000\000\000\000o\000\000\000\000\000\000\000\000\001c\000\000\000\000\001f\001d\001l\000A\002\163\000\000\001$\000\000\000\000\000\000\000\015\000\014\000\000\000\000\000\000\000\000\002\212\000\000\002\130\002\131\000\000\002\128\002\129\000\000\000\000\000\000\000\000\000\000\001|\001{\000\000\002\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003E\003D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000q\000\000\000\240\000\000\002\133\002\132\000\000\000\000\000\000\001\208\000\000\000\000\000%\000\000\000\000\000\000\000\000\000\000\001k\000\000\001j\000\000\001Z\001i\000\000\001X\000b\000\030\000\000\000\000\001\151\000\025\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\031\000\026\000\000\000\000\000\000\000\000\003%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000\000\000\000\000\000\000\000\000\000\003 \000\000\003$\002Y\000\212\002K\000\000\000\"\000\000\002L\000\000\000\000\001\205\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\017\003F\000\000\003G\000\000\000\131\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\000m\000\000\002\217\000p\000s\000n\002\206\003t\002\207\002\n\002\209\000\000\000\000\002\214\002\127\002\216\000\000\000\000\000\000\002\223\002\220\000\000\000\000\000\000\002\007\001\249\000\000\000\000\000\000\000\000\001\253\000\000\001\248\000\000\002\t\002\229\000\000\002\b\000{\002\000\000\000\000y\000\000\002\222\002\221\000\000\002\003\000\000\000\000\001\255\000\000\000\000\001\251\001\250\000\000\002\219\000\000\002\135\002\134\000\000\000\000\002c\002\218\002\215\000\000\000\000\000\000\000\000\001\210\001?\001@\002\137\000\000\002\138\002\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\254\000\000\000\253\000\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\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\134\000\000\000\000\000\000\000\000\000\000\000\000\003\137\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\000\000\000\000\000\000\000\000\002I\000\000\000\000\002J\000\000\000\000\001\133\000\000\000\000\000\000\001b\001\139\001a\001\137\002;\002:\000\000\001\132\001\131\000\000\000\214\000\000\000\000\001u\000\000\000\000\001y\000\000\001\230\001\229\000\000\000\000\001\228\001\227\001x\001v\000\000\001z\000\000\000\000\000\000\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\167\001g\002\172\002\170\000\000\000\000\000\000\002\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\205\000\000\002\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\002\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\251\000\000\000\000\000\250\002\020\000\252\000\000\000\000\000\000\001\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003Y\000\000\000\000\003X\000\000\000\000\000\000\000\000\000\244\000\243\000\000\000\245\000\000\000\000\000\000\002\180\000\000\000\000\000\000\002\143\002\142\000\000\000\000\000\000\000\000\003u\002\182\002\169\002\168\000\000\000\000\000\179\000\000\000\000\000\000\000\000\000\000\000\193\000\000\000\000\000\000\000\178\000\000\000\000\000\000\002j\002i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\001\000\000\000z\000\000\002\224\002\208\000\000\002\227\000\000\002\226\002\225\001\000\000\000\001C\000\000\000\000\001B\001\002\001A\001E\000\000\001D\000\000\000\000\001\003\000\000\000\000\000\000\002A\000\000\000\000\000\000\001\b\000\000\000\000\001\006\001\012\000\000\000\000\000\000\000\000\000\000\000\000\003\029\000\000\000\000\000\206\000\205\000\000\003\030\003\031\000\000\000\000\000\000\000\000\000\000\000\000\001\t\000\000\000\000\000\000\000\000\001\007\000\000\000\000\001\005\001\004\000\000\000\000\000\000\000\000\001\011\000\000\000\000\001\n\000\000\002\006\000\000\000\000\002\017\000\000\000\000\002\019\000\000\000\000\002\015\002\014\002\012\002\r\000\000\000\000\000\000\000\000\000\000\001*\000\018\001\014\000\000\000\000\000\000\002\145\002\144\000\000\000\000\002\159\002\158\000\000\000\000\000\000\000\000\002\155\002\154\000\000\000\000\002]\000\000\000\000\002\153\002\152\000\000\000\000\002\157\002\156\002\176\000\000\000\000\000\000\000\000\000\000\002\149\000\000\000\000\000\000\000\000\000\000\002\147\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\151\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\177\000\000\002\148\000\000\000\000\002\146\000\000\000\000\002\150\000\000\000\132\000\133\000\000\000\000\000\000\000\000\000\148\000\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\208\000\000\000\209\000\210\000\141\000\000\000\140\000\000\000\000\001G\000\000\001H\001F\002C\000\000\000\000\002D\002B\000\000\000\000\000\000\000\000\000\000\001\021\000\000\000\000\001\022\000\000\000\000\000\180\000\000\001\024\001\023\000\000\000\000\002\184\002\177\000\000\002\193\000\000\002\194\002\192\000\000\000\000\000\000\000\000\000\000\000f\000h\000e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002H\000g\002G\002\200\000\000\002\202\000\000\002\203\002\201\000\000\000\000\000\000\000\000\000\000\000j\000l\000i\000k\002\199\000\000\000\000\002\179\002\178\000\000\000\000\000\000\002+\000\000\001\224\000\000\000\000\000\000\002f\002*\000\000\002\188\002\187\000\000\000\000\000\000\001h\000\000\002\161\000\000\002\162\002\160\000\000\002\186\002\185\000\000\000\000\000\000\002`\002\175\000\000\002\174\002\173\000\000\002\196\002\195\000\000\002\197\000\138\000\000\000\000\000\000\000\000\000\137\000\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\000\000\001o\000\000\000\000\000\000\000u\000\000\000\000\000v\000\000\000\000\000\000\000\000\001\145\001\143\001\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\234\000\000\000\000\000\127\000\000\000\237\000\235\000\000\000\000\000\000\000\216\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000w\000\000\000\000\002)\000\000\000\000\001\r\001\222\000\000\000\248\000\000\000\000\000\247\000\249\001\020\000\000\000\195\000\000\000\000\000\000\000\000\001\237\001\231\000\000\001\236\000\000\001\234\000\000\001\235\000\000\001\232\000\000\000\000\001\233\000\000\001\171\000\000\000\000\000\000\001\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \003>\000\000\000\000\003=\000\000\000\000\000\000\000\000\000\000\002\026\000\000\000\000\000\000\000\000\000\000\000\000\003C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\155\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\003\028\000\000\000\000\002k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\173\000\000\000\000\000\000\001\172\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\000\000\000\000\000\000\000\000\000\000\000\001\"\002y\000\000\000\000\000\000\002w\000\000\000\000\000\000\002v\000\000\001q\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\003}\000\000\000\000\000\000\000\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000E\000\000\000\000\000\000\000\000\001\150\000\000\001\149\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\002'\000\000\002&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000I\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\000\000\000\000\000\000\000O\000M\000\000\000R\000\000\000\000\000\000\000\000\000\000\000G\000\000\000\000\000\000\000\000\000\000\000\000\000J\000\000\000Q\000P\000\000\000K\000L\000\000\0013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\030\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000^\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\028\002}\002o\000\000\002u\002p\002{\002z\002x\001-\000\000\002m\000\000\000\000\000\000\000\000\000\000\0028\000\000\000\000\001&\002q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\166\001\162\000\000\000\000\000\000\000\219\000\000\000\000\002.\0028\000\000\000\000\001(\002,\002-\000\000\000\000\000\000\000\000\000\000\001\169\001\165\001\161\000\000\000\000\000\220\000\000\000\000\001\168\001\164\001\160\001\158\002r\002n\002~\001,\002\023\002l\000\000\000\000\000\000\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\141\000\000\000\000\000\000\003x\000\000\000\000\003z\000\000\0006\000\000\000\000\003\128\000\000\003\127\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003w\000\000\000\000\003y\000\000\000\000\000\000\002\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001V\000\000\000\000\001T\001R\000\000\0007\000\000\000\000\003\131\000\000\003\130\000\000\000\000\000\000\001P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001U\000\000\000\000\001S\001Q\000\000\000\000\000\000\0009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000X\000\000\000\000\000\000\000\000\000\000\000\000\0003\000\000\000\000\000W\000\000\0001\001\017\000\000\000@\000-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\015\000\000\000V\000U\000\000\000\000\000[\000Z\000\000\000\000\001\212\000\000\0005\000\000\000\000\000\000\0004\000\000\000\000\000\000\0008\000\000\000Y\000\\\000\000\000:\000;\000\000\0015\000\000\000\000\000\000\000\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\026\003A\0038\000\000\000\000\003<\003\027\0037\003@\003?\0011\000\000\000\000\0035\000\000\0039\0036\003B\002\022\000\000\000\000\0033\000\000\000\202\0032\000\000\000\000\000\231\000\000\000\000\0010\001/\000\000\001s\001r\000\000\000\000\002\228\002\211\000\000\000B\000\000\000\000\000C\000\000\000\000\000\152\000\151\002\191\000\000\002\190\002\189\000\000\002\198\002\171\000\000\000\000\000\000\000\000\002\164\000\000\002\166\000\000\002\165\000\000\002\140\002\139\000\000\002\141\000\000\000\000\000\144\000\000\000\000\002\031\000\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\003;\0023\0024\002/\0021\0020\0022\000\000\000\000\000\000\000\201\000\000\000\000\0028\000\000\000\223\000\000\000\000\000\000\000\000\003:\000\000\000\198\000\000\000\000\000\000\000\000\000\000\003#\000\000\000\000\000\000\000\000\000\000\003\"\000\000\000\000\000\000\000\000\001O\001I\000\000\000\000\001J\000\029\000\000\000\028\000\000\000\000\000\000\000\000\000 \000\027\000\000\000\000\000\000\000\021\000\000\000\000\000\000\000\000\001\167\001\163\000\000\001\159\003[\000\000\0028\000\000\000\222\000\000\000\000\000\000\000\000\002t\0027\0025\0026\000\000\000\000\000\000\0028\000\000\000\221\000\000\000\000\000\000\000\000\002s\000\000\001\128\001\127\000\000\000\022\000\000\003{\000\000\000+\000\000\000\000\000\000\000\000\000\147\000\000\000\227\000\001\000\000\000\000\000\230\000\002\000\000\000\000\000\000\001\\\001]\000\003\000\000\000\000\000\000\000\000\001_\001`\001^\000\019\001[\000\020\000\000\001\238\000\000\000\004\000\000\001\239\000\000\000\005\000\000\001\240\000\000\000\000\001\241\000\006\000\000\000\007\000\000\001\242\000\000\000\b\000\000\001\243\000\000\000\t\000\000\001\244\000\000\000\000\001\245\000\n\000\000\000\000\001\246\000\011\000\000\000\000\000\000\000\000\000\000\003N\003I\003J\003M\003K\000\000\003R\000\012\000\000\003Q\000\000\0017\000\000\000\000\003O\000\000\003P\000\000\000\000\000\000\000\000\001;\001<\000\000\000\000\001:\0019\000\r\000\000\000\000\000\000\003n\000\000\003m") and error = - (124, "'\225 \197\138\173\2433\208\020\015\228\000\003\142\0026\016\004\\(\223\018}\000@\248\000\000\024\224}\246D\b/\227P\000L\028\030\227\139\002\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235f\245\155\175\2437\252\149\031\226\017\007\158\007\223d@\130\2545\000\004\193\193\2388\176(4\000\000\000\000\000\000\000\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\000E\130\141\241'\208\004\015\128\000\001\142\007\223d@\130\2545\000\004\193\193\2388\176(4'\225\"\213\138\173\2433\208\020\015\224\000\007\142\000\000\000\000\004\000\012\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\128\000\128\007\224,$\000\003\226 \016@\016(\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\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\002\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\128\000\b\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\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\128\000\b\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\017\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\b\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\000\000\000\000\000\000\000\000\000\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\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\004\000\0000\000\007\001\000\012\\ \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\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\004\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\0000\000\007\001\002\012\\ \000\016\000\000\000\000\000\001\000@@@ \193\004\000\000\016\000\000\000\000\000\016\004\004\000\002\012\016@\000\001\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\002 \004\132\128 \128\b \002\020\000\016\000b\000\002\000\bH\002\b\000\130\000!\000\001\000\006 \000 \000\003\000\000$\193\004\192\004\000\128\000\000\000\000\b\0000\000\002H\016L\000@\b\000\000\000\000\000\128\003\000\000$\129\004\192\000\000\128\000\000\000\000\b\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\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\192\000\000\128\000\000\000\000\b\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\002H\000@\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\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\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\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\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\002\000\000$\128\004\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\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\000!\128\001\000\007`\017 \004\003 \000x\016\000\197\194\128\001\000\128 \000\016\bH\002(\000\194\t!\192\001\016\006a\016a\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\000\007\001\000\012\\(\000\016\b\002\000\001\000\003\000\bp\016 \197\194\000\001\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\128\187\128\b2R\028\012\017 v\001f\017`0\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\018\000\002\000\000\000\001\000\016\000\000\000@\000\000\001 \000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bP\t\026\000\001$!\192\192\018\001!\018\000\016}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224\000\000\000\000\000\000\000\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$\193\004\192\004\000\128\000\000\000\000\b\0000\000\002H\016L\000@\b\000\000\000\000\000\128\003\000\000$\129\004\192\000\000\128\000\000\000\000\b\0000\000\002H\000L\000\000\b\000\000\000\000\000\128\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\001!\128\001\016\007`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\016 \004}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224#a\000E\194\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\000\128\193#\144\000\001\128\000\001\140\000\016\000\000\004\000\004\000@\000\000\000\000\000\000\000\001\000\000\000\000\000@\004\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\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235w\253\155\239\247\255\252\157?\230!\003\158@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\163a\136G\226\173\245#\211\230/\144@\025\174\184\018\016\132@\b\012\0189\000\000\024\000\000\024\192#a\000E\130\141\241#\208\004\015\128\000\001\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\b@\000\b\004\000(!@\192\000\000 \016\000\000\132\000\000\128\000\002\130\020\012\000\000\002\001\000\000\b@\000\b\000\000(!\000\192\000\000 \016\000\000\003!\000@\128\004\193\"\208\001\001\160\000\001\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\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\001\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\131!\136G\224,\229\"\211\227!\176@\025,\184\000\000\128\000\000\000\000\001\000\000\016\000\000\000\000\131\000\000\000@\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000@\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\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\016\004\004\000\002\012\016\000\000\001\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\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\167\225 \197\138\173\2437\208\020\015\226\000\003\142\n~\018\012X\170\2233=\001@\254 \0008\224\167\225\"\197\138\173\2433\208\020\015\230\000\003\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002\000@@\000\129\004\000\000\016\000\000\000\b\000\016 \004\004\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\005\002\000@\000\000\129\000\000\000\016\000\000\000\000\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\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\016\004\\(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018=\000@\248\000\000\024\224\213\189\187\215\248\190\223?\191\251c\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\128\004\193\"\208\001\001\128\000\001\004\0002\016\004\b\000L\018-\000\016\026\000\000\020@\003!\002@\128\004\193\"\208\001\001\160\000\001\004\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\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000\000\000\000\001\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\003\000\002p\016\000\197\194\000\001\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\004\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\001\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\001\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\b\000\000\000\128\000\000\000\000\000\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\000\000\000\000\000\000\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\003\184\000\131!!\192\193\018\007`\022!\022\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\012H\011\184\000\131!!\192\193\018\007`\022!\022\003\000\000`\000\000\197\194\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\012X\011\184\000\131%!\192\193\018\007`\022!\022\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\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012X\011\184\000\131%!\192\193\018\007`\022!\022\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\012X\011\184\000\131%!\192\193\018\007`\022!\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\0000\000\007\001\000\012\\ \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\002\000\000\000\001\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\002\003\000\000p\016\000\197\194\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\002\000\000\000\000\004\000\000 \000\000\000\017 \000\000\002\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\002\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\002\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\003\184\000\131!!\192\193\018\007`\022!\020\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\0000\000\007\001\000\012\\ \000\016\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\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\000\000\000\000\000\002\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\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\b\000\001\016\000\000\000\000@\000\000\001\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\016\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\016@\003!\000@\192\004\193&\144\001\001\128\000\001\004\0002\016\004\b\000L\018i\000\016\024\000\000\016@\003!\000@\128\004\193\"\144\001\001\128\000\001\004\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147)\027P\144\020\193&\176\t\001\148 mU\000\000\016\000\b\000@\000\001\000\000\016\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\t2\145\181\t\001L\018o\000\144\027A\006\213P\001\000\000\000\000\000\128\"\128\000\000\000\000\000\000\b2\016\132\b\000L\018-\000\016\026\000\000\144@\000\000\000\000\000\000\000\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@\192\004\193&\208\001\001\160\000\001\004\0002\016\004\b\000L\018m\000\016\026\000\000\016@\003!\000@\128\004\193\"\208\001\001\160\000\001\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\t\000\001\176\000\001\000\000@\000\128\001@\004\197\016\003!\000@\128\004\193\"\208\001\001\160\000\001\004\t\000\001\176\000\001\000\000@\000\128\001@\004\197\016\131!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\004\000\b\000\020\000LQ\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147!\027@\128\020\193&\208\t\001\180\000MU\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t2\017\180\b\001L\018m\000\144\027@\004\213P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\b\000\000\128\000\000\000\000@\000\000\000\000\004\129\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\131!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\004\000\b\000\020\000LQ\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\001\000\000@\000\128\001@\004\197\016\128\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\000\000\000\000\000\000\000\0002\016$\b\000L\018-\000\016\026\000\000\016@\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\018\000\000\000\000\004\000\000\000\000\000HQ\b2\016$\b\000L\018-\000\016\026\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\000\000\000\000\000\000\b\000\001\016\000\000\000\000@\000\000\000\000\004\129\016\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\b0\000\016\000\000\004\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\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\003)\000P\144\004\193&\176\001\001\144\000M\021\000\000\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\128\000\000\000\000\000\000\000\001\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\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\000\000\000\000\000\000\000\000\000\000\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\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\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016D\012\130L\018m\000\016\026\000\000\016@\001\002\000@@\000\129\004\000\000\016\000\000\000\b\000\016 \004\004\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\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\b\000\000\000\000\000\000\000\000\000\003\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\004\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\001\000@@\000 \193\000\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\128\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\000\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\000\"\000@\b\000\000\000\002\000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\192\000\000\128\000\000\000\000\b\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\016\000\016\000\0000\000\007\129\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\000\"\001@0\000\007\001\000\012\\ \000\016\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\001\"\001LH\002\168\000\131\001!\192\001\016\007`\018 \004\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\018 \004\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\016\016\016\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\146\028\000\017\000v\016\"\000@\016\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\012H\002\168\000\131\t!\192\001\016\007a\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\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\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\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\001\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\b\000\000\016\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\004\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\000\000\000\000\000\001\b\000\000\000\000\000\000\000\000\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\146\028\000\025\000v\000&\000@P \132\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\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\001\000@@\000 \193\000\000\000\016\000\000\000\000\012\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\146\028\000\025\000v\016&\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\b\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224#a\002E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\004\000\000\000\004\000\000\000\000\000\128\000\016\000\000\000\000\000\000\000@\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\001!\000D\000\128\193#\144\000\001\128\000\001\140\012\000\001\016\000\000\000\000\000\0000\001\005\002@\000#a\000E\194\141\241'\208\004\015\130\000\001\142\0026\016\004X(\223\018}\000@\248 \000\024\224#a\000E\130\141\241#\208\004\015\130\000\001\142\000\018\016\004D\b\012\018y\000\000\024\000\000\024\192\001!\000D\000\128\193'\144\000\001\128\000\001\140\000\018\016\004@\b\012\0189\000\000\024\000\000\024\192\001!\000D\000\128\193#\144\000\001\128\000\001\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r[\219\189\127\139\237s\251\255\182?}\183\255\223\001\000\000\000\000\000\192#\128\000\000\000\000\000\000\n6\024\132~*\223R=>b\249\004\001\154\235\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n6\016\132X(\223\018=\000@\248\000\000\024\224\163a\bE\130\141\241#\208\004\015\128\000\001\142\b\016 \004\004\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\128\004\000\000\000\000\000\004\000\b\016\004\004\000\002\012\016\000\000\001\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\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\n6\016\132X(\223\018=\000@\248\000\000\024\224\163a\bE\130\141\241#\208\004\015\128\000\001\142\b2\016\132\b\000L\018-\000\016\024\000\000\016@\000\000\000\000\000\000\000\004\000\000\000\016\000L\017\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224#a\000E\194\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\004\001\000\000\000\000\001\000\000@\000\000\000\000\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\144\005\r\000L\018k\000\016\024\000\000\016@\003)\000P\144\004\193&\176\001\001\128\000\001\004\0002\144\005\t\000L\018+\000\016\024\000\000\016@\002\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\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\128\000\000\000\000@\000\000\001\000\004\193\016\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\001\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\016\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\b:\024\132~\002\206R->2\027\004\001\146\203\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\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\003)\000P\144\020\193\"\176\001\001\128\000\005\004\0026\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\004\0002\016\004\b\000L\018m\000\016\026\000\000\016@\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\000\018\016\004D\b\012\018y\000\000\024\000\000\024\192\001!\000D\000\128\193'\144\000\001\128\000\001\140\000\018\016\004@\b\012\0189\000\000\024\000\000\024\192\212\148\187\131\232>\022\028\015\251bw\219~p\240\018\016\004@\b\012\0189\000\000\024\000\000\024\192\213\189\187\215\248\190\215?\191\251c\247\219\127\253\240\000\000\000\000\000\b\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0026\016\004X(\223\018=\000@\248\000\000\024\224\213\189\187\215\248\190\215?\191\251c\247\219\127\252\240\000\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\002@\000\131\000\000p\016\000\197\194\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\025\000\000\000\000\004\000\000\000\016\000\000\000\b0\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\144\000\000\000\000@\000\000\001\000\002\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b\000\001\144\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\000\000\000\000\000\000\000\000\000\000\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\018\016\004@\b\012\0189\000\000\024\000\000\024\192\213\189\187\215\248\190\215?\191\251c\247\219\127\253\240\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\016\000\000\000\000\012\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212\148\187\131\232>\022\028\015\249bw\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\213\189\187\215\248\190\215?\191\251c\247\219\127\252\253IK\184>\131\225a\192\255\182'}\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\000B6\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r[\219\189\127\139\237s\251\255\182?}\183\255\207\212\148\187\131\232>\022\028\015\251bw\219~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\127[\188~\171\255s\253\255\214\255x\183\255\239}\246D\b/\227P\000L\028\030\227\139\002\131B6\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\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\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015\003!\000@\128\004\193&\208\001\001\128\000\001\004\0002\016\004\b\000L\018-\000\016\024\000\000\016@\003)\000P\144\004\193&\176\001\001\144\000m\021\b:\024\132~\002\206R->2\027\004\001\146\203\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\003)\000P\144\004\193\"\176\001\001\144\000%\004\0002\016\004\b\000L\018)\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\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#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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)\000P\144\004\193\"\176\001\001\144\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\128\000\000\000\000\001\000\000\016\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\128\000\b\000\000\000\000\004\000\000\000\000\000L\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b0\000\007\001\000\012\\ \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\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\131\128\000p\016\000\197\194\000\001\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\016\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\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\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\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\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\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\016\000L\017\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\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\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\000@\128\004\193\"\208\001\001\160\000\001\004\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\016\000H\017\b2\016\004\b\000L\018-\000\016\026\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\004\129\016\131!\000@\128\004\193\"\208\001\001\160\000\001\004\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\016\000H\017\b\000\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\000\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\016\000H\017\0002\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\bH\002(\000\130\001!\128\001\144\006`\000 \004\132\128\"\128\b\"\018\024\012\025\000f\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\212\148\187\131\232>\022\028\015\249bw\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\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\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\129\003\224\012\004\004\003\224 \016\000X 0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\000\000\000\000\000\000\000\000\000\128\002\128\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\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\b\000\t\176>\000\192@@>\002\001\000\005\134\003\163a\011E\130\141\241#\208\004\015\128\000\001\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\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#a\000E\130\141\241#\208\004\015\128\000\001\142\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\000\000\000\000\000\000\000\000\000\018\016\004@\b\012\0189\000\000\024\000\000\024\192\213\189\187\215\248\190\215?\191\251c\247\219\127\253\240\000\000\000\000\000\b\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\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\r[\219\189\127\139\237\243\251\255\182?}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\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\r[\219\189\127\139\237\243\251\255\182?}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\213\189\187\215\248\190\223?\191\251c\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\212\148\187\131\232>\022\028\015\249bw\139~p\248\000\t\016>\000\192@@>\002\001\000\005\130\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\012\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\213\189\187\215\248\190\223?\191\251c\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\212\148\187\131\232>\022\028\015\249bw\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\r[\219\189\127\139\237\243\251\255\182?}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\b\016>\000\192@@>\002\001\000\005\130\003\213\189\187\215\248\190\223?\191\251c\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\212\148\187\131\232>\022\028\015\249bw\139~p\240\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000\128\002\128\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\r[\219\189\127\139\237\243\251\255\182?}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\213\189\187\215\248\190\223?\191\251c\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\212\148\187\131\232>\022\028\015\249bw\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\r[\219\189\127\139\237\243\251\255\182?}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\rIK\184>\131\225a\192\255\150'x\183\231\015\213\189\187\215\248\190\223?\191\251c\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\212\148\187\131\232>\022\028\015\249bw\139~p\253[\219\189\127\139\237s\251\255\182?}\183\255\223\213\189\187\215\248\190\215?\191\249c\247\139\127\252\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\000\000\000\000\000\000\000\000\000\000\000\000\128\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#a\000E\130\141\241#\208\004\015\128\000\001\142\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\0026\016\004X(\223\018=\000@\248\000\000\024\224\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\016\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\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\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\b:\024\132~\002\206R->2\027\004\001\146\203\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\003)\000P\144\020\193\"\176\001\001\128\000\005\004\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\001\000\000\000\000\016@\000\000\001\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\144\005\t\001L\018+\000\016\024\000\000P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\144\005\t\001L\018+\000\016\024\000\000P@\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#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\016\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212\148\187\131\232>\022\028\015\249bw\139~p\2402\016\004\b\000L\018-\000\016\026\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\004\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\212\148\187\131\232>\022\028\015\249bw\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\212\148\187\131\232>\022\028\015\249bw\139~p\240\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\016\000H\017\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\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#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\193\"\208\001\001\128\000\001\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\018\016\132@\b\012\0189\000\000\024\000\000\024\192\128\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\0026\016\004X(\223\018=\000@\248\000\000\028\224\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\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\128\000\144\003\224\012\004\004\003\224\"\016\000X`02\016\004\012\000L\018m\000\016\026\000\000\016@\016\000\000\000\000\000\000\000\000\000\002\000\000\000@B6\016\004X(\223\018=\000@\248\000\000\024\224\000\000\128\003\224\012\004\004\003\224\"\016\000X`0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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@\192\004\193&\208\001\001\160\000\001\004\0002\016\004\b\000L\018m\000\016\026\000\000\016@\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000@\000\128\001\000\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\001\000\b >\000\192@@>\002!\000\005\134\007#a\000E\130\141\241#\208\004\015\128\000\001\142\000\001\b\000>\000\192@@>\002\001\b\005\130\003#a\000E\130\141\241#\208\004\015\128\000\001\142\001\000\b >\000\192@@>\002!\000\005\134\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\002E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\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\t >\000\192@@>\002!\000\005\130\003\003!\000@\192\004\193&\208\001\001\160\000\001\004\001\000\000 \000\000\000\000\000\000\000 \000\000\000\004#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\b >\000\192@@>\002!\000\005\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\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\000\000\000\000\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\016\004@\b\012\0189\000\000\024\000\000\024\192@\000\000\000\000\000\000\000\000\003\000\000P\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\b\000\001\016\000\000\000\000\000\000\000\001\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000\000\000\000\001\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\b\016\000\016\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\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\004\000\000\000\000\000\000\000\000\0000\000\005\000\000\000\001\000\000\000\000\000\192#\128\000\000\000\000\000\000\012\000\001\016\000\000\000\000\000\0000\001\005\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rIK\184>\131\225a\192\255\182'}\183\231\015\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\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\b\000\t\016>\000\192@@>\006\001\000\005\130\003\128\000\016\000\000\000\000\000\000\000@\000\000\000\000\b\000\000\000\000\000\004\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\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\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\146\003\224\012\004\004\003\224\"\016\000X 0\000\000\000\000\000\000\000\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\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\000\000\000\b\000@\000\128\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000@\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000@\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\b\000\000\000\000\001\000\000@\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\bH\002(\000\130\t!\192\001\144\006`\000 \004\001\000@@\000 \193\000\000\000\016\000\000\000\000\004\000\000\000\000\001\000\000@\000\000\001\000\000\000\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\bH\002(\000\130\t!\192\001\144\006`\000 \004\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\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\018\000\000\004\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\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\128\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\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\003\000\000`\000\000\197\194\128\001\000\000\000\000\000\000\000\000\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\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\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\016\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\017\000\000\000\000\004\000\000 \000\000\000\001\000\000\001\016\000\000\000\000@\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\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\001\016\000\000\000\000@\000\002\000\000\000\000\016\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\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\b\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\bX\n(\000\131\005!\192\001\144\006`\016!\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\n(\000\130\005!\192\001\144\006`\016!\004\003\000\000`\000\000\197\194\128\001\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\bX\002(\000\130\005!\192\001\144\006`\016!\004\133\128\162\128\b0R\028\000\025\000f\001\002\016@\000\000\000\000\000\000\000@\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\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!\004@\128\004\193&\208\001\001\128\000\001\004\0002\016D\b\000L\018-\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\024\000\000\016@\132\128\"\128\b \018\024\000\025\000f\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\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\rIK\184>\131\225a\192\255\150'x\183\231\015@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\017@\212\148\187\131\232>\022\028\015\249bw\139~p\248\000\b\128>\000\192@@>\002\001\000\007\194\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\129\000@@\000 \193\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\b\000\000\016\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\129\000@@\000 \193\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\b\000\000\016\000\004\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 \193\000\000\000\016\000\000\000\000\004\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\bH\002(\000\130\t!\192\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016 \004\000\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\bH\002(\000\130\t!\192\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\000@\004\000\000\000@\000\000\000\000\000\000\000\001\000\000\000@\000@\004\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000@\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\007`\000 \000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002(\000\131\001!\192\001\016\006`\000 \000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\004\000\000\000\000\004\000\000\000\000\000\000\000\0000\000@\000\000\000\000\000\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\b\000\000\000\000\001\000\000@\000\132\128\"\128\b \018\024\000\017\000f\000\002\000HH\002(\000\130\001!\000\001\016\006`\000 \004\003\000\000\000\000\000\000\004\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\128\000\000\000\000\016\000\004\000\bH\002(\000\130\001!\128\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\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\001\000\000@\000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224\003!\000@\128\004\193\"\208\001\001\160\000\001\004\001\000\000 \000\000\000\000@\000\000\000\000\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224\001\002\000@@\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\bH\002(\000\130\t!\192\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\012\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\000\000\000\000\000\000\000\000\000\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\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\132\129\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000@\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\bH\002(\000\194\001!\192\001\016\007`\000`\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\128\000\132\128\"\128\b \018\028\000\017\000f\016\002\016\000\016\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\b\000\bH\002(\000\130\001!\192\001\016\006`\000 \000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\000\002\000\bH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000x\002/\001\130\012} \001\016\006\000\000 \000\132\128\"\128\b \002\016\000\016\000f\000\002\000\000\016\000\000\004\000\000\000@\000\000\000\000\000\000\128\001\000\000\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\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\b!\128\001\000\006a\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\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\b!\128\001\000\006a\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\000@\004\000\000\000@\000\000\000\000\000\000\000\003\000\004\000\000\000\000\004\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\128\000\000\000\000\016\000\020\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\bH\002(\000\130\b!\128\001\000\006a\000 \000\000\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\000\000\000\004\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\003\000\000\000\000\000\000\004\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\000\000\000\004\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\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\128\000\000\000\000\016\000\004\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\016\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002(\000\131\000!\192\001\000\006`\000 \000\132\128\"\128\b \002\024\000\016\000f\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\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000@@@ \193\004\000\000\016\000\000\000\000\000\016\004\004\000\002\012\016@\000\001\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002(\000\131\000!\192\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\004\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\012 \002\028\000\016\000f\000\006\000\000\136\000\000\004\000\004\000`\000\000\000\000\000\000\000\b\000\000\000@\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\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\000\000\000\000\000 \000\002H\000@\000\000\b\000\000\000\000\000\128\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\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\b@\000\b\000\000(!@@\000\000 \016\000\000\132\000\000\128\000\002\130\016\004\000\000\002\001\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\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\132\000\000\128\000\002\002\016\004\000\000\002\001\000\000\000\128\000\000\000\004\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\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\128\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\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\028\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000@\004\000\000\000\000\000\000\000\000\128\000\000\128\000\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\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\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b@\000\b\000\000 !\192\192\000\001 \016\000\000\132\000\000\128\000\002\002\024\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\018\001\000\000\000\016\000\004\000 \005\016`\000\000\000\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\b\000\016\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\128\000\001\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\002\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\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\002\000\000\000\000\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\018\028\004\017\000v\001\002\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\128\000\001\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\bH\002\168\000\130!!\192A\016\007`\016 \004\132\000\000\128\000\002\002\028\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\198\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\002\001\000\000\b@\000\b\000\000 !\128@\000\000 \016\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\132\000\000\128\000\002\002\024\004\000\000\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\b@\000\b\000\000 !\000@\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\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\001\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\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\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\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\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\bX\n\168\000\131\004!\192\001\016\007`\000`\004\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\000\000\002\000\000\000\000\004\000\000\000\000\000@\016\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\007\001 \r\\ \000\016\000\000\000\000\000\133\128\170\128\b0B\028\000\017\000v\000\002\000HX\n\168\000\131\004!\192\001\016\007`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002\168\000\130\000!\192\001\000\007`\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\132\128\"\128\b \002\024\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\b\000\000\000\000\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\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\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001 \r\\ \000\016\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\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\bH\002(\000\130\000!\000\001\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\128\"\128\b \002\024\000\016\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\016\000\016\000f\000\002\000@ \000\002H\000L\000@\b\000\000\000\000\000\128\002\000\000$\128\004\192\000\000\128\000\000\000\000\b\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000v\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\001\002\000HH\002(\000\130\001!\000\001\016\006`\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\132\128\"\128\b \002\016\000\016\000f\000\002\000@ \000\002H\000L\000@\b\000\000\000\000\000\128\002\000\000$\128\004\192\000\000\128\000\000\000\000\b\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\016\000\0002\000\007\129\000\012\\(\000\016\b\002\000\001\000\003\000\002p\016\000\197\194\000\001\000\000\000\000\020\000\000\000\000\000\004\004\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\bZ\002(\000\130\t!\160\001\016\014`\016 \004\132\128\"\128\012 \018\028\000\017\000f\001\006\016HH\002(\000\130\001!\192\001\016\006`\016!\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\016!\004\001 \000\000\000\000\128\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\bH\002(\000\130\000!\128\001\000\006`\016 \004\132\128\"\128\b \002\016\000\016\000f\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\132\128\"\128\b \018\028\000\017\000v\001\002\000@\018\000\000\128\000\b\000(\000\000\b\002\000\001\000\001 \000\000\000\000\128\002\128\000\000\128 \000\016\000\000\000\000\000\004\004\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\000\000\000\000\132\128\"\128\012 \018\028\000\017\000f\001\006\016HH\002(\000\130\001!\192\001\016\006`\016!\004\000\000\000\000\000\000\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\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\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\0002\144\005\t\000L\018+\000\016\025\000\000P@\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\b@\000\b\000\000(!@\192\000\000 \016\000\000\132\000\000\128\000\002\130\016\012\000\000\002\001\000\000\b@\000\b\000\000 !\000\192\000\000 \016\000\000\b\000\000\000\000@@\004\000\000\000\000\000\000\b\000\000\000\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\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000$\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\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#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\024\012\000\000\002\001\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\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\128\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\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\002\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\016\000$\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\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#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000@\004\000\000\000\000\000\000\b\000\000\000\000\128\000\004\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\0002\144\005\t\000L\018+\000\016\025\000\000P@\003\128\000p\016\000\197\194\000\001\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\016\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\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#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\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\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\128\000\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\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\003\000\000p\016\000\197\194\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\0002\144\005\t\000L\018+\000\016\025\000\000P@\003\128\000p\016\000\197\194\000\001\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\016\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\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#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\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\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\000 \r\016`\000\000@\000\000\000\128\001\000\000@\002\000\209\006\000\000\004\000\000\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\0002\016D\012\128L\018m\000\016\024\000\000\016@}\246D\b/\227P\000L\028\030\227\139\002\131@2\016D\b\000L\018m\000\016\024\000\000\016@\003!\004@\128\004\193\"\208\001\001\128\000\001\004\0002\016\004\b\000L\018-\000\016\024\000\000\016@\000\000\000\000\000\000\000\b\000\b\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\004\000\000\000\000\000\000\b\000\016\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\128\000\001\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\002\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\0002\144\005\t\000L\018k\000\016\024\000\000\016@\003)\000P\144\004\193\"\176\001\001\128\000\001\004\0002\144\005\t\001L\018+\000\016\024\000\000\016@\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\169*\212\024\162\211?\188\017\001\230\001\007\141HZ\146\173A\138-3\251\193\016\030`\016x\212\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002\168\000\130!!\192\193\016\006`\016`\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\132\128*\128\b\"\018\028\012\017\000f\001\006\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\bH\002\168\000\130!!\192\193\016\006`\016`\020\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\128\000\001\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\bH\002\168\000\130!!\192\193\016\006`\016`\020\003!\004@\128\004\193\"\208\001\001\128\000\001\004\0002\016\004\b\000L\018-\000\016\024\000\000\016@\000\000\000\000\000\000\000\b\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\004\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\0000\000\007\001 \r\\ \000\016\000\000\000\000\000\128\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\b@\000\b\000\000 !\192\192\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\000\000\000\000\000\000\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\b@\000\b\000\000 !\192\192\000\000 \016\000\016\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\198\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\024\012\000\000\002\001\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\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\b\000\000 !\128\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\132\000\000\128\000\002\002\016\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\000\002\000@0\000\007\001 \r\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\000\002\000@2\144\005\t\000L\018+\000\016\025\000\000P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\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\0002\144\005\t\000L\018+\000\016\025\000\000P@\132\128\"\128\b \018\024\000\017\000f\000\002\000HH\002(\000\130\001!\000\001\016\006`\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\bH\002(\000\130\001!\000\001\000\006`\000 \000\003!\004@\192\004\193&\208\001\001\128\000\001\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\bH\002(\000\130\001!\000\001\016\006`\000 \004\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\016\000\017\000f\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\bH\002(\000\130\001!\128\001\000\006`\000 \000\132\128\"\128\b \018\016\000\016\000f\000\002\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\bH\002(\000\130\001!\000\001\144\006`\000 \004\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\132\128\"\128\b \018\024\000\016\000f\000\002\000\bH\002(\000\130\001!\000\001\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\128\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\012H\002\168\000\131\t!\192\001\016\007`\002 \004\192\000\b\000\000\016\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\128\000\000\000\000@\000\000\000\000\004\193\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\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\132\000\000\128\000\002\002\016\012\000\000\002\001\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\b\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\128\000\144\003\224\012\004\004\003\224\"\016\000X`0\000\000\000\000\000\000\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\016 \004\004\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\000\000\b\000\000\000\128\004\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000@@\000 \193\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\b\000\000\016\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\128\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\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\131!\000@\128\004\193\"\208\001\001\160\000\001\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212\148\187\131\232>\022\028\015\249bw\139~p\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\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\018\000\000\128\000\b\000 \000\000\b\000\000\001\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\012 \018\028\000\017\000v\000\006\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\000\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\000\000\000\000\000\000\000\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\128\"\128\012 \018\028\000\017\000v\000\006\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\000\002\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\bH\002( \130\001!\128\001\016\007`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\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\000\000\000\000\000\000\000\001 \000\b\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\001\000\132\128\"\128\b \018\024\000\017\000f\000\002\016\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\016\000\000\000\000\004\000\000 \000\000\000\000\000\000\001\000\000\000\000\000\000\000\002\000\000\000\000\000\003\000\000`\000\000\197\198\000\001 \000 \000\000\0000\000\006\000\000\012\\ \000\018\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\001\000\016\000\000\000@\000\000\001 \000\000\000\000\0000\000\006\000\000\012\\ \000\018\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\016\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \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\128\000\000\000\000\000\000\000\000\000\004\000\000\001\000\000\000\000\000@\000\000\001\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\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\000\004\000\000\000\000\b\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\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\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\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\132\128\"\128\b \018\028\000\017\000f\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\0002\000\007\129\000\012\\(\000\016\b\002\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\128\001\000\006`\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\000\000\000\000\000\000\000\001 \000\b\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\001\000\132\128\"\128\b \002\024\000\016\000f\000\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\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\132\128\"\130\b \002\024\000\016\000v\001\018\000@2\000\007\129\000\012\\(\000\016\b\002\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\128\001\000\006`\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\000\000\000\000\000\000\000\001 \000\b\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\001\000\132\128\"\128\b \002\024\000\016\000f\000\002\016\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\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\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\bH\002(\000\130\001!\192\001\016\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\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\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\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\000H\002\b\000\130\000!\000\001\000\006@\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\018\000\000\000\000\012\000 \000\000\b\000\000\000\000\128\000\136\007\224,$\000\003\226 \016@\024(\176\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\001\000\000\000\001\000\000\000\000\000\192\000\000\000\000\000\000\000\000\b\000\b\000~\002\194@\000>\"\001\004\001\130\139\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\000\000\000\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\b\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\0000\000\007\001\000\012\\ \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\0026\016\004X(\223\018=\000@\248\000\000\024\224\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\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\b\000\000\000\000\000A\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\000A\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@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\004\000\000\000\004\000H\017\000\000\000\000\000\000\000\000\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\012\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\001\000\000\000\001\000\000\000\000\000\192\000\000\000\000\000\000\000\000\002~\018\012X\170\2233=\001P\254@\0008\224\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000Z\018\b\000\130\r!\001\001\016\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\002\b\000\130\001!\000\001\016\006A\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\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 \128\b \018\016\000\016\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\b\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\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~\018\012X\170\2233=\001P\254@\0008\224'\225 \197\138\173\2433\208\021\015\228\000\003\142\000H\002\b\000\130\001!\000\001\016\006@\000 \000\004\128 \128\b \018\016\000\017\000d\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\000H\002\b\000\130\001!\128\001\016\006@\000 \000\004\128 \128\b \018\016\000\017\000d\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 \128\b \018\024\000\017\000d\000\002\000\000H\002\b\000\130\001!\000\001\016\006@\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\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000") + (127, "'\225 \197\138V\252\204\244\005\001\252\128\000q\192F\194\000\139\132\141\248\147\232\002\003\224\000\000c\129\247\217\016 \191\198\208\000L\028\015q\197\129A\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235f\245\155W\252\205\255%C\252B \243\192\251\236\136\016_\227h\000&\014\007\184\226\192\160\208\000\000\000\000\000\000\000\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\016\004X$o\196\159@\016\031\000\000\003\028\015\190\200\129\005\2546\128\002`\224{\142,\n\r\t\248H\181b\149\1913=\001@\127\000\000\000\000\0068\b\216@\017`\145\191\018=\000@|\000\000\012pj\222\221\235\252/\171\231\247\255l?}\183\255\207#a\000E\130F\252H\244\001\001\240\000\0001\192\006B\000\129\000\004\160\145h\000\128`\000\000A\000\012\132\001\002\000\tA\"\208\001\000\208\000\000\162\000\025\b\018\004\000\018\130E\160\002\001\160\000\001\004\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\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\000D\000\000\000\000\000\000\000\000\b\000\002\000\000\024\000\003\128\128\003\139\132\000\002\000\000\000\000\000\0000\000\007\001\000\007\023\b\000\004\000\000\000\000(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\028\004\000\028\\ \000\016\000\000\000\000 \001\128\0018\b\0008\184@\000 \000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\224 \000\226\225\000\000\128\000\000\000\001\000\012\000\001\192@\001\197\194\000\001\000\000\000\000\n\000\b\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\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\004\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\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\016\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\003\000\000p\016\000qp\128\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\012H\003\184\000\129\144Hp0D\128\236\002\196\"\192`\000\014\002\000\014.\016\000\b\000\000\000\000\000\000\192\000\024\000\000\020\\ \000\016\000\000\000\000\000b@\029\192\004\012\130C\129\130$\007`\022!\022\003\000\000p\016\000qp\128\000@\000\000\000\000\000\006\000\000\192\000\000\162\225\000\000\128\000\000\000\000\003\018\000\238\000 d\018\028\012\017 ;\000\177\b\182$\005\220\000@\200$8\024\"@v\001b\017`0\000\006\000\000\005\023\b\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\000b\192]\192\004\012\138C\129\130$\007`\022!\022\001\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\006,\005\220\000@\200\1648\024\"@v\001b\017`0\000\006\000\000\005\023\b\000\004\000\000\000\000\000\024\176\023p\001\003\"\144\224`\137\001\216\005\136E\177 \014\224\002\006A!\192\193\018\003\176\011\016\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000qp\128\000@\000\000\000\000\000\006\000\000\192\000\000\162\225\000\000\128\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\024\000\003\128\128\003\139\132\000\002\000\000\000\000\000\0000\000\006\000\000\005\023\b\000\004\000\000\000\000\000\024\144\007p\001\003 \144\224`\137\001\216\005\136E\177 \014\224\002\006A!\192\193\018\003\176\011\016\139\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\006\000\000\224 \000\226\225\000\000\128\000\000\000\000\000\012\000\001\128\000\001E\194\000\001\000\000\000\000\000\006$\001\220\000@\200$8\024\"@v\001b\017lH\003\184\000\129\144Hp0D\128\236\002\196\"\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0001 \014\224\002\006A!\192\193\018\003\176\011\016\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\016\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\014\002\000\014.\016\000\b\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\002\000\000\000\128\000\004\000\000\000\001\000\003\000\000p\016\000qp\128\000@\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\001\192@\001\197\194\000\001\000\000\000\000\000\000\000\000\016\000\000\000\000\b\000\000@\000\000\000\016 0\000\007\001\000\007\023\b\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\128\000\000\000\000@\000\002\000\000\000\000\137\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\001\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\016\000\000\000\000\b\000\000@\000\000\000\017 \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\000b@\029\192\004\012\130C\129\130$\007`\022!\020\000\000\002\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\b\000\024\000\003\128\128\003\139\132\000\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\128\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\000\000\000\000\000\b\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\002\000\000\000\016\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\b\128\000\000\000\000\128\000\000\001\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\002\000\000\000\000\006B\000\129\000\004\160\145h\000\128h\000\000A\000\012\132\001\003\000\tA&\144\001\000\192\000\000\130\000\025\b\002\004\000\018\130M \002\001\128\000\001\004\0002\016\004\b\000%\004\138@\004\003\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\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\147)\027P\144\nPI\172\002@2\132\r\170\160\000\002\000\001\000\004\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\018e#j\018\001J\t7\128H\006\208A\181T\000@\000\000\000\000\016\002(\000\000\000\000\000\000\000A\144\132 @\001($Z\000 \026\000\000\144@\000\000\000\000\000\000\000\000\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\132\001\003\000\tA&\208\001\000\208\000\000\130\000\025\b\002\004\000\018\130M\160\002\001\160\000\001\004\0002\016\004\b\000%\004\139@\004\003@\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\000H\000\r\128\000\004\000\000\128\001\000\001@\004\197\016\003!\000@\128\002PH\180\000@4\000\000 \129 \0006\000\000\016\000\002\000\004\000\005\000\019\020B\012\132\001\002\000\tA\"\208\001\000\208\000\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\000\128\000\016\000 \000(\000\152\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\200F\208 \002\148\018m\000\144\r\160\002j\168\000\000\000\000\000\000\000\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&B6\129\000\020\160\147h\004\128m\000\019U@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\004\000\000\000\000\000\128\000\000\000\000\004\129\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\002\012\132\001\002\000\tA\"\208\001\000\208\000\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\000\128\000\016\000 \000(\000\152\162\016d \b\016\000J\t\022\128\b\006\128\000\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\r\128\000\004\000\000\128\001\000\001@\004\197\016\128\000\000\000\000\000P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\b\018\004\000\018\130E\160\002\001\160\000\001\004\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\128\000\018\000\000\000\000\001\000\000\000\000\000\t\n!\006B\004\129\000\004\160\145h\000\128h\000\000Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\002 \000\000\000\000 \000\000\000\000\001 D \000\004@\000\000\000\000\000\000\000\000\000\000\000\000A\128\000\128\000\000\b\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\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\003)\000P\144\002PI\172\000@2\000\t\162\160\000\000\000\000\000\000\160\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\128\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000 \000\b\000\000`\000\014\002\000\014.\016\000\b\000\000\000\000\000\000\000\002\000\000\000\000\000@\000\000\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\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\005\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\004\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\001\000\000\000\000#a\000E\130F\252H\244\001\001\240\000\0001\192\006B\b\129\144$\224\147h\000\128h\000\000A\000\004\b\001\001\000\001\001\004\000\000\b\000\000\000\004\000\b\016\002\002\000\002\002\b\000\000\016\000\000\000\000\000\016 \004\000\000\004\004\016\000\000 \000\000\000\000\000 @\b\000\000\b\b\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\003\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\002\000\000\b\002\002\000\000\130\130\000\000\000\016\000\000\000\000\000\016\004\004\000\001\005\004\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\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004 \000\000\000\000\000\000\000\000\000\001\000@@\000\016P@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\018\000\170\000 `\018\028\000\017\000;\000\017\000 \004\000\000\000\000\128\000\000\000\000\000\000\000\000\000\0000\000\002H\000%\000\000\002\000\000\000\000\000\016\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\128\000\128\000\001\128\000<\b\0008\184@\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\224 \000\226\225\000\000\128\000\000\000\000\003\018\000\170\000 `\018\028\000\017\000;\000\017\000\160\024\000\003\128\128\003\139\132\000\002\000\000\000\000\000\012H\002\168\000\129\128Hp\000D\000\236\002D\002\152\144\005P\001\003\000\144\224\000\136\001\216\004\136\001\000\192\000\028\004\000\028\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\001\000\000\000\000\003\000\000p\016\000qp\128\000@\000\000\000\000\001\137\000U\000\0160\t\014\000\b\128\029\128H\128\016\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\0001 \n\160\002\006\017!\192\001\016\003\176\129\016\002\000\128\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\001\137\000U\000\0160\137\014\000\b\128\029\132\b\128\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006$\001T\000@\192$8\000\"\000v\000\"\000@\b\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@\016\016\000\004\020\016\000\000\000\128\000\000\000\000b@\021@\004\012\002C\128\002 \007`\002 \004\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\004\000\000\000\004\000\000\000\000\000@\000\000\000\000\000\000\000\000\006$\001T\000@\194$8\000\"\000v\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\000\000\000\000\000\000\000\000\000\000\000\003\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\b\000\001\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\004 \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\003\018\000\170\000 a\018\028\000\025\000;\000\019\000 (\016B\000\000\002\002\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\001\000\000\000\b\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\001\000@@\000\016P@\000\000\002\000\000\000\000\001\128\000\016\000\000\016\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\0001 \n\160\002\006\017!\192\001\144\003\176\1290\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\001\000\002\000\000\000\000\000\000F\194\000\139\004\141\248\145\232\002\003\224\000\000c\128\141\132\t\022\t\027\241#\208\004\007\192\000\000\199\000\000\000\000\000\000\000\128\000\000\000\128\000\000\000\000\b\000\001\000\000\000\000\000\000\000\001\000 \000\000\000\004l \b\176H\223\137\030\128 >\000\000\0068\000H@\017\000\016\020\0189\000\000\012\000\000\012``\000\b\128\000\000\000\000\000\000`\001\005\002@\000#a\000E\194F\252I\244\001\001\240@\0001\192F\194\000\139\004\141\248\147\232\002\003\224\128\000c\128\141\132\001\022\t\027\241#\208\004\007\193\000\000\199\000\t\b\002\"\002\002\130O \000\001\128\000\001\140\000\018\016\004@\004\005\004\158@\000\003\000\000\003\024\000$ \b\128\b\n\t\028\128\000\006\000\000\0060\000H@\017\000\016\020\0189\000\000\012\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\000\000\000\000\000\000\000\000\000\000\006\173\237\222\191\194\250\174\127\127\246\195\247\219\127\253\240\016\000\000\000\000\005\000\142\000\000\000\000\000\000\000\020l1\b\252J\223\169\030\1591>A\000f\186\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Q\176\132\"\193#~$z\000\128\248\000\000\024\224\163a\bE\130F\252H\244\001\001\240\000\0001\193\002\004\000\128\128\000\128\130\000\000\004\000\000\000\000\000\004\b\001\000\000\001\001\004\000\000\b\000\000\000\000\000\b\016\002\000\000\002\002\000\000\000\016\000\000\000\000\000\000\000\000\000\000\004\000\016\000\000\000\000\000\b\000\016 \b\b\000\002\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\004\000\000\004\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\001F\194\016\139\004\141\248\145\232\002\003\224\000\000c\130\141\132!\022\t\027\241#\208\004\007\192\000\000\199\004\025\bB\004\000\018\130E\160\002\001\128\000\001\004\000\000\000\000\000\000\000\000\016\000\000\000 \000\152\"\000`\000\014\002\000\014.\016\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\000\000\017\176\128\"\193#~$z\000\128\248\000\000\024\224#a\000E\194F\252I\244\001\001\240\000\0001\192F\194\000\139\004\141\248\147\232\002\003\224\000\000c\128\141\132\001\022\t\027\241#\208\004\007\192\000\000\199\000\025\b\002\006\000\018\130M\160\002\001\160\000\001\020\0002\016\004\b\000%\004\155@\004\003@\000\002(\000d \b\016\000J\t\022\128\b\006\128\000\004P\000\200@\016 \000\148\018-\000\016\r\000\000\b \b\000\000\000\000\004\000\000\128\000\000\000\000\004\129\016#a\000E\130F\252H\244\001\001\240\000\0001\192\006R\000\161\160\004\160\147X\000\128`\000\000A\000\012\164\001B@\tA&\176\001\000\192\000\000\130\000\025H\002\132\128\018\130E`\002\001\128\000\001\004\000 \000\000\000\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\200@\016 \000\156\018-\000\016\r\000\000\b \001\144\128 @\001($Z\000 \026\000\000\016@\000\000\b\000\000\000\000\001\000\000\000\002\000\t\130 \006\000\000\224 \000\226\225\000\000\128\000\000\000\000\000\000\000 \000\000\000\000\004\000\000\000\b\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\016\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\000\000\000\000\000\000\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\004\029\012B?\000\179\202E\167\198A\176@\025,\176\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\001\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\004\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\nPH\172\000@0\000\000\160\128F\194\000\139\004\141\248\145\232\002\003\224\000\000c\128\012\132\001\003\000\tA&\208\001\000\208\000\000\130\000\025\b\002\004\000\018\130M\160\002\001\160\000\001\004\0002\016\004\b\000%\004\139@\004\003@\000\002\b\000\000\000\000\000\000\000\000 \000\000\000@\001 D\b\216@\017`\145\191\018=\000@|\000\000\012p\000\144\128\" ($\242\000\000\024\000\000\024\192\001!\000D\000@PI\228\000\0000\000\0001\128\002B\000\136\000\128\160\145\200\000\000`\000\000c\003RR\238\015\160|\022\028\015\251a;\237\1918x\t\b\002 \002\002\130G \000\001\128\000\001\140\r[\219\189\127\133\245\\\254\255\237\135\239\182\255\251\224\000\000\000\000\000\b\000\020\000\000\000\000\000\000\000\b\216@\017`\145\191\018=\000@|\000\000\012p\017\176\128\"\193#~$z\000\128\248\000\000\024\224\213\189\187\215\248_U\207\239\254\216~\251o\255\158\000\000\000\000\000\000\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\b0\000\007\001\000\007\023\b\000\004\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\000@\000\000\000\128\000\000\000A\128\0008\b\0008\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\0002\000\000\000\000\002\000\000\000\004\000\b\000\000\012\000\001\192@\001\197\194\000\001\000\000\000\000\000\004\000\000\200\000\000\000\000\b\000\000\000\016\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\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\002B\000\136\000\128\160\145\200\000\000`\000\000c\003V\246\239_\225}W?\191\251a\251\237\191\254\248\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\n\000\020\000\000\000\000\000\000\000\b\216@\017`\145\191\018=\000@|\000\000\012p@\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\003RR\238\015\160|\022\028\015\249a;\197\1918y\027\b\002,\0187\226G\160\b\015\128\000\001\142\r[\219\189\127\133\245\\\254\255\237\135\239\182\255\249\250\146\151p}\003\224\176\224\127\219\t\223m\249\195\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\b\000\000\000\000\000!\027\b\002,\0187\226G\160\b\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\146\151p}\003\224\176\224\127\203\t\222-\249\195\200\216@\017`\145\191\018=\000@|\000\000\012pjJ]\193\244\015\130\195\129\255,'x\183\231\015#a\000E\130F\252H\244\001\001\240\000\0001\193\169)w\007\208>\011\014\007\252\176\157\226\223\156<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\173\237\222\191\194\250\174\127\127\246\195\247\219\127\252\253IK\184>\129\240Xp?\237\132\239\182\252\225\228l \b\176H\223\137\030\128 >\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000{\250\221\227\245/\254\231\251\255\172\255x\183\255\239}\246D\b/\241\180\000\019\007\003\220q`PhF\194\000\139\004\141\248\145\232\002\003\224\000\000c\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\0026\016\004X$o\196\143@\016\031\000\000\003\028\026\146\151p}\003\224\176\224\127\203\t\222-\249\195\200\216@\017`\145\191\018=\000@|\000\000\012pjJ]\193\244\015\130\195\129\255,'x\183\231\015#a\000E\130F\252H\244\001\001\240\000\0001\193\169)w\007\208>\011\014\007\252\176\157\226\223\156<\141\132\001\022\t\027\241#\208\004\007\192\000\000\199\006\164\165\220\031@\248,8\031\242\194w\139~p\2426\016\004X$o\196\143@\016\031\000\000\003\028\026\146\151p}\003\224\176\224\127\203\t\222-\249\195\200\216@\017`\145\191\018=\000@|\000\000\012pjJ]\193\244\015\130\195\129\255,'x\183\231\015#a\000E\130F\252H\244\001\001\240\000\0001\193\169)w\007\208>\011\014\007\252\176\157\226\223\156<\141\132\001\022\t\027\241#\208\004\007\192\000\000\199\006\164\165\220\031@\248,8\031\242\194w\139~p\2426\016\004X$o\196\143@\016\031\000\000\003\028\026\146\151p}\003\224\176\224\127\203\t\222-\249\195\200\216@\017`\145\191\018=\000@|\000\000\012pjJ]\193\244\015\130\195\129\255,'x\183\231\015#a\000E\130F\252H\244\001\001\240\000\0001\193\169)w\007\208>\011\014\007\252\176\157\226\223\156<\141\132\001\022\t\027\241#\208\004\007\192\000\000\199\006\164\165\220\031@\248,8\031\242\194w\139~p\2426\016\004X$o\196\143@\016\031\000\000\003\028\026\146\151p}\003\224\176\224\127\203\t\222-\249\195\200\216@\017`\145\191\018=\000@|\000\000\012pjJ]\193\244\015\130\195\129\255,'x\183\231\015#a\000E\130F\252H\244\001\001\240\000\0001\193\169)w\007\208>\011\014\007\252\176\157\226\223\156<\141\132\001\022\t\027\241#\208\004\007\192\000\000\199\006\164\165\220\031@\248,8\031\242\194w\139~p\2426\016\004X$o\196\143@\016\031\000\000\003\028\026\146\151p}\003\224\176\224\127\203\t\222-\249\195\200\216@\017`\145\191\018=\000@|\000\000\012pjJ]\193\244\015\130\195\129\255,'x\183\231\015#a\000E\130F\252H\244\001\001\240\000\0001\193\169)w\007\208>\011\014\007\252\176\157\226\223\156<\141\132\001\022\t\027\241#\208\004\007\192\000\000\199\006\164\165\220\031@\248,8\031\242\194w\139~p\2402\016\004\b\000'\004\155@\004\003\000\000\002\b\000d \b\016\000N\t\022\128\b\006\000\000\004\016\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\001\148\128(H\001($V\000 \025\000\002P@\131\161\136G\224\022yH\180\248\2006\b\003%\150\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\025H\002\132\128\018\130E`\002\001\144\000%\004\0002\016\004\b\000%\004\138@\004\003\000\000\002\b\016d1\b\252\002\207)\022\159\025\006\193\000d\178\224\000\002\000\000\000\000\000\001\000\000\b\000\000\000\000\001\144\128 @\001($Z\000 \026\000\000\016@\000\000\b\000\000\000\000\001\000\000\000\000\000\t\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\b\000\000\128\000\000\000\000\016\000\000\000\000\000\152\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\128\0008\b\0008\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\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\004l \b\176H\223\137\030\128 >\000\000\0068\000\000\000\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#a\000E\130F\252H\244\001\001\240\000\0001\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\000e \n\018\000J\t\021\128\b\006@\000\148\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\144\128 @\001($Z\000 \026\000\000\016@\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\002\012\000\001\192@\001\197\194\000\001\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\016\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\000\000\000\000\000\000\000\000\192\000\028\004\000\028\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\001\000\000\000\000#a\000E\130F\252H\244\001\001\240\000\0001\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\b\000\000\000\001\027\b\002,\0187\226G\160\b\015\128\000\001\142\000\000\000\000\000\000\000\000\000\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@\020$\000\148\018k\000\016\012\128\003h\168A\208\196#\240\011<\164Z|d\027\004\001\146\203\000\000\000\000\000\000\016\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\012\164\001B@\tA\"\176\001\000\200\000\018\130\001\027\b\002,\0187\226G\160\b\015\128\000\001\142\000\000\000\000\000\000\000\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\216@\017`\145\191\018=\000@|\000\000\012p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006R\000\161 \004\160\145X\000\128d\000\tA\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b8\000\007\001\000\007\023\b\000\004\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\128\000\000\001\128\0008\b\0008\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000\000F\194\000\139\004\141\248\145\232\002\003\224\000\000c\128\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\016\000\000\0000\000\007\001\000\007\023\b\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000@\000\000\000\b\216@\017`\145\191\018=\000@|\000\000\012p\000\000\000\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\000F\194\000\139\004\141\248\145\232\002\003\224\000\000c\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\152\"\000`\000\014\002\000\014.\016\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\000\000\017\176\128\"\193#~$z\000\128\248\000\000\024\224\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\018\004@\141\132\001\022\t\027\241#\208\004\007\192\000\000\199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b2\016\004\b\000%\004\139@\004\003@\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\128\002@\136A\144\128 @\001($Z\000 \026\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\004\000\018\004B\012\132\001\002\000\tA\"\208\001\000\208\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\016\000\000\000 \000\144\"\016\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\b\000$\b\128\025\b\002\004\000\018\130E\160\002\001\160\000\001\004\000\000\000\000\000\000\000\000\016\000\000\000 \000\144\"\016\144\004P\001\002\000\144\192\000\200\001\152\000\b\001! \b\160\002\004A!\128\193\144\0030\b\016\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\003RR\238\015\160|\022\028\015\249a;\197\1918y\027\b\002,\0187\226G\160\b\015\128\000\001\142\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\017\176\128\"\193#~$z\000\128\248\000\000\024\224\128\000\129\003\224\006\001\001\000\248\b\002\000\011\004\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\000P\000\000\000\000\000\000\000\000\004\000\n\000\000\000\000\000\000\000\004l \b\176H\223\137\030\128 >\000\000\0068 \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\001\000\0016\007\192\012\002\002\001\240\016\004\000\022\024\014\141\132-\022\t\027\241#\208\004\007\192\000\000\231\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X$o\196\143@\016\031\000\000\003\028\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#a\000E\130F\252H\244\001\001\240\000\0001\193\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$ \b\128\b\n\t\028\128\000\006\000\000\00605on\245\254\023\213s\251\255\182\031\190\219\255\239\128\000\000\000\000\000 \000P\000\000\000\000\000\000\000#a\000E\130F\252H\244\001\001\240\000\0001\193\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\006\173\237\222\191\194\250\190\127\127\246\195\247\219\127\252\2426\016\004X$o\196\143@\016\031\000\000\003\028\026\146\151p}\003\224\176\224\127\203\t\222-\249\195\200\216@\017`\145\191\018=\000@|\000\000\012p@\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\001\171{w\175\240\190\175\159\223\253\176\253\246\223\255<\141\132\001\022\t\027\241#\208\004\007\192\000\000\199\006\164\165\220\031@\248,8\031\242\194w\139~p\2426\016\004X$o\196\143@\016\031\000\000\003\028\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\0005on\245\254\023\213\243\251\255\182\031\190\219\255\231\145\176\128\"\193#~$z\000\128\248\000\000\024\224\212\148\187\131\232\031\005\135\003\254XN\241o\206\031\000\001\"\007\192\012\002\002\001\240\016\004\000\022\b\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\002\128\005\000\000\000\000\000\000\000\0026\016\004X$o\196\143@\016\031\000\000\003\028\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\0005on\245\254\023\213\243\251\255\182\031\190\219\255\231\145\176\128\"\193#~$z\000\128\248\000\000\024\224\212\148\187\131\232\031\005\135\003\254XN\241o\206\030F\194\000\139\004\141\248\145\232\002\003\224\000\000c\130\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\006\173\237\222\191\194\250\190\127\127\246\195\247\219\127\252\2426\016\004X$o\196\143@\016\031\000\000\003\028\026\146\151p}\003\224\176\224\127\203\t\222-\249\195\200\216@\017`\145\191\018=\000@|\000\000\012p@\000@\129\240\003\000\128\128|\004\001\000\005\130\003\213\189\187\215\248_W\207\239\254\216~\251o\255\158F\194\000\139\004\141\248\145\232\002\003\224\000\000c\131RR\238\015\160|\022\028\015\249a;\197\1918x\000\000\000\000\000\000\000\000\000\000\000\000P\000\000\000\000\000\000\000\000\004\000\n\000\000\000\000\000\000\000\004l \b\176H\223\137\030\128 >\000\000\0068 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000j\222\221\235\252/\171\231\247\255l?}\183\255\207#a\000E\130F\252H\244\001\001\240\000\0001\193\169)w\007\208>\011\014\007\252\176\157\226\223\156<\141\132\001\022\t\027\241#\208\004\007\192\000\000\199\004\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\r[\219\189\127\133\245|\254\255\237\135\239\182\255\249\228l \b\176H\223\137\030\128 >\000\000\00685%.\224\250\007\193a\192\255\150\019\188[\243\135\145\176\128\"\193#~$z\000\128\248\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\001\171{w\175\240\190\175\159\223\253\176\253\246\223\255<\141\132\001\022\t\027\241#\208\004\007\192\000\000\199\006\164\165\220\031@\248,8\031\242\194w\139~p\253[\219\189\127\133\245|\254\255\237\135\239\182\255\249\228l \b\176H\223\137\030\128 >\000\000\00685%.\224\250\007\193a\192\255\150\019\188[\243\135\234\222\221\235\252/\170\231\247\255l?}\183\255\223\213\189\187\215\248_U\207\239\254X~\241o\255\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\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\b\216@\017`\145\191\018=\000@|\000\000\012p@\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\000F\194\000\139\004\141\248\145\232\002\003\224\000\000c\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\000\000\000\000\000\000\000\000\001\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\017\176\128\"\193#~$z\000\128\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000F\194\000\139\004\141\248\145\232\002\003\224\000\000c\128\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\016t1\b\252\002\207)\022\159\025\006\193\000d\178\192\000\000\000\000\000\004\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\003)\000P\144\nPH\172\000@0\000\000\160\128\006\000\000\192\000\000\162\225\000\000\128\000\000\000\000\000\004\000\000\000\000 @\000\000\001\000\000\000\000\000\001\027\b\002,\0187\226G\160\b\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e \n\018\001J\t\021\128\b\006\000\000\020\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\006R\000\161 \020\160\145X\000\128`\000\001A\000\000\000\000\000\000\000\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\016\004X$o\196\143@\016\031\000\000\003\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\216@\017`\145\191\018=\000@|\000\128\012p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003RR\238\015\160|\022\028\015\249a;\197\1918x\025\b\002\004\000\018\130E\160\002\001\160\000\001\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\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\176\128\"\193#~$z\000\128\248\000\000\024\224\212\148\187\131\232\031\005\135\003\254XN\241o\206\030F\194\000\139\004\141\248\145\232\002\003\224\000\000c\131RR\238\015\160|\022\028\015\249a;\197\1918x\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\144\"\004l \b\176H\223\137\030\128 >\000\000\0068\000\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#a\000E\130F\252H\244\001\001\240\000\0001\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\132\001\002\000\t\193\"\208\001\000\192\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\016$!\b\128\b\n\t\028\128\000\006\000\000\0060 \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\000F\194\000\139\004\141\248\145\232\002\003\224\000\000s\128\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\248\001\128@@>\002\016\128\002\195\001\129\144\128 `\001($\218\000 \026\000\000\016@\016\000\000\000\000\000\000\000\000\000\000@\000\000\b\bF\194\000\139\004\141\248\145\232\002\003\224\000\000c\128\000\002\000\015\128\024\004\004\003\224!\b\000,0\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200@\0160\000\148\018m\000\016\r\000\000\b \001\144\128 @\001($\218\000 \026\000\000\016@\003!\000@\128\002PH\180\000@4\000\000 \128\000\000\000\000\000\000\000\002\000\004\000\004\000\018\004@\141\132\001\022\t\027\241#\208\004\007\192\000\000\199\000\128\004\016\031\0000\b\b\007\192B\016\000X`r6\016\004X$o\196\143@\016\031\000\000\003\028\000\002\016\000|\000\192 \031\001\000B\001`\128\200\216@\017`\145\191\018=\000@|\000\000\012p\b\000A\001\240\003\000\128\128|\004!\000\005\134\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\016$X$o\196\143@\016\031\000\000\003\028\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\001\000\001$\007\192\012\002\002\001\240\016\132\000\022\b\012\012\132\001\003\000\tA&\208\001\000\208\000\000\130\000\128\000\016\000\000\000\000\000\000\000\002\000\000\000\000B6\016\004X$o\196\143@\016\031\000\000\003\028\000\000\016@|\000\192 \031\001\b@\001`\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\b\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\144\128\"\000 ($r\000\000\024\000\000\024\192@\000\000\000\000\000\000\000\000\000\192\000\n\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\004\000\000\136\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\002 \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\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\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\b\000\000\000\000\000\000\000\000\000\024\000\001@\000\000\000@\000\000\000\000\020\0028\000\000\000\000\000\000\000`\000\b\128\000\000\000\000\000\000`\001\005\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\169)w\007\208>\011\014\007\253\176\157\246\223\156<\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\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\001\000\001\"\007\192\012\002\002\001\2400\004\000\022\b\014\000\000@\000\000\000\000\000\000\000@\000\000\000\000\004\000\000\000\000\000\000\128\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\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\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\b\000\t >\000`\016\016\015\128\132 \000\176@`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000 \000\000 \128\000\001\000\000\000\000\000\001\002\000@\000\000@@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\128\002\000\004\000\000\000\000\000\000\141\132\001\022\t\027\241#\208\004\007\192\000\000\199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\004\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\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\001\000\000@\000\001\002\000@\000\000@@\000\000\002\000\000\000\000\001\t\000E\000\016 \137\014\000\012\128\025\128\000\128\016\004\001\001\000\000AA\000\000\000\b\000\000\000\000\002\000\000\000\000\000@\000\b\000\000\000\016\000\000\000\000\016 \004\000\000\004\004\000\000\000 \000\000\000\000\016\144\004P\001\002\b\144\224\000\200\001\152\000\b\001\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\017\176\128\"\193#~$z\000\128\248\000\000\024\224\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\004\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\002\000\002\000\012\000\000\000\128\000\000\000\000\018\000\000\000\000\004\000\024\000\000\001\000\000\000\000\000$\000\000\000\000\b\000\016\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\004\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\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\b\000\016\000\000\000\004\000\0000\000\006\000\000\005\023\n\000\004\000\000\000\000\000\000\000\000\000\000\020\002\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\000\000\000\000\000\002\000\000\024\000\003\128\128\003\139\132\000\002\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000 \000\000\000`\000\014\002\000\014.\016\000\b\000\000\000\000\000\000\000\004@\000\000\000\000@\000\002\000\000\000\000\b\000\000\b\128\000\000\000\000\128\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001@ \002\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\136\000\000\000\000\b\000\000@\000\000\000\001\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(\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\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\001\128\000\001E\194\000\001\000\000\000\000\000\004,\005\020\000@\192\1648\0002\000f\001\002\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\176\020P\001\002\002\144\224\000\200\001\152\004\bA\000\192\000\024\000\000\020\\(\000\016\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000Qp\128\000@\000\000\000\000\001\011\000E\000\016 )\014\000\012\128\025\128@\132\018\022\002\138\000 `R\028\000\025\0003\000\129\b \000\000\000\000\000\000\000\b\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\004l \b\176H\223\137\030\128 >\000\000\0068\000\000\000\000\000\000\000\000\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!\004@\128\002pI\180\000@0\000\000 \128\006B\b\129\000\004\224\145h\000\128`\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\b\002\004\000\019\130E\160\002\001\128\000\001\004\bH\002(\000\129\000H`\000d\000\204\000\004\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\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\016\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\0005%.\224\250\007\193a\192\255\150\019\188[\243\135\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\006B\000\129\000\004\160\145h\000\128h\000\000E\003RR\238\015\160|\022\028\015\249a;\197\1918|\000\004@\031\0000\b\b\007\192@\016\000| 0\000\000\000\000\000\000\000\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\016\000\004\020\016\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\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\002\004\001\001\000\000AA\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\128\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@\016\016\000\004\020\016\000\000\000\128\000\000\000\000 \000\004\000\000\004\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\001\t\000E\000\016 \137\014\000\b\128\025\128\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016\002\000\000\002\002\b\000\000\016\000\000\000\000\000\016 \004\000\000\004\004\000\000\000 \000\000\000\000\016\144\004P\001\002\b\144\224\000\136\001\152\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\192\002\000 \000\000\000\128\000\000\000\000\000\000\000\001\000\000\000@\000\016\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000 \002\000\000\000\000\000\000\000\000\004\000\000\000\000\000@\000\000\000\000\000\000\000\000\004$\001\020\000@\128$0\000\"\000v\000\002\000\000\016\004\004\000\001\005\004\000\000\000 \000\000\000\000\024\144\004P\001\003\000\144\224\000\136\001\152\000\b\000! \b\160\002\004\001!\128\001\016\0030\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\004\000\000\000\000\001\000\000\000\000\000\000\000\000\006\000\b\000\000\000\000\000\000\000\000\000\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\002\000\000\000\000\000\016\000\004\000\bH\002(\000\129\000H`\000D\000\204\000\004\000\144\144\004P\001\002\000\144\128\000\136\001\152\000\b\001\000\192\000\000\000\000\000\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\000\000@\000\000\000\000\002\000\000\128\001\t\000E\000\016 \t\012\000\b\128\025\128\000\128\018\018\000\138\000 @\018\016\000\017\0003\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\b\000\000\000\000\000@\000\016\000! \b\160\002\004\001!\128\001\016\0030\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000}\246D\b/\241\180\000\019\007\003\220q`PhO\194E\171\020\173\249\153\232\n\003\248\000\001\227\128\012\132\001\002\000\tA\"\208\001\000\208\000\000\130\000\128\000\016\000\000\000\000\b\000\000\000\000\000H\017\0026\016\004X$o\196\143@\016\031\000\000\003\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031}\145\002\011\252m\000\004\193\192\247\028X\020\026\019\240\145j\197+~fz\002\128\254\000\000x\224\001\002\000@@\000@A\000\000\002\000\000\000\000\000\002\004\000\128\000\000\128\130\000\000\004\000\000\000\000\000\004\b\001\000\000\001\001\000\000\000\b\000\000\000\000\004$\001\020\000@\130$8\000\"\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\n\000 \000\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\006\000\000\224 \000\226\225\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\018(\000\129\000H`\000D\000\204\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000! \b\160\002\004\001!\128\001\016\0030\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000@\000@\001\128\000\000\016\000\000\000\000\002@\000\000\000\000\128\003\000\000\000 \000\000\000\000\004\128\000\000\000\001\000\002\000\000\000@\000\000\000\004$\001\020\000`\128$8\000\"\000v\000\006\000\000\018\000\000\000\000\004\000\b\000\000\001\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000 \000! \b\160\002\004\001!\192\001\016\0030\128\016\128\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\001\000\001\t\000E\000\016 \t\014\000\b\128\025\128\000\128\002\018\000\138\000 @\018\024\000\017\0003\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\129\000Hp\000D\000\204\000\004\000\016\144\004P\001\002\000\144\192\000\136\001\152\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\192\017x\012\b8\250@\002 \006\000\000 \000\132\128\"\128\b\016\000\132\000\004\000\012\192\000@\000\002\000\000\000\128\000\000\002\000\000\000\000\000\000\002\000\004\000\000\001\000\000\000\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\144\004P\001\002\b\016\192\000\128\001\152@\b\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\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\t\000E\000\016 \129\012\000\b\000\025\132\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\028\000 \002\000\000\000\b\000\000\000\000\000\000\000\0000\000@\000\000\000\000\016\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\016\000\000\000\000\000\128\000\160\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\001\t\000E\000\016 \129\012\000\b\000\025\132\000\128\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\000\000\000\000\000\000\b\000\000 \b\b\000\002\n\b\000\000\000@\000\000\000\0001 \b\160\002\006\000!\192\001\000\0030\000\016\002B@\017@\004\b\000B\000\002\000\006`\000 \004\003\000\000\000\000\000\000\001\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\000\000\000\000\000\002\000\000\b\002\002\000\000\130\130\000\000\000\016\000\000\000\000\012H\002(\000\129\128\bp\000@\000\204\000\004\000\144\144\004P\001\002\000\016\128\000\128\001\152\000\b\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\002\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\018\000\138\000 @\002\024\000\016\0003\b\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\004\004\000\001\005\004\000\000\000 \000\000\000\000\024\144\004P\001\003\000\016\224\000\128\001\152\000\b\000! \b\160\002\004\000!\128\001\000\0030\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\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\001\001\001\000AA\004\000\000\b\000\000\000\000\000\b\002\002\000\000\130\130\b\000\000\016\000\000\000\000\000\016\004\004\000\001\005\004\000\000\000 \000\000\000\000\024\144\004P\001\003\000\016\224\000\128\001\152\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\000 \000 \000\192\000\000\b\000\000\000\000\001 \000\000\000\000@\001\128\000\000\016\000\000\000\000\002@\000\000\000\000\128\001\000\000\000 \000\000\000\002\018\000\138\0000@\002\028\000\016\0003\000\003\000\000D\000\000\002\000\000\128\012\000\000\000\000\000\000\000\000\128\000\000\004\000\001\000\024\000\000\000\000\000\000\000\001\000\000\000\000\000\002\0000\000\000\000\000\000\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\016\000\128\000\000\000\000\000\000\000\004\000\000I\000\004\000\000\000@\000\000\000\000\002\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\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\016\000\128\005\016 \000\000\000\000\000\000\000B\000\000@\000\000\160B\128\128\000\000 \016\000\000\132\000\000\128\000\001@\132\001\000\000\000@ \000\000\006\000\000\224 \000\226\225\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\b@\000\b\000\000\016\b@\016\000\000\004\002\000\000\001\000\000\000\000\004\002\000 \000\000\000\000\000\000\000\002\000\000\000\000\b\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\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\000 \000\000\000\000\000\000\000\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\b\000\000`\000\014\002\000\014.\016\000\b\000\000\000\000\000!\000\000 \000\000@!\192@\000\000\016\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\016\001\000\000\000\000\000\000\000\000\016\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\128\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\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\003\000\000p\016\000qp\128\000@\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\004\000\000\000\012\000\001\192@\001\197\194\000\001\000\000\000\000\000\004 \000\004\000\000\b\0048\024\000\000\018\001\000\000\b@\000\b\000\000\016\b`\016\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@!\192\192\000\000\144\b\000\000\000\128\000 \001\000\n \192\000\000\000\000\000\000\000\001\000\000@\002\000\020@\128\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\004\000\000\000\000\000\000\004\000\b\000\000\000\000\000\000\b\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\016\000\128\005\016 \000\000\000\000\000\000\000\001\128\0008\b\0008\184@\000 \000\000\000\000\000\000\000\002\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\000\000\000\000\000\024\000\003\128\128\003\139\132\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\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\132\128*\128\b\017\004\135\001\004@\014\192 @\b\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\000\016\000\000\000\016\000\004\000 \001D\b\000\000\000\000\000\000\000\016\144\005P\001\002 \144\224 \136\001\216\004\b\001!\000\000 \000\000@!\192@\000\000\016\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000qq\128\000@\000\000\000\000\000\006\000\000\224 \000\226\225\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000\000\000\024\000\003\128\128\003\139\132\000\002\000\000\000\000\000\b@\000\b\000\000\016\bp0\000\000\004\002\000\000\016\128\000\016\000\000 \016\192 \000\000\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\002\000\000\004\002\024\004\000\000\001\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\016\128\000\016\000\000 \016\128 \000\000\b\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B@\017@\004\b\002C\128\002 \006`\000 \004\132\128\"\128\b\016\004\132\000\004@\012\192\000@\b\016\000\000\000\000\000 \003\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\128\004\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\016\000\128\005\016 \000\000\000\000\000\000\000B@\017@\004\b\002C\128\002 \006`\000 \004\132\128\"\128\b\016\004\132\000\004@\012\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\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\128\012\000\000\000\000\000\000\000\000\128\000\000\000\000\001\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\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\003\000\000p\018\000Up\128\000@\000\000\000\000\001\011\001U\000\0160!\014\000\b\128\029\128\001\128\016\012\000\001\128\000\001E\194\000\001\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\0000\000\007\001 \005W\b\000\004\000\000\000\000\000\000`\000\014\002\000\014.\016\000\b\000\000\000\000P\000\000\000\128\000\000\000\000@\000\000\000\000\002\000\128\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000Up\128\000@\000\000\000\000\000\006\000\000\192\000\000\162\225\000\000\128\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\024\000\003\128\144\002\171\132\000\002\000\000\000\000\000\bX\n\168\000\129\129\bp\000D\000\236\000\004\000\144\176\021P\001\003\002\016\224\000\136\001\216\000\b\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B@\021@\004\b\000C\128\002\000\007`\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\002\018\000\138\000 @\002\024\000\016\0003\000\001\000$$\001\020\000@\128\004 \000 \000f\000\002\000@\128\000\000\000\000\001\000\024\000\000\000\000\000\000\000\001\000\000\000\000\000\002\000\016\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\b\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\006\000\000\224$\000\170\225\000\000\128\000\000\000\000\002\018\000\138\000 @\002\024\000\016\0003\000\001\000$$\001\020\000@\128\004 \000 \000f\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\000B@\017@\004\b\000B\000\002\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\160\002\004\000!\128\001\000\0030\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b\016\000\132\000\004\000\012\192\000@\b\004\000\000I\000\004\160\002\000@\000\000\000\000\002\000\b\000\000\146\000\t@\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\bH\002(\000\129\000H`\000D\000\236\002\004\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000! \b\160\002\004\001!\128\001\016\0030\b\016\002B@\017@\004\b\002B\000\002 \006`\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\002\018\000\138\000 @\002\016\000\016\0003\000\001\000 \016\000\001$\000\018\128\b\001\000\000\000\000\000\b\000 \000\002H\000%\000\000\002\000\000\000\000\000\016\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\001\144\000<\b\0008\184P\000 \b\002\000\001\000\003\000\002p\016\000qp\128\000@\000\000\000\002\128\000\000\000\000\001@ \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\000\000\000\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\180\004P\001\002\b\144\208\000\136\003\152\004\b\001! \b\160\003\004\001!\192\001\016\0030\b0\130B@\017@\004\b\002C\128\002 \006`\016!\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\t\000E\000\016 \t\012\000\b\128\025\128@\132\016\004\128\000\000\000\001\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\016\144\004P\001\002\000\016\192\000\128\001\152\004\b\001! \b\160\002\004\000!\000\001\000\0030\000\016\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\002\018\000\138\000 @\018\028\000\017\000;\000\129\000 \t\000\000@\000\002\000\005\000\000\000\128 \000\016\000\018\000\000\000\000\004\000\n\000\000\001\000@\000 \000\000\000\000\000\020\002\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\002\018\000\138\0000@\018\028\000\017\0003\000\131\b$$\001\020\000@\128$8\000\"\000f\001\002\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\002\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\002\000\000\000\000\000\000\000\000\"\000\000\001\000\000@\006\000\000\000\000\000\000\000\000@\000\000\000\000\000\128\012\000\000\000\000\000\000\000\000\128\000\000\000\000\001\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\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\001\148\128(H\001($V\000 \025\000\000P@\131!\136G\224\022yH\180\248\2006\b\003%\150\002\000\000\128\004\000\168\129\000\000\001\000\000\000\000\002\016\000\002\000\000\005\002\020\012\000\000\001\000\128\000\004 \000\004\000\000\n\004 \024\000\000\002\001\000\000\b@\000\b\000\000\016\b@0\000\000\004\002\000\000\001\000\000\000\000\004\002\000 \000\000\000\000\000\000 \000\000\000\000\000\b\004\000@\000\000\000\000\000\000\000\000\000\000\000\000\016\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\b\000\018\000\001\027\b\002,\0187\226G\160\b\015\128\000\001\142\000\000\000\000\000\000\000\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\216@\017`\145\191\018=\000@|\000\000\012p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\001\000\134\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\128@\000\000\000\000\000\000\000\000\000\000\000\000\000\001\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\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\b\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\006\000\000\224 \000\226\225\000\000\128\000\000\000\000\002\016\000\002\000\000\004\002\028\012\000\000\001\000\128\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 \000H\000\004l \b\176H\223\137\030\128 >\000\000\0068\000\000\000\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#a\000E\130F\252H\244\001\001\240\000\0001\192\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\004\000\000\000\000@\000\000\128\b\000\000\000\000\000\000\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\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\001\148\128(H\001($V\000 \025\000\000P@\003\128\000p\016\000qp\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\024\000\003\128\128\003\139\132\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\000\004l \b\176H\223\137\030\128 >\000\000\0068\000\000\000\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#a\000E\130F\252H\244\001\001\240\000\0001\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\004\000\000\b\0040\024\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\000\002\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\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\004\000\0000\000\007\001\000\007\023\b\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\001\148\128(H\001($V\000 \025\000\000P@\003\128\000p\016\000qp\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\024\000\003\128\128\003\139\132\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\000\004l \b\176H\223\137\030\128 >\000\000\0068\000\000\000\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#a\000E\130F\252H\244\001\001\240\000\0001\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\001\027\b\002,\0187\226O\160\b\015\128\000\001\142\0026\016\004X$o\196\143@\016\031\000\000\003\028\016\128\000\016\000\000 \016\192`\000\000\b\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000 \001\000* \192\000\000@\000\000\000\128\001\000\000@\002\000TA\128\000\000\128\000\000\000\000\002\000\000\128\004\000\168\129\000\000\001\000\000\000\000\000\004\000\001\000\b\001Q\002\000\000\002\000\000\000\000\000\025\b\"\006@\019\130M\160\002\001\128\000\001\004\007\223d@\130\255\027@\0010p=\199\022\005\006\128d \136\016\000N\t6\128\b\006\000\000\004\016\000\200A\016 \000\156\018-\000\016\012\000\000\b \001\144\128 @\0018$Z\000 \024\000\000\016@\000\000\000\000\000\000\000\002\000\002\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\004\000\000\000\000\000\000\004\000\b\000\000\000\000\000\000\b\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\016\000\128\021\016 \000\000 \000\000\000\000\001\128\0008\b\0008\184@\000 \000\000\000\000\000\000\000\002\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\000\000\000\000\000\025H\002\132\128\018\130M`\002\001\128\000\001\004\0002\144\005\t\000%\004\138\192\004\003\000\000\002\b\000e \n\018\001J\t\021\128\b\006\000\000\004\016\000@\000\016\000\128\021\016 \000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\004\001\000\000@\002\000T@\128\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022\164\171PaES?\188\017\000\243\000\131\198\164-IV\160\194\138\166\127x\"\001\230\001\007\141@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\144\005P\001\002 \144\224`\136\001\152\004\024\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\000\000\000\000\132\128*\128\b\017\004\135\003\004@\012\192 \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$\001T\000@\136$8\024\"\000f\001\006\001@\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\016\000\128\021\016 \000\000 \000\000\000\000B@\021@\004\b\130C\129\130 \006`\016`\020\003!\004@\128\002pH\180\000@0\000\000 \128\006B\000\129\000\004\224\145h\000\128`\000\000A\000\000\000\000\000\000\000\000\b\000\b\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\016\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\001\128\0008\t\000*\184@\000 \000\000\000\000\000\128\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\004 \000\004\000\000\b\0048\024\000\000\002\001\000\001\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@!\128\192\000\000\016\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\002\000T@\128\000\000\128\000\000\000\001\b\000\001\000\000\002\001\014\006\000\000\000\128@\000B\016\000\002\000\000\004\002\024\012\000\000\001\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\007\023\024\000\004\000\000\000\000\000\000`\000\014\002\000\014.\016\000\b\000\000\000\000\000!\000\000 \000\000@!\128\192\000\000\016\b\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\004 \000\004\000\000\b\0040\024\000\000\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\192\000\000\016\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b\016\004\135\000\004@\012\192\000@\b\006\000\000\224$\000\170\225\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\b\000\002\000\016\002\162\004\000\000\004\000\000\000\000\bH\002(\000\129\000Hp\000D\000\204\000\004\000\128e \n\018\000J\t\021\128\b\006@\000\020\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B@\017@\004\b\002C\000\002 \006`\000 \004\132\128\"\128\b\016\004\132\000\004@\012\192\000@\b\016\000\000\000\000\000 \003\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\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000e \n\018\000J\t\021\128\b\006@\000\020\016! \b\160\002\004\001!\128\001\016\0030\000\016\002B@\017@\004\b\002B\000\002 \006`\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\004$\001\020\000@\128$ \000 \000f\000\002\000\0002\016D\012\000'\004\155@\004\003\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\000\000\000\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\020\000@\128$ \000\"\000f\000\002\000HH\002(\000\129\000H`\000D\000\204\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000! \b\160\002\004\001!\000\001\016\0030\000\016\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\004$\001\020\000@\128$0\000 \000f\000\002\000\bH\002(\000\129\000H@\000@\000\204\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\t\000E\000\016 \t\b\000\012\128\025\128\000\128\016\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\bH\002(\000\129\000H`\000@\000\204\000\004\000\016\144\004P\001\002\000\144\128\000\128\001\152\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\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\006$\001T\000@\194$8\000\"\000v\000\"\000L\000\000\128\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\004\000\000\000\000\000\128\000\000\000\000\004\193\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\224 \000\226\225\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\b@\000\b\000\000\016\b@0\000\000\004\002\000\000\016\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\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\b\000\t\000>\000`\016\016\015\128\132 \000\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@\129\000 \000 \128\000\001\000\000\000\000\000\001\002\000@\000\000@A\000\000\002\000\000\000\000\000\002\004\000\128\000\000\128\128\000\000\004\000\000\000\000\000\000\000 \000\000\001\000\004\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016\004\004\000\001\005\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\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\128\000\b\000\000\000\000\000\000\000\000\000\000\004\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\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \200@\016 \000\148\018-\000\016\r\000\000\b\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212\148\187\131\232\031\005\135\003\254XN\241o\206\030\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\001\000\000\b\000\016\000\000\002\000\000\000@\000H\000\000\000\000\016\000 \000\000\004\000\000\000\128\000\144\000\000\000\000 \000@\000\000\b\000\000\000\000\132\128\"\128\012\016\004\135\000\004@\014\192\000\194\000\002@\000\000\000\000\128\001\000\000\000 \000\000\000\002\018\000\138\000 @\018\028\000\017\0003\000\001\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\129\000H`\000D\000\204\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\bH\002(\000\193\000Hp\000D\000\236\000\012 \000$\000\000\000\000\b\000\016\000\000\002\000\000\000\000! \b\160\002\004\001!\192\001\016\0030\000\016\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\016\000\000\000\000\000\000\000\000\001\t\000E\004\016 \t\012\000\b\128\029\128@\128\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004$\001\020\000@\128$0\000\"\000f\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\000H\000\002\000\000\016\000 \000\000\004\000\000\000\128\000\144\000\000\000\000 \000@\000\000\b\000\000\001\000\132\128\"\128\b\016\004\134\000\004@\012\192\000B\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\128\000\000\000\000\000\000\000\000\000\000`\000\014\002\000\014.\016\000\b\000\000\000\000\000\000\192\000\024\000\000\020\\ \000\016\000\000\000\000\000b@\029\192\004\012\130C\129\130$\007`\022!\022\196\128;\128\b\025\004\135\003\004H\014\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\000\000\000\000\000\024\000\003\128\128\003\139\132\000\002\000\000\000\000\000\0000\000\006\000\000\005\023\b\000\004\000\000\000\000\000\024\144\007p\001\003 \144\224`\137\001\216\005\136E\177 \014\224\002\006A!\192\193\018\003\176\011\016\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\001\000\000\b\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\016\000\000\000\000\000\012\000\001\128\000\001E\198\000\001 \000\016\000\000\000\024\000\003\000\000\002\139\132\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@\004\000\000\000\004\000\000\000\018\000\000\000\000\000\001\128\0000\000\000(\184@\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\128\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\001\000\000\000@\000\000\000\000\004\000\000\000\016\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\000\000\000\000\000\000\012\000\001\192@\001\197\194\000\001\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\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\192\000\028\004\000\028\\ \000\016\000\000\000\000\000\000\000\004\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\160\016\000\000\000\004\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\bH\002(\000\129\000Hp\000D\000\204\002\004\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\001\144\000<\b\0008\184P\000 \b\002\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\t\000E\000\016 \001\012\000\b\000\025\128@\128\016\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\018\000\000\128\000\004\000\b\000\000\001\000\000\000 \000$\000\000\000\000\b\000\016\000\000\002\000\000\000@! \b\160\002\004\000!\128\001\000\0030\000\016\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\128\000\000\000\000\000\000\000\000\bH\002( \129\000\b`\000@\000\236\002$\000\128d\000\015\002\000\014.\020\000\b\002\000\128\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B@\017@\004\b\000C\000\002\000\006`\016 \004\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\004\128\000 \000\001\000\002\000\000\000@\000\000\b\000\t\000\000\000\000\002\000\004\000\000\000\128\000\000\016\bH\002(\000\129\000\b`\000@\000\204\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\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\128\000\016\000\000\016\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$\001\020\000@\128$8\000\"\000f\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\017\176\128\"\193#~$z\000\128\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000F\194\000\139\004\141\248\145\232\002\003\224\000\000c\128\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\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@\016@\004\b\000B\000\002\000\006@\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\t\000\000\000\000\002\128\004\000\000\000\128\000\000\000\b\000\b\128~\001`\144\000\015\136\128 \1280Q`\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\128\000\000\000\000\000\004\000\000\000\004\000\000\000\000\001@\000\000\000\000\000\000\000\000\004\000\004\000?\000\176H\000\007\196@\016@\024(\176\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\b\000\016\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\006\000\000\224 \000\226\225\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\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004l \b\176H\223\137\030\128 >\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\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\002\000\000\000\000\000\004\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\000A\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\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000d \b\016\000J\t\022\128\b\006\128\000\004\016\000\000\000\000\000\000\000\000@\000\000\000 \002@\136\000\000\000\000\000\000\000\000\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\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\000\000\000\000\000\000\000\000\019\240\144b\197+~fz\002\160\254@\0008\224\001\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\011BA\000\016 \169\b\b\b\1289\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\000\000\000\000\000\002@\016@\004\b\002B\000\002 \006A\000 \000\000\000\000\000\000\000\000\000\000\000\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\000H\002\b\000\129\000H@\000@\000\192\000\004\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\128\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\001?\t\006,R\183\230g\160*\015\228\000\003\142\002~\018\012X\165o\204\207@T\031\200\000\007\028\000\144\004\016\001\002\000\144\128\000\136\001\144\000\b\000\001 \b \002\004\001!\000\001\016\003 \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\t\000A\000\016 \t\012\000\b\128\025\000\000\128\000\018\000\130\000 @\018\016\000\017\0002\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\001 \b \002\004\001!\128\001\016\003 \000\016\000\002@\016@\004\b\002B\000\002 \006@\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\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000") and start = 13 and action = - ((16, "C\170P\224Ff\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021HFf\000\000\000\000\020XFfC\170\023\004\000-\001\132\\J\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\000\000\000\000\000\000\000\000\0007\004b\001\252\000\000\003\014\014T\000\000\000\011\003t\015L\000\000\002\228\003\138\016D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\236\000\000\000\000\000\000\003nT\014\000\000\000\000\000\000\005\028\000\000\000\000\000\000\0046\003\208\000\000\000\000T\014H\254\020X\021\178^\162\020XY\144KL\020XJ\234\000\000\003\200\000\000Dp\004\192\000\000C\146\000\000\027\158\000\000\000\000\004\216\000\000\005\028\000\000\000\000\000\000\006B\000\000C\146\000\000\005.x.\131te\198\000\000\133\146\134\172\000\000M2_0\000\000V\000\026\206L\170\005\028qNFfC\170\000\000\000\000KL\020XR*Dp\005\222x.\000\000\129\160FfC\170P\224\020X\000\000\000\000\016x\023\022\001N\006&\000\000\000\220\007\012\000\000\000\000\000\000\000\000\000\000\020X\000\000A\206j\216C\170\000\000\000\000N0\020Xi\248Ul\000\000\000\156\000\000\000\000\005V\000\000\000\000H\166\000\156\024\138\002\138\006\176\000\000\000\000\000@\000\000\021\178\004\234\0056\020X\028\254\020XC\170C\170\000\000K\140K\140\020X\028\254A\248\020X\000\000\000\000\000\000P\224\020X\000\000\000\248\000\000Ulv\022{\130\000\000\006&\000\000\006\228\000\000\000\000A\214T\014t\002\000\000i\240t\002\000\000i\240i\240\007*\002*\004\220\000\000\021X\000\000\005\250\000\000\000\000\b\022\000\000\000\000\000\000i\240\005\028\000\000\000\000X\202T\014T\130_0\000\000\000\000N(\007*\000\000\000\000_0\005\252T\014\000\000O\030_0P\020\000\000\000\000\000\000\000%\000\000i\240\000\000\019\134\137\238\000\000T\014\019\248T\014\000\000\022\\\006\190\005\028\000\000\000\000\023\224\000\000\0234\000\000Y\162\005\020\000\000\006\172i\240\007\222\000\000\b\006\000\000\020B\000\000\000\000\002\016\000\000\000\000\000\000\021 \023|UlP\204\020XUl\000\000\007*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Kj\027v\000\000\000\000\000\000\001\244&\174v\022\000\000\000\000P\204\020XUl\000\000\000\000\135&Ul\135\128{\130\000\000\135\196\000\000Ul\000\000\000\000VX\000\000\000\000\000\000\007\164\000\000\022\168\000\000\000\000|\014\000\000\135\246|V\000\000\136d\021\014\000\000\000\000|\014\000\000\006\212\000\000\000\000DHWR\000\000\000\000\000\000Bn\021^\021\220\025\160\000\000\000\000\000\000\000\000\004.\000\000\000\000Z\238\007\016\007\248\000\017T\014\000\144\b\200\000\000\000\000\b\b\007\248\000J\000\000j\238P\210K\140\020X\028\254\000-\0078\015\192\000\000\b,\021\178\021\178\000-\0078\007|\021\178\000\000k\128\002\204Dp\006&\005\196\138z\000\000T\014ffT\014_Bg\006T\014\002\162T\014g\160\000\000\000\000\020d\004\220_\226\007\012\004\220`:\000\000l\026\002\204\000\000\021\178l\180\000\000\004\026\t\190`\218\000\000\000\000\000\000\000\000\000\000\000\000\001B\000\000\000\000\005\"\000\000\007\148\028\254\000\000\\\226A\248\000\000\031\138\000\000\000\000\021\178\0032\000\000\000\000\000\000\000\000[\166\000\000\000)\000\000W<\005@\005\"\000\000\0226UbP\224\020XG,P\224\020X\016x\016x\000\000\000\000\000\000\000\000\001\240\024&B\188\000\000Q\148RHK\246\020X\028\254\003\136\021\178\000\000\006\026\000\000R\252S\176t\144I~T\014\006\178\000\000P\224\020X\000\000v\156\020XWRUlE\178\000\000P\224\020Xx\148\003.\000\000UlA\012T\014\002\204\000J\t`\000\000\000\000\000\000H\166\001\154\001\154\000\000\t\214q\208\000\000P\204\020XUl\025R\000\000P\224\020X\016x\0226\016x\002\232\023\174\000\000\000\000\016x\n\238\t\232\003j\134\172\000\000\028\018\137V\000\000\026\"T\014\029\220\nX\000\000\000\000\n\240\000\000\016x\003\224\011P\000\000'\166\000\000\b\172\000\000\000\000\026\022\000\000\017p\023.\000\000\000\000\000\000\000\000\t\190\000\000\000\000\027\014\000\000\028\006\000\000\028\254\000\000\018h\024&\000\000\000\000\000\000Ff\000\000\000\000\000\000\000\000\029\246\000\000\030\238\000\000\031\230\000\000 \222\000\000!\214\000\000\"\206\000\000#\198\000\000$\190\000\000%\182\000\000&\174\000\000'\166\000\000(\158\000\000)\150\000\000*\142\000\000+\134\000\000,~\000\000-v\000\000.n\000\000/f\000\0000^\020XUlZlI\146\001\154\012 m@Ul\000\000\000\000\000\000\011\148\000\000\000\000\000\000\000\000m@\000\000\000\000\005\242\012B\000\000B\170\000\000\000\000\138\144\000\000\005Z\000\000\000\000L\170\001\154\011\228T\014\b`\000\000\000\000\007\196\005\028\000\000T\014\n@\000\000\000\000\012@\000\000\000\000\000\000I\190T\014\n\242\000\000\000\000\030*\000\000\000\000|\226\000\000\031\"}*\000\000 \026}\182\000\000!\018\024H\000\000\000\000\000\000\000\000\"\nUl#\002r\030r\030\000\000\000\000\000\0001V\000\000\t\184\000\000\000\000\000\000r\192\000\000\000\000\000\220\024\166\000\000\t\210\000\000\000\000]\132LN\000\000\000\000\t\188\000\000\000\000\000\000\007\180\000\000\000\000\000\000\016x\004\216\024\232\000\000\n\156\000\000\005\208\000\0002N\000\000\n\180\000\000\006\200\000\0003F\000\000\r\018\007\192\000\0004>m\168\000\000(\158\000\000\n\202\b\184\000\00056\000\000\011\172\t\176\000\0006.\000\000r\202\n\168\000\0007&\005\\\025\016\000\000\n\210\011\160\000\0008\030\000\000\011\194\012\152\000\0009\022\000\000\011\188\r\144\000\000:\014\014\136\000\000;\006\015\128\019`\000\000\000\000\000\000\012\164\000\000\000\000\012\186\000\000\000\000\r\154\000\000\011\220\000\000\000\000\000\000\r\022\000\000\r:\000\000\000\000J~\001\154\0142q\208_0\007*\000\000\000\000q\208\000\000\000\000\000\000q\208\000\000\014j\000\000\000\000\000\000\000\000\000\000\000\000;\254Ul\000\000\000\000\014\184\000\000<\246\000\000=\238\000\000#\250\000\000\000\000\b\234\000\000\000\000Ul\000\000\000\000~\018\r\156\000\000\000\000G,\000\000\012\252\000\000\000\000]\132P\204\b~\000\000m\168\000\000\000\000\000\000P\204\020XUlDH\000\000aB\000\000a\196\000\000a\196\000\000\000\000\000\000\000\000X\000\000\000\014`\000\000\000\000h\bP\204\024J\000\000s\134\000\000\000\000\000\000\000\000\000\000\003P\011\164\000\000\000\000\0226\020\\\006&\000\000B>\000\000 4\026\150\022\012\000\000\000\000\012\180\000\000\000\000\001x\025\030X\150\000\000\025\030\000\000\005r\000\000\000\000\r\172\000\000\000\000h\138\003\228\003P\000\000\000\000\011\254\000\000\000\000\014~\000\000\000\000h\b\000\000\000\000\020X\028\254\003\184\000\000\000\000\023Z\002\138\006\176\007V\028\254y\028\021\178\001B\028\254y\154\014T\000\000\000\000\007V\000\000H\232\020X\021\204\000\000\0118\015\b\000\000\015\006\000V_0\004\212\000\000\015\020\014\174L\170\b\140T\014\030\128\020F\014\n\006\232\000\000\031x\015^\000\000\004\212\000\000\000\000\016\006_0b\\\000\000i(_0\015\250_0n@b\252\006\178\015\232\000\000\000\000\000\000\020X\129\234\000\000Ulr\030\000\000\000\000\016\\\000\000\000\000\000\000>\230\016\160WR?\222a\196\000\000\000\000HJ\000\000\t\250\000\000Mj\000\000\020X\000\000\021\178\n\242\000\000\129\160\000\000\020X\028\254\129\160\000\000\025D\023\022\001N\005\028\132\n\021\178~\162r\030\000\000\002\138\006\176\006\176\007Vr\030\133\178\002\138\006\176\007Vr\030\133\178\000\000\000\000\007Vr\030\000\000FfC\170Ul\027B\000\000\000\000FfC\170K\140\020X\028\254\129\160\000\000\023\004\000-\001\132\015\214T\014\012\226\016\166\132>\000\000r\030\000\000H\232\020X\021\204y\242\023\228\0120\127\030\b\130\016\b\020Xr\030\000\000\020Xr\030\000\000i\240i\240\023Z\002\022\000\238\004\220N\232\000\000\000\238\004\220N\232\000\000\025D\002\138\t\152\022\214\rB\000\000N\232\000\000\006\176\016 \021\178r\030\136\182\002\138\006\176\016F\021\178r\030\136\182\000\000\000\000\bN\000\000O\222\000\000\021\178\132\208N\232\000\000\0078\000\000H\254\020X\021\178r\030\000\000H\232\020X\021\204s\216B\138\023\246\019\254\006n\000\000\001\198C\146\rh\000\000\016\192\016\140E\208\020Xd*T\014\011\026\000\000U:\001N\007\188\014B\000\000\011\016\000\000\016\230\016\154T\014O&\000\000\020(\006\196\r\200\000\000\r\230\000\000\017\026\016\168L\170\012\156T\014L\152O&\000\000XH\020XE\208\017D\n$\000\238\000\000\014bE\208T\014\014n\007*\000\000T\014\b\144\t\136\000\000\000\000n\154\000\000\000\000\015\004E\208o\024O&\000\000\020XT\014\014lT\014e2O&\000\000\014\214\000\000\000\000O&\000\000\000\000U:\000\000r\030\134\n\019\254\006n\001\198\0178\016\238E\208r\030\134\n\000\000\000\000\019\254\006n\001\198\017F\016\224w\132M<_0\017fw\132i\240\020\184\017lw\132_0\017~w\132o\184p8\000\000\130z\000\000\000\000r\030\136\240\019\254\006n\001\198\017v\017\bw\132r\030\136\240\000\000\000\000\000\000i\240\000\000\000\000\000\000\000\000\000\000\000\000N\232\000\000\134\130\020XDp\017\144x.\000\000\129\160\134\130\000\000\000\000\137$\020XDp\017\174\017@\131t\137V\004\212\017\234\000\000\000\000p\182s\216\020X\000\000\127v\021\204\000\000\000\000\129\160\137$\000\000\000\000\000\000znD\228I\154\004\212\017\236\000\000\000\000\000\000s\216\020X\000\000\004\212\018\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\222B\138\019\254\006n\001\198\017\222t\144V\132\020Xi\248k\242\020(\000\178\004\212\017\250\007\140\000\000\000\000\017\168\000\000\000\000g\168\000\000\n\006\015\160\000\000\014.\000\000\018\n\017\150T\014e\244\018\018\b\132\000\000\000\000\017\206\000\000\000\000\020F\rz\015\184\000\000\018(u\018\139\002\001\154\017\204T\014\015(\000\000\000\000\017\234\000\000\000\000\000\000g\168\000\000\n\164\015\232\000\000\014\204\000\000\018P\017\218L\170\000\000\018Tu\148\139\024\001\154\017\244T\014\016\016\000\000\000\000\018\026\000\000\000\000\000\000\020X\000\000g\168\000\000\020z\020XV\132V\132w*Ff\020X\129\234Ul\024x\000\000\011\028\000\238\000\000\015\252V\132T\014\015X\006&\000\000\020XUlt\144V\132\014`V\132\000\000D\142Et\000\000cV\000\000\000\000c\242\000\000\000\000d\142\000\000\016RV\132e*\129\234Ul\024x\000\000\002r\000\000\000\000w\132\014\178\000\000\000\000\\\234\018x\000\000g\168\000\000V\132\\\234g\168\000\000\020XT\014g\168\000\000\016\214\000\000\000\000g\168\000\000\000\000k\242\000\000\130\174w\132\0184V\132\131Jt\144\000\000r\030\134\218\019\254\006n\001\198\018\160t\144r\030\134\218\000\000\000\000\000\000\137\238P\204\000\000\000\000\000\000\000\000\000\000\000\000\133\004r\030\000\000\134\130\000\000\000\000\000\000\000\000r\030\137\238\000\000\018\220\000\000\000\000\133\004\018\226\000\000r\030\137\238\000\000\000\000\017\190\000\000\000\000jh\004*\000\000\000\000DH\000\000T\014\rz\000\000k\242\017\224\000\000\000\000\000\000\015\184\000\000\000\000]\132\000\000\000\000K\246\020X\028\254\b\162\000\000Sf\000\000\011\234\000\000\003j\000\000\000\000\018\232\000\000\019\016z\244\000\000@\214\018\244\000\000\000\000\018\240\026R\028B\021\204s\216\023\228\020X\000\000\129\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000w\178\023\228\020X\000\000\012\220x.\000\000\129\160\000\000\018\246\026R\028B\129\160\000\000\019\012\000\000\000\238\015\132\020X{*\000\000\000\000\028\190\139\156\000\000\000\000\018\176\000\000\019\000T\014\000\000\015\170\016\218\007*\000\000\000\000T\014\011P\012H\000\000T\014\r@\004\212\0196\000\000\000\000\128\016\000\000\000\000\131t\000\000\129\160\000\000\019,\026R\029:N\232\000\000\000\000\000\000\000\000\015\214\128\170\131t\000\000\129\160\000\000\0190\026R\029:N\232\000\000\018\n\000\000\000\000\012\226\000\000r\030\000\000\019F\000\000\000\000\018\176\000\000\018\186\000\000\018\208\000\000\000\000Y\144\018\218\000\000\000\000%\182\\J\019p\000\000\000\000\000\000\t\180\012,^\n\019\130\000\000\000\000\000\000\000\000\000\000\000\000\018\242\000\000\023\228\000\000\018\244\000\000T\014\000\000\011\026\000\000\000\000\019\004\000\000\000\000\004\220\000\000\017n\000\000\000\000\000\000\018\018\000\000\016\188\000\000\019\n\000\000Ul\022\168\000\000\000\000\r$\019\014\000\000\000\000\019\012\017\004G,\005\028\129(\000\000\000\000\000\000\000\000\000\000[\224\000\000\000\000\019\190\000\000}j\000\000\016\184\019\214\000\000\019\216\000\000G\224G\224\139F\139F\000\000\000\000r\030\139F\000\000\000\000\000\000r\030\139F\019N\000\000\019P\000\000"), (16, "\t]\t]\000\006\t]\004\210\t]\002\186\002\190\t]\002\234\002\130\t]\003\185\t]\001f\002\246\t]\003\145\t]\t]\t]\001b\t]\t]\t]\001\210\004m\004m\007\222\002\250\t]\003>\003B\n\"\t]\001z\t]\001\138\003F\000\238\002\254\000\238\t]\t]\003\214\003\218\t]\003\222\0032\003\234\003\242\006\214\003\146\t]\t]\002\178\b\022\0071\003:\t]\t]\t]\b\026\b\030\b*\b>\001*\005v\t]\t]\t]\t]\t]\t]\t]\t]\t]\b\178\006\181\t]\0162\t]\t]\003\185\b\190\b\214\t*\005\130\005\134\t]\t]\t]\003\189\t]\t]\t]\t]\004\214\006\181\r\254\t]\006\178\t]\t]\003]\t]\t]\t]\t]\t]\t]\005\138\b2\t]\t]\t]\bJ\004r\t>\003]\t]\t]\t]\t]\r9\r9\004m\r9\006\210\r9\004m\r9\r9\000\238\r9\r9\r9\r9\004m\r9\r9\003\150\r9\r9\r9\003^\r9\r9\r9\r9\000\238\r9\016\146\r9\r9\r9\r9\r9\r9\r9\r9\007\190\007\030\003\189\r9\003b\r9\r9\r9\r9\r9\004m\r9\r9\004m\r9\003\238\r9\r9\r9\000\238\007\194\r9\r9\r9\r9\r9\r9\r9\001\221\r9\r9\r9\r9\r9\r9\r9\r9\r9\r9\r9\004m\r9\r9\007\138\r9\r9\0122\004m\003\018\r9\r9\r9\r9\r9\r9\004m\r9\r9\r9\r9\r9\000\238\r9\r9\006\029\r9\r9\000\238\r9\r9\r9\r9\r9\r9\r9\r9\r9\r9\r9\r9\r9\001\002\001\190\r9\r9\r9\r9\001\221\001\221\001\221\001\221\015\242\001\221\t\022\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\003\t\001\221\003%\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\005R\015Z\001\221\019.\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\000\n\001\221\001\221\001\221\006\029\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\0246\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\004B\001\221\001\221\003\t\001\221\001\221\004m\004m\024:\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\004m\bb\001\221\005\186\001\221\001\221\001j\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\007\"\001\221\001\221\001\221\001\221\001\221\n\145\n\145\000\238\n\145\004^\n\145\004-\n\145\n\145\004r\n\145\n\145\n\145\n\145\000\238\n\145\n\145\001f\n\145\n\145\n\145\003\145\n\145\n\145\n\145\n\145\000\238\n\145\007^\n\145\n\145\n\145\n\145\n\145\n\145\n\145\n\145\007\250\007\030\001r\n\145\b\230\n\145\n\145\n\145\n\145\n\145\000\238\n\145\n\145\024>\n\145\t9\n\145\n\145\n\145\007R\007\254\n\145\n\145\n\145\n\145\n\145\n\145\n\145\025\230\n\145\n\145\n\145\n\145\n\145\n\145\n\145\n\145\n\145\n\145\n\145\004-\n\145\n\145\007\138\n\145\n\145\b\234\t\006\025\234\n\145\n\145\n\145\n\145\n\145\n\145\001\130\n\145\n\145\n\145\n\145\tV\000\238\t\182\n\145\b\"\n\145\n\145\001\146\n\145\n\145\n\145\n\145\n\145\n\145\n\145\n\145\n\145\n\145\n\145\n\145\n\145\012\253\n\145\n\145\n\145\n\145\n\145\003\217\003\217\t5\003\217\007\222\003\217\001\182\003\217\003\217\t9\003\217\003\217\003\217\003\217\012\253\003\217\003\217\000\238\003\217\003\217\003\217\015\142\003\217\003\217\003\217\003\217\001\186\003\217\007\222\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\025v\007\030\006\154\003\217\000\238\003\217\003\217\003\217\003\217\003\217\tr\003\217\003\217\t~\003\217\001\198\003\217\003\217\003\217\015\202\025z\003\217\003\217\003\217\003\217\003\217\003\217\003\217\b\134\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\004B\tN\t\174\007\138\003\217\003\217\t5\001f\003\145\003\217\003\217\003\217\003\217\003\217\003\217\001\234\003\217\003\217\003\217\003\217\tV\000\238\t\182\003\217\001\238\003\217\003\217\002&\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\003\217\r\001\003\217\003\217\003\217\003\217\003\217\003\201\003\201\004F\003\201\007\154\003\201\002N\003\201\003\201\001\206\003\201\003\201\003\201\003\201\r\001\003\201\003\201\003\158\003\201\003\201\003\201\003\177\003\201\003\201\003\201\003\201\002R\003\201\006\158\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\007\025\007\030\016:\003\201\001\218\003\201\003\201\003\201\003\201\003\201\005\253\003\201\003\201\001\206\003\201\005&\003\201\003\201\003\201\007\025\007\202\003\201\003\201\003\201\003\201\003\201\003\201\003\201\011B\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\015r\tN\t\174\007\138\003\201\003\201\001\222\003\162\011F\003\201\003\201\003\201\003\201\003\201\003\201\002v\003\201\003\201\003\201\003\201\tV\000\238\t\182\003\201\b\"\003\201\003\201\0022\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\003\201\007\025\003\201\003\201\003\201\003\201\003\201\n\r\n\r\000\238\n\r\b&\n\r\003j\n\r\n\r\015\150\n\r\n\r\n\r\n\r\001\206\n\r\n\r\006\193\n\r\n\r\n\r\t!\n\r\n\r\n\r\n\r\003n\n\r\004V\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\006\193\007\030\r\018\n\r\003\018\n\r\n\r\n\r\n\r\n\r\015v\n\r\n\r\002\190\n\r\012\146\n\r\n\r\n\r\002\214\b\146\n\r\n\r\n\r\n\r\n\r\n\r\n\r\004\174\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\002f\n\r\n\r\007\138\n\r\n\r\019&\003j\007.\n\r\n\r\n\r\n\r\n\r\n\r\003\n\n\r\n\r\n\r\n\r\n\r\000\238\n\r\n\r\0076\n\r\n\r\003n\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\003\134\003\138\n\r\n\r\n\r\n\r\n\005\n\005\019\146\n\005\r]\n\005\006Z\n\005\n\005\017r\n\005\n\005\n\005\n\005\004\014\n\005\n\005\r]\n\005\n\005\n\005\005\002\n\005\n\005\n\005\n\005\019\154\n\005\006^\n\005\n\005\n\005\n\005\n\005\n\005\n\005\n\005\004\018\002j\004m\n\005\003\022\n\005\n\005\n\005\n\005\n\005\bI\n\005\n\005\000\238\n\005\012\170\n\005\n\005\n\005\001\206\004m\n\005\n\005\n\005\n\005\n\005\n\005\n\005\004m\n\005\n\005\n\005\n\005\n\005\n\005\n\005\n\005\n\005\n\005\n\005\000\238\n\005\n\005\b\174\n\005\n\005\003\026\006\170\006\194\n\005\n\005\n\005\n\005\n\005\n\005\r\206\n\005\n\005\n\005\n\005\n\005\002\154\n\005\n\005\005.\n\005\n\005\006\242\n\005\n\005\n\005\n\005\n\005\n\005\n\005\n\005\n\005\n\005\n\005\n\005\n\005\012j\006\242\n\005\n\005\n\005\n\005\n\021\n\021\019f\n\021\004\154\n\021\006\026\n\021\n\021\007\018\n\021\n\021\n\021\n\021\006\242\n\021\n\021\012n\n\021\n\021\n\021\007\210\n\021\n\021\n\021\n\021\006\242\n\021\011j\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\0056\015\226\019n\n\021\018\218\n\021\n\021\n\021\n\021\n\021\006\005\n\021\n\021\004V\n\021\012\190\n\021\n\021\n\021\015\234\005>\n\021\n\021\n\021\n\021\n\021\n\021\n\021\022n\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\006\174\n\021\n\021\tr\n\021\n\021\t~\006\202\016\222\n\021\n\021\n\021\n\021\n\021\n\021\004b\n\021\n\021\n\021\n\021\n\021\014\134\n\021\n\021\011r\n\021\n\021\003\022\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\t\194\006\242\n\021\n\021\n\021\n\021\t\245\t\245\b\245\t\245\011j\t\245\004\214\t\245\t\245\025\206\t\245\t\245\t\245\t\245\t\198\t\245\t\245\000\238\t\245\t\245\t\245\018*\t\245\t\245\t\245\t\245\004\214\t\245\006\190\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\007\222\018\206\006\254\t\245\000\238\t\245\t\245\t\245\t\245\t\245\011^\t\245\t\245\000\238\t\245\012\222\t\245\t\245\t\245\018\218\014~\t\245\t\245\t\245\t\245\t\245\t\245\t\245\022\182\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\016N\t\245\t\245\tr\t\245\t\245\t~\014\150\b\245\t\245\t\245\t\245\t\245\t\245\t\245\014\154\t\245\t\245\t\245\t\245\t\245\025\210\t\245\t\245\014B\t\245\t\245\t\002\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\003\134\018\130\t\245\t\245\t\245\t\245\t\253\t\253\b\241\t\253\012\022\t\253\012Z\t\253\t\253\018\150\t\253\t\253\t\253\t\253\007\158\t\253\t\253\012>\t\253\t\253\t\253\014J\t\253\t\253\t\253\t\253\012\026\t\253\012^\t\253\t\253\t\253\t\253\t\253\t\253\t\253\t\253\012B\007\030\t\"\t\253\000\238\t\253\t\253\t\253\t\253\t\253\022\142\t\253\t\253\004B\t\253\012\242\t\253\t\253\t\253\001\222\017\014\t\253\t\253\t\253\t\253\t\253\t\253\t\253\004m\t\253\t\253\t\253\t\253\t\253\t\253\t\253\t\253\t\253\t\253\t\253\tn\t\253\t\253\007\138\t\253\t\253\t\238\022\150\b\241\t\253\t\253\t\253\t\253\t\253\t\253\005\253\t\253\t\253\t\253\t\253\t\253\000\238\t\253\t\253\027\226\t\253\t\253\t\150\t\253\t\253\t\253\t\253\t\253\t\253\t\253\t\253\t\253\t\253\t\253\t\253\t\253\012\138\000\238\t\253\t\253\t\253\t\253\n5\n5\023\026\n5\n\210\n5\012\162\n5\n5\000\238\n5\n5\n5\n5\012\142\n5\n5\t\194\n5\n5\n5\012>\n5\n5\n5\n5\023\"\n5\012\166\n5\n5\n5\n5\n5\n5\n5\n5\012\218\007\030\011z\n5\r\030\n5\n5\n5\n5\n5\bA\n5\n5\019\214\n5\r\006\n5\n5\n5\019r\017*\n5\n5\n5\n5\n5\n5\n5\004m\n5\n5\n5\n5\n5\n5\n5\n5\n5\n5\n5\019V\n5\n5\007\138\n5\n5\tj\t\154\t\162\n5\n5\n5\n5\n5\n5\002\142\n5\n5\n5\n5\n5\000\238\n5\n5\006\t\n5\n5\t\t\n5\n5\n5\n5\n5\n5\n5\n5\n5\n5\n5\n5\n5\000\238\000\238\n5\n5\n5\n5\n%\n%\015\022\n%\011\158\n%\012\022\n%\n%\t\178\n%\n%\n%\n%\012j\n%\n%\012Z\n%\n%\n%\000\238\n%\n%\n%\n%\028+\n%\012\238\n%\n%\n%\n%\n%\n%\n%\n%\rF\007\030\r2\n%\r\150\n%\n%\n%\n%\n%\015\158\n%\n%\023\174\n%\r\"\n%\n%\n%\016\"\025\222\n%\n%\n%\n%\n%\n%\n%\t\t\n%\n%\n%\n%\n%\n%\n%\n%\n%\n%\n%\007\158\n%\n%\007\138\n%\n%\015\026\n\234\011\002\n%\n%\n%\n%\n%\n%\002\142\n%\n%\n%\n%\n%\000\238\n%\n%\011&\n%\n%\026\238\n%\n%\n%\n%\n%\n%\n%\n%\n%\n%\n%\n%\n%\027\230\001\222\n%\n%\n%\n%\n\029\n\029\r\154\n\029\015\162\n\029\012\138\n\029\n\029\011V\n\029\n\029\n\029\n\029\015N\n\029\n\029\012\162\n\029\n\029\n\029\000\238\n\029\n\029\n\029\n\029\rv\n\029\011j\n\029\n\029\n\029\n\029\n\029\n\029\n\029\n\029\015R\007\030\r\130\n\029\001\206\n\029\n\029\n\029\n\029\n\029\011\134\n\029\n\029\014r\n\029\r6\n\029\n\029\n\029\011\"\027\130\n\029\n\029\n\029\n\029\n\029\n\029\n\029\026\242\n\029\n\029\n\029\n\029\n\029\n\029\n\029\n\029\n\029\n\029\n\029\002\190\n\029\n\029\007\138\n\029\n\029\026f\012\186\018\138\n\029\n\029\n\029\n\029\n\029\n\029\001\206\n\029\n\029\n\029\n\029\n\029\000\238\n\029\n\029\019\178\n\029\n\029\t\r\n\029\n\029\n\029\n\029\n\029\n\029\n\029\n\029\n\029\n\029\n\029\n\029\n\029\001\002\001\190\n\029\n\029\n\029\n\029\n-\n-\0196\n-\017\246\n-\014^\n-\n-\025\142\n-\n-\n-\n-\015~\n-\n-\004m\n-\n-\n-\000\238\n-\n-\n-\n-\014b\n-\r\142\n-\n-\n-\n-\n-\n-\n-\n-\015\130\004m\014v\n-\r\166\n-\n-\n-\n-\n-\019\158\n-\n-\000\238\n-\rJ\n-\n-\n-\019\150\r\174\n-\n-\n-\n-\n-\n-\n-\t\r\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\bQ\n-\n-\016^\n-\n-\022\154\003\165\002j\n-\n-\n-\n-\n-\n-\bM\n-\n-\n-\n-\n-\006\129\n-\n-\r\194\n-\n-\014\222\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\006\129\015\170\n-\n-\n-\n-\n}\n}\014\226\n}\006\001\n}\019j\n}\n}\019\238\n}\n}\n}\n}\006\r\n}\n}\015\174\n}\n}\n}\024F\n}\n}\n}\n}\001v\n}\r\242\n}\n}\n}\n}\n}\n}\n}\n}\014\030\023&\020J\n}\024J\n}\n}\n}\n}\n}\000\238\n}\n}\015\254\n}\rV\n}\n}\n}\023\226\019\226\n}\n}\n}\n}\n}\n}\n}\b\029\n}\n}\n}\n}\n}\n}\n}\n}\n}\n}\n}\0206\n}\n}\007n\n}\n}\bE\016&\003\254\n}\n}\n}\n}\n}\n}\019\246\n}\n}\n}\n}\n}\006\137\n}\n}\n\210\n}\n}\000\238\n}\n}\n}\n}\n}\n}\n}\n}\n}\n}\n}\n}\n}\006\137\016B\n}\n}\n}\n}\003\197\003\197\023\198\003\197\016F\003\197\016n\003\197\003\197\020N\003\197\003\197\003\197\003\197\020\026\003\197\003\197\000\238\003\197\003\197\003\197\026\154\003\197\003\197\003\197\003\197\001\134\003\197\025\170\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\007n\003\134\003\138\003\197\026\210\003\197\003\197\003\197\003\197\003\197\022\246\003\197\003\197\001\206\003\197\006\246\003\197\003\197\003\197\022\214\022\146\003\197\003\197\003\197\003\197\003\197\003\197\003\197\re\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\bA\tN\t\174\023\030\003\197\003\197\016\130\005\001\019\246\003\197\003\197\003\197\003\197\003\197\003\197\027J\003\197\003\197\003\197\003\197\tV\006\145\t\182\003\197\rq\003\197\003\197\016\154\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\006\145\003\197\003\197\003\197\003\197\003\197\002\021\002\021\026\226\002\021\016\174\002\021\016\218\002\190\002\021\000\238\002\130\002\021\tf\002\021\023\186\002\246\002\021\025\174\002\021\002\021\002\021\016\238\002\021\002\021\002\021\001\210\001\150\t\158\017\238\002\250\002\021\002\021\002\021\002\021\002\021\t\166\002\021\007n\017\250\023V\002\254\002\006\002\021\002\021\002\021\002\021\002\021\024\134\0032\001\190\004\133\002\021\006\022\002\021\002\021\002\178\001\206\024\026\003:\002\021\002\021\002\021\b\026\b\030\b*\018\158\012v\005v\002\021\002\021\002\021\002\021\002\021\002\021\002\021\002\021\002\021\003\022\tN\t\174\007n\002\021\002\021\001\222\018\182\019>\002\021\005\130\005\134\002\021\002\021\002\021\002\226\002\021\002\021\002\021\002\021\012~\002\154\012\206\002\021\019B\002\021\002\021\019z\002\021\002\021\002\021\002\021\002\021\002\021\005\138\b2\002\021\002\021\002\021\bJ\004r\001\002\001\190\002\021\002\021\002\021\002\021\ne\ne\019~\ne\026\214\ne\019\166\002\190\ne\019\170\002\130\ne\ne\ne\019\210\002\246\ne\024\138\ne\ne\ne\020~\ne\ne\ne\001\210\020\130\ne\020\166\002\250\ne\ne\ne\ne\ne\ne\ne\020\170\020\186\025f\002\254\020\202\ne\ne\ne\ne\ne\004B\0032\001\190\020\214\ne\021\n\ne\ne\002\178\025\154\021\014\003:\ne\ne\ne\b\026\b\030\b*\021Z\ne\005v\ne\ne\ne\ne\ne\ne\ne\ne\ne\027v\ne\ne\021\130\ne\ne\021\134\021\150\021\230\ne\005\130\005\134\ne\ne\ne\028K\ne\ne\ne\ne\ne\004R\ne\ne\022\006\ne\ne\022F\ne\ne\ne\ne\ne\ne\005\138\b2\ne\ne\ne\bJ\004r\022j\022z\ne\ne\ne\ne\na\na\022\162\na\022\166\na\022\178\002\190\na\025j\002\130\na\na\na\022\194\002\246\na\022\222\na\na\na\022\238\na\na\na\001\210\025\158\na\023\002\002\250\na\na\na\na\na\na\na\023.\0232\023>\002\254\023N\na\na\na\na\na\027z\0032\001\190\028[\na\023b\na\na\002\178\007n\024V\003:\na\na\na\b\026\b\030\b*\024\174\na\005v\na\na\na\na\na\na\na\na\na\024\214\na\na\025>\na\na\025N\025\242\025\250\na\005\130\005\134\na\na\na\026\n\na\na\na\na\na\026\022\na\na\026z\na\na\026\142\na\na\na\na\na\na\005\138\b2\na\na\na\bJ\004r\026\190\026\198\na\na\na\na\002a\002a\027\002\002a\027*\002a\027b\002\190\002a\027\146\002\130\002a\tf\002a\027\158\002\246\002a\027\166\002a\002a\002a\027\175\002a\002a\002a\001\210\027\191\t\158\027\210\002\250\002a\002a\002a\002a\002a\t\166\002a\027\238\028\011\028\027\002\254\004m\002a\002a\002a\002a\002a\0287\0032\001\190\028k\002a\028\135\002a\002a\002\178\004\226\028\146\003:\002a\002a\002a\b\026\b\030\b*\028\199\012v\005v\002a\002a\002a\002a\002a\002a\002a\002a\002a\028\219\028\227\002a\000\238\002a\002a\004m\029\031\029'\002a\005\130\005\134\002a\002a\002a\000\000\002a\002a\002a\002a\000\000\004m\000\000\002a\004m\002a\002a\004m\002a\002a\002a\002a\002a\002a\005\138\b2\002a\002a\002a\bJ\004r\000\000\004m\002a\002a\002a\002a\004m\007\030\004m\015&\004m\004m\004m\004m\004m\004m\004m\005F\004m\000\238\004m\004m\000\238\004m\004m\004m\017\030\004m\004m\004m\004m\004m\004m\004m\004m\004m\000\000\004m\004m\000\000\004m\004m\004m\000\238\004m\004m\004m\004m\004m\007\138\004m\004m\004m\004m\004m\004m\004m\004m\000\238\004m\004m\004m\004m\004m\004m\004m\004m\000\238\004m\004m\004m\004m\004m\004m\004m\004m\b\241\005J\004m\000\000\004\242\004m\004m\004m\000\238\004m\tN\t\174\004m\004m\004m\004m\004m\004m\004m\004m\004m\006F\022^\004m\004m\000\000\000\000\007f\004m\tV\007\021\t\182\004m\004m\004\214\007n\017\"\022\206\000\000\000\238\004m\004m\004m\007r\000\000\004m\004m\004m\004m\007\021\000\161\004m\000\161\007\021\000\161\000\161\000\161\000\161\000\161\000\161\000\161\004\213\000\161\023\130\000\161\000\161\000\000\000\161\000\161\001\002\001\190\000\161\000\161\000\000\000\161\000\161\000\161\000\161\004N\000\161\006~\000\161\000\161\b\241\004\213\000\161\000\161\000\000\000\161\000\161\000\161\000\238\000\161\t%\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\000\b\138\000\161\000\161\004B\000\000\000\161\000\161\002\006\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\002\n\007\021\000\161\016\026\004\217\000\161\002\130\000\161\001\210\000\161\006\130\002\190\000\000\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\000\000\000\000\000\000\161\003\154\000\000\004\217\tQ\000\222\000\000\007\002\001\222\000\161\000\000\002\190\000\000\004R\002\178\000\161\000\161\000\161\000\161\000\000\016\030\000\161\000\161\000\161\000\161\002Q\002Q\tQ\002Q\003\n\002Q\000\000\002\190\002Q\016*\002\130\002Q\000\000\002Q\000\000\002\246\002Q\007\006\002Q\002Q\002Q\000\000\002Q\002Q\002Q\001\210\000\000\000\000\003\n\002\250\002Q\002Q\002Q\002Q\002Q\005\134\002Q\000\000\000\000\000\000\002\254\b\213\002Q\002Q\002Q\002Q\002Q\000\000\0032\b.\000\000\002Q\000\000\002Q\002Q\002\178\000\000\006\"\003:\002Q\002Q\002Q\b\026\b\030\b*\000\000\000\000\005v\002Q\002Q\002Q\002Q\002Q\002Q\002Q\002Q\002Q\006&\tN\t\174\b\213\002Q\002Q\000\000\000\000\000\000\002Q\005\130\005\134\002Q\002Q\002Q\000\000\002Q\002Q\002Q\002Q\tV\000\000\t\182\002Q\b\213\002Q\002Q\000\000\002Q\002Q\002Q\002Q\002Q\002Q\005\138\b2\002Q\002Q\002Q\bJ\004r\000\238\003\t\002Q\002Q\002Q\002Q\002m\002m\000\000\002m\005\185\002m\000\000\000\000\002m\000\000\b\213\002m\000\n\002m\004\254\000\000\002m\b\213\002m\002m\002m\000\n\002m\002m\002m\t%\028w\003\t\003\t\003\t\002m\002m\002m\002m\002m\000\000\002m\003\t\006*\007)\003\t\005\234\002m\002m\002m\002m\002m\005\185\0066\003\t\000\000\002m\006B\002m\002m\000\n\000\000\000\000\007)\002m\002m\002m\007)\018\134\000\238\005\185\000\000\000\000\002m\002m\002m\002m\002m\002m\002m\002m\002m\000\000\tN\t\174\000\000\002m\002m\003\t\000\000\t%\002m\000\000\000\000\002m\002m\002m\000\000\002m\002m\002m\002m\tV\002\190\t\182\002m\002\130\002m\002m\003\t\002m\002m\002m\002m\002m\002m\b\209\tZ\002m\002m\002m\000\000\000\000\t%\000\000\002m\002m\002m\002m\002i\002i\rz\002i\r\134\002i\005f\003\022\002i\000\n\000\000\002i\000\000\002i\018R\018\030\002i\011\218\002i\002i\002i\014\242\002i\002i\002i\003\t\b\209\000\000\000\000\016*\002i\002i\002i\002i\002i\000\000\002i\003\t\003\t\000\000\015\002\000\000\002i\002i\002i\002i\002i\b\209\bf\001\190\001*\002i\000\000\002i\002i\005\134\003\t\003\t\014f\002i\002i\002i\014\210\015\014\015\030\001\002\001\190\000\000\002i\002i\002i\002i\002i\002i\002i\002i\002i\000\000\tN\t\174\b\209\002i\002i\000\n\004\254\000\000\002i\b\209\000\000\002i\002i\002i\000\000\002i\002i\002i\002i\tV\000\000\t\182\002i\002\226\002i\002i\014\234\002i\002i\002i\002i\002i\002i\003\t\0126\002i\002i\002i\000\000\004\133\000\000\000\000\002i\002i\002i\002i\002U\002U\012R\002U\012b\002U\000\000\003\022\002U\000\000\000\000\002U\000\000\002U\000\000\014\154\002U\000\000\002U\002U\002U\012\130\002U\002U\002U\003\t\003\t\017J\000\000\000\000\002U\002U\002U\002U\002U\012\154\002U\012\178\004\133\000\000\003\t\r\022\002U\002U\002U\002U\002U\000\000\bf\015^\000\000\002U\000\n\002U\002U\r*\000\000\r>\014f\002U\002U\002U\014\210\015\014\015\030\007\001\000\000\000\000\002U\002U\002U\002U\002U\002U\002U\002U\002U\000\000\tN\t\174\003\t\002U\002U\000\000\006\134\000\000\002U\000\238\007\001\002U\002U\002U\000\000\002U\002U\002U\002U\tV\000\000\t\182\002U\000\000\002U\002U\000\000\002U\002U\002U\002U\002U\002U\000\000\000\000\002U\002U\002U\000\000\t:\000\000\000\000\002U\002U\002U\002U\002e\002e\000\000\002e\000\000\002e\012\193\006*\002e\000\000\005\234\002e\000\000\002e\000\000\000\000\002e\0066\002e\002e\002e\006B\002e\002e\002e\012\193\012\193\000\000\000\000\012\193\002e\002e\002e\002e\002e\000\000\002e\bA\000\000\000\000\bA\000\000\002e\002e\002e\002e\002e\000\000\000\000\000\000\000\000\002e\000\000\002e\002e\000\000\000\000\000\000\022\214\002e\002e\002e\000\000\000\000\tM\000\000\000\000\000\238\002e\002e\002e\002e\002e\002e\002e\002e\002e\000\000\bA\002e\000\000\002e\002e\015>\000\000\000\000\002e\tM\000\000\002e\002e\002e\bA\002e\002e\002e\002e\012\193\000\000\005)\002e\000\000\002e\002e\000\000\t\206\002e\002e\002e\002e\002e\005)\t\138\002e\002e\002e\000\000\000\000\bA\000\000\002e\002e\002e\002e\tY\tY\000\000\tY\000\000\tY\000\000\000\000\tY\000\000\000\000\tY\000\000\tY\000\000\000\000\t\250\005)\tY\n\030\tY\bA\tY\tY\tY\000\000\000\000\000\000\000\000\017\186\n2\nJ\nR\n:\nZ\000\000\tY\000\000\000\000\000\000\000\000\000\000\tY\tY\nb\nj\tY\005)\b!\000\000\005)\tY\000\000\nr\tY\000\000\000\000\000\000\000\000\tY\tY\000\238\000\000\000\000\000\000\000\000\000\000\002\246\tY\tY\n\002\nB\nz\n\130\n\146\tY\tY\002\166\r\005\tY\000\000\tY\n\154\000\000\003Z\000\000\tY\000\238\000\000\tY\tY\n\162\000\000\tY\tY\tY\tY\003f\r\005\000\000\tY\000\000\tY\tY\002B\n\194\tY\n\202\n\138\tY\tY\000\000\000\000\tY\n\170\tY\000\000\002F\000\000\005v\tY\tY\n\178\n\186\002\153\002\153\000\000\002\153\000\000\002\153\012\201\006*\002\153\000\000\005\234\002\153\000\000\002\153\000\000\005\130\002\153\0066\002\153\002\153\002\153\006B\002\153\002\153\002\153\012\201\012\201\000\000\000\000\012\201\002\153\002\153\002\153\002\153\002\153\000\000\002\153\016\026\000\000\005\138\002\130\000\000\002\153\002\153\002\153\002\153\002\153\000\000\000\000\000\000\000\000\002\153\000\000\002\153\002\153\000\000\000\000\000\000\000\000\002\153\002\153\002\153\000\000\000\000\000\000\000\000\000\000\000\238\002\153\002\153\n\002\002\153\002\153\002\153\002\153\002\153\002\153\000\000\016\030\002\153\000\000\002\153\002\153\000\000\000\000\000\000\002\153\000\000\000\000\002\153\002\153\002\153\016*\002\153\002\153\002\153\002\153\012\201\000\000\001\206\002\153\000\000\002\153\002\153\000\000\002\153\002\153\002\153\002\153\002\153\002\153\026\174\000\000\002\153\002\153\002\153\000\000\000\000\005\134\000\000\002\153\002\153\002\153\002\153\002\129\002\129\000\000\002\129\000\000\002\129\000\000\002\190\002\129\000\000\000\000\002\129\000\000\002\129\003\170\000\000\002\129\002\154\002\129\002\129\002\129\026\030\002\129\002\129\002\129\001\210\000\000\000\000\000\000\000\000\002\129\002\129\002\129\002\129\002\129\000\000\002\129\016\026\000\000\000\000\002\130\000\000\002\129\002\129\002\129\002\129\002\129\004\154\003\202\000\000\005\005\002\129\000\000\002\129\002\129\002\178\000\000\000\000\000\000\002\129\002\129\002\129\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\129\n\002\002\129\002\129\002\129\002\129\002\129\002\129\000\000\016\030\002\129\000\000\002\129\002\129\006\234\000\000\000\000\002\129\000\000\000\000\002\129\002\129\002\129\016*\002\129\002\129\002\129\002\129\000\000\000\000\000\000\002\129\000\000\002\129\002\129\000\000\002\129\002\129\002\129\002\129\002\129\002\129\012\197\000\000\002\129\002\129\002\129\000\000\000\000\005\134\000\000\002\129\002\129\002\129\002\129\002\141\002\141\000\000\002\141\000\000\002\141\012\197\012\197\002\141\000\000\012\197\002\141\000\000\002\141\000\000\000\000\t\250\000\000\002\141\002\141\002\141\021\178\002\141\002\141\002\141\000\000\000\000\000\000\000\000\000\000\002\141\002\141\002\141\n:\002\141\000\000\002\141\000\000\000\000\000\000\000\000\000\000\002\141\002\141\002\141\002\141\002\141\000\000\000\238\000\000\000\000\002\141\000\000\002\141\002\141\000\000\000\000\000\000\000\000\002\141\002\141\002\141\000\000\000\000\000\000\000\000\000\000\000\000\002\141\002\141\n\002\nB\002\141\002\141\002\141\002\141\002\141\000\000\012\197\002\141\000\000\002\141\002\141\000\000\000\000\000\000\002\141\000\238\b5\002\141\002\141\002\141\b5\002\141\002\141\002\141\002\141\000\000\000\000\000\000\002\141\000\000\002\141\002\141\000\000\002\141\002\141\002\141\002\141\002\141\002\141\000\000\000\000\002\141\002\141\002\141\000\000\011\170\000\000\000\000\002\141\002\141\002\141\002\141\002\157\002\157\000\000\002\157\000\000\002\157\b5\011\178\002\157\000\000\011\190\002\157\000\000\002\157\000\000\000\000\002\157\011\202\002\157\002\157\002\157\011\214\002\157\002\157\002\157\000\000\000\000\b5\000\000\000\000\002\157\002\157\002\157\002\157\002\157\000\000\002\157\000\000\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\002\157\000\000\000\000\000\000\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\000\000\002\157\002\157\002\157\000\000\000\000\004\254\000\000\000\000\000\000\002\157\002\157\n\002\002\157\002\157\002\157\002\157\002\157\002\157\000\000\007\234\002\157\000\000\002\157\002\157\000\000\000\000\000\000\002\157\000\238\b1\002\157\002\157\002\157\b1\002\157\002\157\002\157\002\157\000\000\007\238\000\000\002\157\000\000\002\157\002\157\000\000\002\157\002\157\002\157\002\157\002\157\002\157\000\000\000\000\002\157\002\157\002\157\000\000\007\209\000\000\000\000\002\157\002\157\002\157\002\157\002}\002}\007\222\002}\000\000\002}\b1\007\209\002}\000\000\005\234\002}\000\000\002}\000\000\000\238\002}\007\209\002}\002}\002}\007\209\002}\002}\002}\000\000\000\000\b1\000\000\000\000\002}\002}\002}\002}\002}\000\000\002}\000\000\000\000\007\025\000\000\000\000\002}\002}\002}\002}\002}\000\000\000\000\000\000\000\000\002}\000\000\002}\002}\000\000\000\000\000\000\007\025\002}\002}\002}\007\025\007\242\004\254\000\000\000\000\000\000\002}\002}\n\002\002}\002}\002}\002}\002}\002}\000\000\000\000\002}\000\000\002}\002}\000\000\000\000\000\000\002}\007\233\000\000\002}\002}\002}\000\000\002}\002}\002}\002}\000\000\000\000\000\000\002}\000\000\002}\002}\000\000\002}\002}\002}\002}\002}\002}\000\000\000\000\002}\002}\002}\000\000\007\233\000\000\000\000\002}\002}\002}\002}\002\137\002\137\000\000\002\137\000\000\002\137\b&\007\233\002\137\000\000\005\234\002\137\000\000\002\137\000\000\000\000\t\250\007\233\002\137\002\137\002\137\007\233\002\137\002\137\002\137\000\000\000\000\000\000\000\000\000\000\002\137\002\137\002\137\n:\002\137\000\000\002\137\000\000\000\000\000\000\000\000\000\000\002\137\002\137\002\137\002\137\002\137\000\000\000\000\000\000\000\000\002\137\000\000\002\137\002\137\000\000\000\000\000\000\000\000\002\137\002\137\002\137\000\000\000\000\000\000\000\000\000\000\000\000\002\137\002\137\n\002\nB\002\137\002\137\002\137\002\137\002\137\000\000\000\000\002\137\000\000\002\137\002\137\000\000\000\000\000\000\002\137\000\238\000\000\002\137\002\137\002\137\000\000\002\137\002\137\002\137\002\137\000\000\000\000\000\000\002\137\000\000\002\137\002\137\000\000\002\137\002\137\002\137\002\137\002\137\002\137\000\000\000\000\002\137\002\137\002\137\000\000\b\005\000\000\000\000\002\137\002\137\002\137\002\137\002\133\002\133\000\000\002\133\000\000\002\133\000\000\006*\002\133\000\000\005\234\002\133\000\000\002\133\000\000\000\000\t\250\b\005\002\133\002\133\002\133\b\005\002\133\002\133\002\133\000\000\000\000\000\000\000\000\000\000\002\133\002\133\002\133\n:\002\133\000\000\002\133\000\000\000\000\000\000\000\000\000\000\002\133\002\133\002\133\002\133\002\133\000\000\000\000\000\000\000\000\002\133\000\000\002\133\002\133\000\000\000\000\000\000\000\000\002\133\002\133\002\133\000\000\000\000\000\000\000\000\000\000\000\000\002\133\002\133\n\002\nB\002\133\002\133\002\133\002\133\002\133\000\000\000\000\002\133\000\000\002\133\002\133\000\000\000\000\000\000\002\133\007\253\000\000\002\133\002\133\002\133\000\000\002\133\002\133\002\133\002\133\000\000\000\000\000\000\002\133\000\000\002\133\002\133\000\000\002\133\002\133\002\133\002\133\002\133\002\133\000\000\000\000\002\133\002\133\002\133\000\000\007\253\000\000\000\000\002\133\002\133\002\133\002\133\002\173\002\173\000\000\002\173\000\000\002\173\000\000\011\238\002\173\000\000\007\253\002\173\000\000\002\173\000\000\000\000\t\250\007\253\002\173\002\173\002\173\007\253\002\173\002\173\002\173\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\173\000\000\000\000\000\000\000\000\000\000\002\173\002\173\nb\nj\002\173\000\000\000\000\000\000\000\000\002\173\000\000\nr\002\173\000\000\000\000\000\000\000\000\002\173\002\173\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\173\002\173\n\002\nB\nz\n\130\n\146\002\173\002\173\000\000\000\000\002\173\000\000\002\173\n\154\000\000\000\000\000\000\002\173\000\238\000\000\002\173\002\173\n\162\000\000\002\173\002\173\002\173\002\173\000\000\000\000\000\000\002\173\000\000\002\173\002\173\000\000\002\173\002\173\002\173\n\138\002\173\002\173\000\000\000\000\002\173\n\170\002\173\000\000\007\205\000\000\000\000\002\173\002\173\n\178\n\186\002\149\002\149\000\000\002\149\000\000\002\149\000\000\007\205\002\149\000\000\005\234\002\149\000\000\002\149\000\000\000\000\t\250\007\205\002\149\002\149\002\149\007\205\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\n:\002\149\000\000\002\149\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\002\149\000\000\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\n\002\nB\002\149\002\149\002\149\002\149\002\149\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\002\149\000\238\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\002\149\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\002\149\002\149\002\149\002\149\002\149\002\149\000\000\000\000\002\149\002\149\002\149\000\000\0146\000\000\000\000\002\149\002\149\002\149\002\149\002\145\002\145\000\000\002\145\000\000\002\145\000\000\011\178\002\145\000\000\011\190\002\145\000\000\002\145\000\000\000\000\t\250\011\202\002\145\002\145\002\145\011\214\002\145\002\145\002\145\000\000\000\000\000\000\000\000\000\000\002\145\002\145\002\145\n:\002\145\000\000\002\145\000\000\000\000\000\000\000\000\000\000\002\145\002\145\002\145\002\145\002\145\000\000\000\000\000\000\000\000\002\145\000\000\002\145\002\145\000\000\000\000\000\000\000\000\002\145\002\145\002\145\000\000\000\000\000\000\000\000\000\000\000\000\002\145\002\145\n\002\nB\002\145\002\145\002\145\002\145\002\145\000\000\000\000\002\145\000\000\002\145\002\145\000\000\000\000\000\000\002\145\000\000\000\000\002\145\002\145\002\145\000\000\002\145\002\145\002\145\002\145\000\000\000\000\000\000\002\145\000\000\002\145\002\145\000\000\002\145\002\145\002\145\002\145\002\145\002\145\000\000\000\000\002\145\002\145\002\145\000\000\000\000\000\000\000\000\002\145\002\145\002\145\002\145\002\165\002\165\000\000\002\165\000\000\002\165\000\000\002\006\002\165\000\000\002\130\002\165\000\000\002\165\000\000\000\000\t\250\000\000\002\165\002\165\002\165\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\002\165\000\000\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\nb\nj\002\165\000\000\027\202\001\222\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\002\165\002\165\000\238\016*\000\000\000\000\000\000\000\000\000\000\002\165\002\165\n\002\nB\nz\n\130\002\165\002\165\002\165\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\002\165\000\000\005\134\002\165\002\165\002\165\000\000\002\165\002\165\002\165\002\165\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\002\165\002\165\002\165\n\138\002\165\002\165\000\000\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002y\002y\000\000\002y\000\000\002y\000\000\003\022\002y\000\000\000\000\002y\000\000\002y\000\000\000\000\t\250\000\000\002y\002y\002y\000\000\002y\002y\002y\000\000\000\000\000\000\000\000\000\000\002y\002y\002y\n:\002y\000\000\002y\000\000\000\000\000\000\000\000\000\000\002y\002y\002y\002y\002y\000\000\005\190\000\000\000\000\002y\000\000\002y\002y\000\000\000\000\000\000\003\246\002y\002y\002y\006N\000\000\004\002\000\000\000\000\000\000\002y\002y\n\002\nB\002y\002y\002y\002y\002y\000\000\000\000\002y\000\000\002y\002y\000\000\000\000\000\000\002y\000\000\000\000\002y\002y\002y\000\000\002y\002y\002y\002y\000\000\000\000\000\000\002y\000\000\002y\002y\000\000\002y\002y\002y\002y\002y\002y\000\000\000\000\002y\002y\002y\000\000\000\000\000\000\000\000\002y\002y\002y\002y\002u\002u\000\000\002u\000\000\002u\000\000\002\190\002u\000\000\000\000\002u\000\000\002u\000\000\000\000\t\250\000\000\002u\002u\002u\000\000\002u\002u\002u\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\002u\000\000\002u\000\000\000\000\000\000\000\000\000\000\002u\002u\nb\nj\002u\000\000\t\186\003\n\000\000\002u\000\000\002u\002u\000\000\000\000\000\000\000\000\002u\002u\000\238\012\014\000\000\012\030\000\000\000\000\000\000\002u\002u\n\002\nB\nz\n\130\002u\002u\002u\000\000\000\000\002u\000\000\002u\002u\000\000\000\000\000\000\002u\000\000\000\000\002u\002u\002u\000\000\002u\002u\002u\002u\000\000\000\000\000\000\002u\000\000\002u\002u\000\000\002u\002u\002u\n\138\002u\002u\000\000\000\000\002u\002u\002u\000\000\000\000\000\000\000\000\002u\002u\002u\002u\002\209\002\209\000\000\002\209\000\000\002\209\000\000\002\190\002\209\000\000\000\000\002\209\000\000\002\209\000\000\000\000\t\250\000\000\002\209\002\209\002\209\000\000\002\209\002\209\002\209\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\002\209\000\000\002\209\000\000\000\000\000\000\000\000\000\000\002\209\002\209\nb\nj\002\209\000\000\012\210\003\n\000\000\002\209\000\000\002\209\002\209\000\000\000\000\000\000\000\000\002\209\002\209\002\209\012\230\000\000\012\250\000\000\000\000\000\000\002\209\002\209\n\002\nB\nz\002\209\002\209\002\209\002\209\000\000\000\000\002\209\000\000\002\209\002\209\000\000\000\000\000\000\002\209\000\000\000\000\002\209\002\209\002\209\000\000\002\209\002\209\002\209\002\209\000\000\000\000\000\000\002\209\000\000\002\209\002\209\000\000\002\209\002\209\002\209\n\138\002\209\002\209\000\000\000\000\002\209\002\209\002\209\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002q\002q\000\000\002q\000\000\002q\000\000\000\000\002q\000\000\000\000\002q\000\000\002q\000\000\000\000\t\250\000\000\002q\002q\002q\000\000\002q\002q\002q\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\002q\000\000\002q\000\000\000\000\000\000\000\000\000\000\002q\002q\nb\nj\002q\000\000\000\000\000\000\000\000\002q\000\000\002q\002q\000\000\000\000\000\000\000\000\002q\002q\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002q\002q\n\002\nB\nz\n\130\002q\002q\002q\000\000\000\000\002q\000\000\002q\002q\000\000\000\000\000\000\002q\000\000\000\000\002q\002q\002q\000\000\002q\002q\002q\002q\000\000\000\000\000\000\002q\000\000\002q\002q\000\000\002q\002q\002q\n\138\002q\002q\000\000\000\000\002q\002q\002q\000\000\000\000\000\000\000\000\002q\002q\002q\002q\002\169\002\169\000\000\002\169\000\000\002\169\000\000\000\000\002\169\000\000\000\000\002\169\000\000\002\169\000\000\000\000\t\250\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\002\169\000\000\002\169\000\000\000\000\000\000\000\000\000\000\002\169\002\169\nb\nj\002\169\000\000\000\000\000\000\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\002\169\002\169\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\169\002\169\n\002\nB\nz\n\130\002\169\002\169\002\169\000\000\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\002\169\000\000\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\002\169\000\000\000\000\000\000\002\169\000\000\002\169\002\169\000\000\002\169\002\169\002\169\n\138\002\169\002\169\000\000\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\161\002\161\000\000\002\161\000\000\002\161\000\000\000\000\002\161\000\000\000\000\002\161\000\000\002\161\000\000\000\000\t\250\000\000\002\161\002\161\002\161\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\002\161\000\000\002\161\000\000\000\000\000\000\000\000\000\000\002\161\002\161\nb\nj\002\161\000\000\000\000\000\000\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\000\000\002\161\002\161\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\161\n\002\nB\nz\n\130\002\161\002\161\002\161\000\000\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\002\161\000\000\000\000\002\161\002\161\002\161\000\000\002\161\002\161\002\161\002\161\000\000\000\000\000\000\002\161\000\000\002\161\002\161\000\000\002\161\002\161\002\161\n\138\002\161\002\161\000\000\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\177\002\177\000\000\002\177\000\000\002\177\000\000\000\000\002\177\000\000\000\000\002\177\000\000\002\177\000\000\000\000\t\250\000\000\002\177\002\177\002\177\000\000\002\177\002\177\002\177\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\177\000\000\000\000\000\000\000\000\000\000\002\177\002\177\nb\nj\002\177\000\000\000\000\000\000\000\000\002\177\000\000\nr\002\177\000\000\000\000\000\000\000\000\002\177\002\177\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\177\002\177\n\002\nB\nz\n\130\n\146\002\177\002\177\000\000\000\000\002\177\000\000\002\177\n\154\000\000\000\000\000\000\002\177\000\000\000\000\002\177\002\177\n\162\000\000\002\177\002\177\002\177\002\177\000\000\000\000\000\000\002\177\000\000\002\177\002\177\000\000\002\177\002\177\002\177\n\138\002\177\002\177\000\000\000\000\002\177\n\170\002\177\000\000\000\000\000\000\000\000\002\177\002\177\n\178\n\186\002\181\002\181\000\000\002\181\000\000\002\181\000\000\000\000\002\181\000\000\000\000\002\181\000\000\002\181\000\000\000\000\t\250\000\000\002\181\002\181\002\181\000\000\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\002\181\000\000\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\nb\nj\002\181\000\000\000\000\000\000\000\000\002\181\000\000\nr\002\181\000\000\000\000\000\000\000\000\002\181\002\181\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\181\002\181\n\002\nB\nz\n\130\n\146\002\181\002\181\000\000\000\000\002\181\000\000\002\181\n\154\000\000\000\000\000\000\002\181\000\000\000\000\002\181\002\181\n\162\000\000\002\181\002\181\002\181\002\181\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\002\181\002\181\002\181\n\138\002\181\002\181\000\000\000\000\002\181\002\181\002\181\000\000\000\000\000\000\000\000\002\181\002\181\n\178\n\186\002\185\002\185\000\000\002\185\000\000\002\185\000\000\000\000\002\185\000\000\000\000\002\185\000\000\002\185\000\000\000\000\t\250\000\000\002\185\002\185\002\185\000\000\002\185\002\185\002\185\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\002\185\000\000\002\185\000\000\000\000\000\000\000\000\000\000\002\185\002\185\nb\nj\002\185\000\000\000\000\000\000\000\000\002\185\000\000\nr\002\185\000\000\000\000\000\000\000\000\002\185\002\185\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\185\n\002\nB\nz\n\130\n\146\002\185\002\185\000\000\000\000\002\185\000\000\002\185\n\154\000\000\000\000\000\000\002\185\000\000\000\000\002\185\002\185\n\162\000\000\002\185\002\185\002\185\002\185\000\000\000\000\000\000\002\185\000\000\002\185\002\185\000\000\002\185\002\185\002\185\n\138\002\185\002\185\000\000\000\000\002\185\002\185\002\185\000\000\000\000\000\000\000\000\002\185\002\185\n\178\n\186\t\021\t\021\000\000\t\021\000\000\t\021\000\000\000\000\t\021\000\000\000\000\t\021\000\000\t\021\000\000\000\000\t\250\000\000\t\021\t\021\t\021\000\000\t\021\t\021\t\021\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\t\021\000\000\000\000\000\000\000\000\000\000\t\021\t\021\nb\nj\t\021\000\000\000\000\000\000\000\000\t\021\000\000\nr\t\021\000\000\000\000\000\000\000\000\t\021\t\021\000\238\000\000\000\000\000\000\000\000\000\000\000\000\t\021\t\021\n\002\nB\nz\n\130\n\146\t\021\t\021\000\000\000\000\t\021\000\000\t\021\n\154\000\000\000\000\000\000\t\021\000\000\000\000\t\021\t\021\n\162\000\000\t\021\t\021\t\021\t\021\000\000\000\000\000\000\t\021\000\000\t\021\t\021\000\000\t\021\t\021\t\021\n\138\t\021\t\021\000\000\000\000\t\021\n\170\t\021\000\000\000\000\000\000\000\000\t\021\t\021\n\178\n\186\002\189\002\189\000\000\002\189\000\000\002\189\000\000\000\000\002\189\000\000\000\000\002\189\000\000\002\189\000\000\000\000\t\250\000\000\002\189\002\189\002\189\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\nb\nj\002\189\000\000\000\000\000\000\000\000\002\189\000\000\nr\002\189\000\000\000\000\000\000\000\000\002\189\002\189\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\n\002\nB\nz\n\130\n\146\002\189\002\189\000\000\000\000\002\189\000\000\002\189\n\154\000\000\000\000\000\000\002\189\000\000\000\000\002\189\002\189\n\162\000\000\002\189\002\189\002\189\002\189\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\n\194\002\189\n\202\n\138\002\189\002\189\000\000\000\000\002\189\n\170\002\189\000\000\000\000\000\000\000\000\002\189\002\189\n\178\n\186\t\017\t\017\000\000\t\017\000\000\t\017\000\000\000\000\t\017\000\000\000\000\t\017\000\000\t\017\000\000\000\000\t\250\000\000\t\017\t\017\t\017\000\000\t\017\t\017\t\017\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\t\017\000\000\000\000\000\000\000\000\000\000\t\017\t\017\nb\nj\t\017\000\000\000\000\000\000\000\000\t\017\000\000\nr\t\017\000\000\000\000\000\000\000\000\t\017\t\017\000\238\000\000\000\000\000\000\000\000\000\000\000\000\t\017\t\017\n\002\nB\nz\n\130\n\146\t\017\t\017\000\000\000\000\t\017\000\000\t\017\n\154\000\000\000\000\000\000\t\017\000\000\000\000\t\017\t\017\n\162\000\000\t\017\t\017\t\017\t\017\000\000\000\000\000\000\t\017\000\000\t\017\t\017\000\000\t\017\t\017\t\017\n\138\t\017\t\017\000\000\000\000\t\017\n\170\t\017\000\000\000\000\000\000\000\000\t\017\t\017\n\178\n\186\002\237\002\237\000\000\002\237\000\000\002\237\000\000\000\000\002\237\000\000\000\000\002\237\000\000\002\237\000\000\000\000\t\250\000\000\002\237\002\237\002\237\000\000\002\237\002\237\002\237\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\237\000\000\000\000\000\000\000\000\000\000\002\237\002\237\nb\nj\002\237\000\000\000\000\000\000\000\000\002\237\000\000\nr\002\237\000\000\000\000\000\000\000\000\002\237\002\237\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\237\002\237\n\002\nB\nz\n\130\n\146\002\237\002\237\000\000\000\000\002\237\000\000\002\237\n\154\000\000\000\000\000\000\002\237\000\000\000\000\002\237\002\237\n\162\000\000\002\237\002\237\002\237\002\237\000\000\000\000\000\000\002\237\000\000\002\237\002\237\000\000\n\194\002\237\n\202\n\138\002\237\002\237\000\000\000\000\002\237\n\170\002\237\000\000\000\000\000\000\000\000\002\237\002\237\n\178\n\186\002\233\002\233\000\000\002\233\000\000\002\233\000\000\000\000\002\233\000\000\000\000\002\233\000\000\002\233\000\000\000\000\t\250\000\000\002\233\002\233\002\233\000\000\002\233\002\233\002\233\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\233\000\000\000\000\000\000\000\000\000\000\002\233\002\233\nb\nj\002\233\000\000\000\000\000\000\000\000\002\233\000\000\nr\002\233\000\000\000\000\000\000\000\000\002\233\002\233\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\233\002\233\n\002\nB\nz\n\130\n\146\002\233\002\233\000\000\000\000\002\233\000\000\002\233\n\154\000\000\000\000\000\000\002\233\000\000\000\000\002\233\002\233\n\162\000\000\002\233\002\233\002\233\002\233\000\000\000\000\000\000\002\233\000\000\002\233\002\233\000\000\n\194\002\233\n\202\n\138\002\233\002\233\000\000\000\000\002\233\n\170\002\233\000\000\000\000\000\000\000\000\002\233\002\233\n\178\n\186\002\241\002\241\000\000\002\241\000\000\002\241\000\000\000\000\002\241\000\000\000\000\002\241\000\000\002\241\000\000\000\000\t\250\000\000\002\241\002\241\002\241\000\000\002\241\002\241\002\241\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\241\000\000\000\000\000\000\000\000\000\000\002\241\002\241\nb\nj\002\241\000\000\000\000\000\000\000\000\002\241\000\000\nr\002\241\000\000\000\000\000\000\000\000\002\241\002\241\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\241\002\241\n\002\nB\nz\n\130\n\146\002\241\002\241\000\000\000\000\002\241\000\000\002\241\n\154\000\000\000\000\000\000\002\241\000\000\000\000\002\241\002\241\n\162\000\000\002\241\002\241\002\241\002\241\000\000\000\000\000\000\002\241\000\000\002\241\002\241\000\000\n\194\002\241\n\202\n\138\002\241\002\241\000\000\000\000\002\241\n\170\002\241\000\000\000\000\000\000\000\000\002\241\002\241\n\178\n\186\002\221\002\221\000\000\002\221\000\000\002\221\000\000\000\000\002\221\000\000\000\000\002\221\000\000\002\221\000\000\000\000\t\250\000\000\002\221\002\221\002\221\000\000\002\221\002\221\002\221\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\221\000\000\000\000\000\000\000\000\000\000\002\221\002\221\nb\nj\002\221\000\000\000\000\000\000\000\000\002\221\000\000\nr\002\221\000\000\000\000\000\000\000\000\002\221\002\221\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\221\002\221\n\002\nB\nz\n\130\n\146\002\221\002\221\000\000\000\000\002\221\000\000\002\221\n\154\000\000\000\000\000\000\002\221\000\000\000\000\002\221\002\221\n\162\000\000\002\221\002\221\002\221\002\221\000\000\000\000\000\000\002\221\000\000\002\221\002\221\000\000\n\194\002\221\n\202\n\138\002\221\002\221\000\000\000\000\002\221\n\170\002\221\000\000\000\000\000\000\000\000\002\221\002\221\n\178\n\186\002\225\002\225\000\000\002\225\000\000\002\225\000\000\000\000\002\225\000\000\000\000\002\225\000\000\002\225\000\000\000\000\t\250\000\000\002\225\002\225\002\225\000\000\002\225\002\225\002\225\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\225\000\000\000\000\000\000\000\000\000\000\002\225\002\225\nb\nj\002\225\000\000\000\000\000\000\000\000\002\225\000\000\nr\002\225\000\000\000\000\000\000\000\000\002\225\002\225\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\225\002\225\n\002\nB\nz\n\130\n\146\002\225\002\225\000\000\000\000\002\225\000\000\002\225\n\154\000\000\000\000\000\000\002\225\000\000\000\000\002\225\002\225\n\162\000\000\002\225\002\225\002\225\002\225\000\000\000\000\000\000\002\225\000\000\002\225\002\225\000\000\n\194\002\225\n\202\n\138\002\225\002\225\000\000\000\000\002\225\n\170\002\225\000\000\000\000\000\000\000\000\002\225\002\225\n\178\n\186\002\229\002\229\000\000\002\229\000\000\002\229\000\000\000\000\002\229\000\000\000\000\002\229\000\000\002\229\000\000\000\000\t\250\000\000\002\229\002\229\002\229\000\000\002\229\002\229\002\229\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\229\000\000\000\000\000\000\000\000\000\000\002\229\002\229\nb\nj\002\229\000\000\000\000\000\000\000\000\002\229\000\000\nr\002\229\000\000\000\000\000\000\000\000\002\229\002\229\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\229\002\229\n\002\nB\nz\n\130\n\146\002\229\002\229\000\000\000\000\002\229\000\000\002\229\n\154\000\000\000\000\000\000\002\229\000\000\000\000\002\229\002\229\n\162\000\000\002\229\002\229\002\229\002\229\000\000\000\000\000\000\002\229\000\000\002\229\002\229\000\000\n\194\002\229\n\202\n\138\002\229\002\229\000\000\000\000\002\229\n\170\002\229\000\000\000\000\000\000\000\000\002\229\002\229\n\178\n\186\002\249\002\249\000\000\002\249\000\000\002\249\000\000\000\000\002\249\000\000\000\000\002\249\000\000\002\249\000\000\000\000\t\250\000\000\002\249\002\249\002\249\000\000\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\249\000\000\000\000\000\000\000\000\000\000\002\249\002\249\nb\nj\002\249\000\000\000\000\000\000\000\000\002\249\000\000\nr\002\249\000\000\000\000\000\000\000\000\002\249\002\249\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\249\002\249\n\002\nB\nz\n\130\n\146\002\249\002\249\000\000\000\000\002\249\000\000\002\249\n\154\000\000\000\000\000\000\002\249\000\000\000\000\002\249\002\249\n\162\000\000\002\249\002\249\002\249\002\249\000\000\000\000\000\000\002\249\000\000\002\249\002\249\000\000\n\194\002\249\n\202\n\138\002\249\002\249\000\000\000\000\002\249\n\170\002\249\000\000\000\000\000\000\000\000\002\249\002\249\n\178\n\186\002\245\002\245\000\000\002\245\000\000\002\245\000\000\000\000\002\245\000\000\000\000\002\245\000\000\002\245\000\000\000\000\t\250\000\000\002\245\002\245\002\245\000\000\002\245\002\245\002\245\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\245\000\000\000\000\000\000\000\000\000\000\002\245\002\245\nb\nj\002\245\000\000\000\000\000\000\000\000\002\245\000\000\nr\002\245\000\000\000\000\000\000\000\000\002\245\002\245\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\245\002\245\n\002\nB\nz\n\130\n\146\002\245\002\245\000\000\000\000\002\245\000\000\002\245\n\154\000\000\000\000\000\000\002\245\000\000\000\000\002\245\002\245\n\162\000\000\002\245\002\245\002\245\002\245\000\000\000\000\000\000\002\245\000\000\002\245\002\245\000\000\n\194\002\245\n\202\n\138\002\245\002\245\000\000\000\000\002\245\n\170\002\245\000\000\000\000\000\000\000\000\002\245\002\245\n\178\n\186\002\253\002\253\000\000\002\253\000\000\002\253\000\000\000\000\002\253\000\000\000\000\002\253\000\000\002\253\000\000\000\000\t\250\000\000\002\253\002\253\002\253\000\000\002\253\002\253\002\253\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\253\000\000\000\000\000\000\000\000\000\000\002\253\002\253\nb\nj\002\253\000\000\000\000\000\000\000\000\002\253\000\000\nr\002\253\000\000\000\000\000\000\000\000\002\253\002\253\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\253\n\002\nB\nz\n\130\n\146\002\253\002\253\000\000\000\000\002\253\000\000\002\253\n\154\000\000\000\000\000\000\002\253\000\000\000\000\002\253\002\253\n\162\000\000\002\253\002\253\002\253\002\253\000\000\000\000\000\000\002\253\000\000\002\253\002\253\000\000\n\194\002\253\n\202\n\138\002\253\002\253\000\000\000\000\002\253\n\170\002\253\000\000\000\000\000\000\000\000\002\253\002\253\n\178\n\186\002\217\002\217\000\000\002\217\000\000\002\217\000\000\000\000\002\217\000\000\000\000\002\217\000\000\002\217\000\000\000\000\t\250\000\000\002\217\002\217\002\217\000\000\002\217\002\217\002\217\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\217\000\000\000\000\000\000\000\000\000\000\002\217\002\217\nb\nj\002\217\000\000\000\000\000\000\000\000\002\217\000\000\nr\002\217\000\000\000\000\000\000\000\000\002\217\002\217\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\217\002\217\n\002\nB\nz\n\130\n\146\002\217\002\217\000\000\000\000\002\217\000\000\002\217\n\154\000\000\000\000\000\000\002\217\000\000\000\000\002\217\002\217\n\162\000\000\002\217\002\217\002\217\002\217\000\000\000\000\000\000\002\217\000\000\002\217\002\217\000\000\n\194\002\217\n\202\n\138\002\217\002\217\000\000\000\000\002\217\n\170\002\217\000\000\000\000\000\000\000\000\002\217\002\217\n\178\n\186\002)\002)\000\000\002)\000\000\002)\000\000\000\000\002)\000\000\000\000\002)\000\000\002)\000\000\000\000\002)\000\000\002)\002)\002)\000\000\002)\002)\002)\000\000\000\000\000\000\000\000\000\000\002)\002)\002)\002)\002)\000\000\002)\000\000\000\000\000\000\000\000\000\000\002)\002)\002)\002)\002)\000\000\000\000\000\000\000\000\002)\000\000\002)\002)\000\000\000\000\000\000\000\000\002)\002)\002)\000\000\000\000\000\000\000\000\000\000\000\000\002)\002)\002)\002)\002)\002)\002)\002)\002)\000\000\000\000\002)\000\000\002)\002)\000\000\000\000\000\000\002)\000\000\000\000\002)\002)\002)\000\000\002)\002)\002)\002)\000\000\000\000\000\000\002)\000\000\002)\002)\000\000\002)\002)\002)\002)\002)\002)\000\000\000\000\002)\002)\014\014\000\000\000\000\000\000\000\000\002)\002)\002)\002)\002E\002E\000\000\002E\000\000\002E\000\000\000\000\002E\000\000\000\000\002E\000\000\002E\000\000\000\000\t\250\000\000\002E\002E\002E\000\000\002E\002E\002E\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002E\000\000\000\000\000\000\000\000\000\000\002E\002E\nb\nj\002E\000\000\000\000\000\000\000\000\002E\000\000\nr\002E\000\000\000\000\000\000\000\000\002E\002E\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002E\002E\n\002\nB\nz\n\130\n\146\002E\002E\000\000\000\000\002E\000\000\002E\n\154\000\000\000\000\000\000\002E\000\000\000\000\002E\002E\n\162\000\000\002E\002E\014&\002E\000\000\000\000\000\000\002E\000\000\002E\002E\000\000\n\194\002E\n\202\n\138\002E\002E\000\000\000\000\002E\n\170\002E\000\000\000\000\000\000\000\000\002E\002E\n\178\n\186\002A\002A\000\000\002A\000\000\002A\000\000\000\000\002A\000\000\000\000\002A\000\000\002A\000\000\000\000\t\250\000\000\002A\002A\002A\000\000\002A\002A\002A\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002A\000\000\000\000\000\000\000\000\000\000\002A\002A\nb\nj\002A\000\000\000\000\000\000\000\000\002A\000\000\nr\002A\000\000\000\000\000\000\000\000\002A\002A\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002A\002A\n\002\nB\nz\n\130\n\146\002A\002A\000\000\000\000\002A\000\000\002A\n\154\000\000\000\000\000\000\002A\000\000\000\000\002A\002A\n\162\000\000\002A\002A\002A\002A\000\000\000\000\000\000\002A\000\000\002A\002A\000\000\n\194\002A\n\202\n\138\002A\002A\000\000\000\000\002A\n\170\002A\000\000\000\000\000\000\000\000\002A\002A\n\178\n\186\002\213\002\213\000\000\002\213\000\000\002\213\000\000\000\000\002\213\000\000\000\000\002\213\000\000\002\213\000\000\000\000\t\250\000\000\002\213\002\213\002\213\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\002\213\000\000\000\000\000\000\000\000\000\000\002\213\002\213\nb\nj\002\213\000\000\000\000\000\000\000\000\002\213\000\000\nr\002\213\000\000\000\000\000\000\000\000\002\213\002\213\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\n\002\nB\nz\n\130\n\146\002\213\002\213\000\000\000\000\002\213\000\000\002\213\n\154\000\000\000\000\000\000\002\213\000\000\000\000\002\213\002\213\n\162\000\000\002\213\002\213\002\213\002\213\000\000\000\000\000\000\002\213\000\000\002\213\002\213\000\000\n\194\002\213\n\202\n\138\002\213\002\213\000\000\000\000\002\213\n\170\002\213\000\000\000\000\000\000\000\000\002\213\002\213\n\178\n\186\0025\0025\000\000\0025\000\000\0025\000\000\000\000\0025\000\000\000\000\0025\000\000\0025\000\000\000\000\0025\000\000\0025\0025\0025\000\000\0025\0025\0025\000\000\000\000\000\000\000\000\000\000\0025\0025\0025\0025\0025\000\000\0025\000\000\000\000\000\000\000\000\000\000\0025\0025\0025\0025\0025\000\000\000\000\000\000\000\000\0025\000\000\0025\0025\000\000\000\000\000\000\000\000\0025\0025\0025\000\000\000\000\000\000\000\000\000\000\000\000\0025\0025\0025\0025\0025\0025\0025\0025\0025\000\000\000\000\0025\000\000\0025\0025\000\000\000\000\000\000\0025\000\000\000\000\0025\0025\0025\000\000\0025\0025\0025\0025\000\000\000\000\000\000\0025\000\000\0025\0025\000\000\0025\0025\0025\0025\0025\0025\000\000\000\000\0025\0025\014\014\000\000\000\000\000\000\000\000\0025\0025\0025\0025\0029\0029\000\000\0029\000\000\0029\000\000\000\000\0029\000\000\000\000\0029\000\000\0029\000\000\000\000\0029\000\000\0029\0029\0029\000\000\0029\0029\0029\000\000\000\000\000\000\000\000\000\000\0029\0029\0029\0029\0029\000\000\0029\000\000\000\000\000\000\000\000\000\000\0029\0029\0029\0029\0029\004)\000\000\000\000\000\000\0029\000\000\0029\0029\000\000\000\000\000\000\000\000\0029\0029\0029\000\000\000\000\000\000\000\000\000\000\000\000\0029\0029\0029\0029\0029\0029\0029\0029\0029\000\000\000\000\0029\000\000\0029\0029\000\000\000\000\000\000\0029\000\000\000\238\0029\0029\0029\000\000\0029\0029\0029\0029\000\000\000\000\000\000\0029\000\000\0029\0029\000\000\0029\0029\0029\0029\0029\0029\000\000\000\000\0029\0029\014\014\000\000\000\000\004)\000\000\0029\0029\0029\0029\001\006\000\000\000\006\000\000\007\017\000\000\002\186\002\190\006*\002\234\002\130\005\234\b\242\000\000\000\000\002\246\001\n\000\000\0066\000\000\002\142\000\000\006B\007\017\000\000\001\210\003\206\007\017\002\190\0036\001\018\bn\br\001\030\001\"\003\170\000\000\000\000\003F\000\000\002\254\007\226\025\190\000\000\b\150\b\154\001\210\003\222\0032\003\234\b\158\006\214\000\000\001:\000\000\002\178\0079\000\000\003:\000\000\000\000\000\000\b\026\b\030\b*\b>\000\000\005v\000\000\003\202\001>\001B\001F\001J\001N\0079\002\178\b\178\001R\0079\007-\000\000\001V\000\000\b\190\b\214\t*\005\130\005\134\000\000\000\000\001Z\000\000\000\000\000\000\007\017\000\000\001^\003\t\007-\000\000\000\000\019\026\007-\006\234\000\000\000\000\001\154\011\"\000\000\011.\005\138\b2\004\026\001\158\000\000\014V\004r\t>\001\006\001\166\000\006\001\170\001\174\000\000\002\186\002\190\000\n\002\234\002\130\0112\000\000\000\000\000\000\002\246\001\n\000\000\000\000\000\000\bj\000\000\000\238\000\000\003\t\001\210\000\000\000\000\0079\0036\001\018\bn\br\001\030\001\"\000\000\003\t\003\t\003F\000\000\002\254\000\000\bv\tr\b\150\b\154\t~\003\222\0032\003\234\b\158\006\214\000\238\001:\000\000\002\178\000\000\000\000\003:\000\000\000\000\000\000\b\026\b\030\b*\b>\006*\005v\000\000\005\234\001>\001B\001F\001J\001N\000\000\0066\b\178\001R\000\000\006B\000\000\001V\000\000\b\190\b\214\t*\005\130\005\134\000\000\000\000\001Z\000\000\000\000\000\000\000\000\006*\001^\000\000\005\234\0116\000\000\000\000\000\000\000\000\000\000\0066\001\154\006\022\000\000\006B\005\138\b2\012\249\001\158\000\000\014V\004r\t>\004\153\001\166\000\006\001\170\001\174\000\246\002\186\002\190\002\194\002\234\002\130\000\000\000\000\000\000\012\249\002\246\000\000\002\030\003\178\000\000\002\"\000\000\004\153\000\000\003\182\001\210\000\000\017\178\000\000\002\250\000\000\003>\003B\002.\000\000\000\000\003\186\000\000\003F\000\000\002\254\000\000\017F\000\000\003\214\003\218\000\000\003\222\0032\003\234\003\242\006\214\000\000\000\000\017\170\002\178\000\000\000\000\003:\017\194\002:\000\000\b\026\b\030\b*\b>\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\202\000\000\b\178\000\000\tA\000\000\000\000\000\000\000\000\b\190\b\214\t*\005\130\005\134\017\222\018\n\000\000\000\000\004\153\004\153\000\000\000\000\000\000\006f\025\130\000\000\tA\000\000\000\000\002>\012\249\012\229\000\000\000\000\018F\0222\005\138\b2\025\162\000\173\000\000\bJ\004r\t>\000\173\000\000\002\190\000\173\000\000\002\130\012\249\tf\000\000\002\030\002\246\000\000\002\"\000\173\000\000\000\173\000\000\000\173\000\000\000\173\001\210\000\238\t\158\000\000\002\250\002.\000\000\000\000\0026\012\229\t\166\000\173\000\000\000\000\000\000\002\254\014\170\000\173\000\000\000\000\000\000\000\173\000\000\0032\001\190\016\026\000\173\000\000\002\130\000\173\002\178\014\178\002:\003:\000\173\000\173\000\173\b\026\b\030\b*\000\000\012v\005v\000\173\000\173\006*\021\218\000\000\005\234\025\134\000\173\000\000\000\000\tA\000\173\0066\000\000\000\000\000\000\006B\000\000\000\000\005\130\005\134\000\173\000\173\016\030\000\000\000\173\000\173\000\000\000\000\000\000\000\000\000\000\000\000\002>\000\000\000\173\000\000\016*\000\000\021\254\000\000\000\173\000\173\005\138\b2\000\000\000\000\000\197\bJ\004r\000\000\000\173\000\197\000\173\002\190\000\197\000\000\002\130\000\000\tf\000\000\000\000\002\246\005\134\000\000\000\197\000\000\000\197\000\000\000\197\000\000\000\197\001\210\022\n\t\158\000\000\002\250\000\000\000\000\000\000\000\000\b\210\t\166\000\197\000\000\000\000\000\000\002\254\000\000\000\197\021\158\000\000\000\000\000\197\000\000\0032\001\190\000\000\000\197\000\000\001\206\000\197\002\178\000\000\000\000\003:\000\197\000\197\000\197\b\026\b\030\b*\000\000\012v\005v\000\197\000\197\000\000\001\210\000\000\000\000\r\250\000\197\000\000\000\000\000\000\000\197\000\000\000\000\000\000\000\000\019F\000\000\000\000\005\130\005\134\000\197\000\197\000\000\000\238\000\197\000\197\002\154\000\000\019\206\000\000\000\000\000\000\002\178\000\000\000\197\000\000\000\000\000\000\000\000\019\230\000\197\000\197\005\138\b2\000\000\000\000\000\000\bJ\004r\000\000\000\197\000\000\000\197\000\014\000\018\000\022\000\026\000\030\000\000\000\"\000&\000*\000.\0002\000\000\0006\000:\006*\000\000\000>\005\234\000\000\000\000\000B\000\000\000\000\000\000\0066\000\000\000\000\000F\006B\000\000\000\000\000\000\000\000\000J\000\000\000N\000R\000V\000Z\000^\000b\000f\000\000\000\000\000\000\000j\000n\000\000\000r\000\000\000v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\000\000\000\000\000~\000\130\000\000\000\000\000\000\000\000\000\000\000\134\000\138\000\142\000\000\000\000\000\000\000\000\000\000\000\146\000\150\000\154\000\158\000\000\000\162\000\166\000\170\000\000\000\000\000\000\000\174\000\178\000\182\000\000\000\000\000\000\000\186\000\006\000\190\000\194\000\246\002\186\002\190\002\194\002\234\002\130\000\198\000\000\000\202\000\000\002\246\000\000\000\000\004\185\000\206\000\210\000\000\000\214\000\000\003\182\001\210\000\000\000\000\000\000\002\250\000\000\003>\003B\000\000\000\000\000\000\003\186\000\000\003F\000\000\002\254\000\000\017F\000\000\003\214\003\218\000\000\003\222\0032\003\234\003\242\006\214\000\000\000\000\017\170\002\178\000\000\000\000\003:\017\194\000\000\000\000\b\026\b\030\b*\b>\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\202\000\000\b\178\000\000\028\154\000\000\000\000\000\000\000\000\b\190\b\214\t*\005\130\005\134\017\222\018\n\000\000\000\006\028\187\015j\000\246\002\186\002\190\002\194\002\234\002\130\000\000\000\000\000\000\000\000\002\246\000\000\000\000\028\234\000\000\0222\005\138\b2\014j\003\182\001\210\bJ\004r\t>\002\250\000\000\003>\003B\000\000\000\000\000\000\003\186\000\000\003F\000\000\002\254\000\000\017F\000\000\003\214\003\218\000\000\003\222\0032\003\234\003\242\006\214\000\000\017\006\017\170\002\178\000\000\000\000\003:\017\194\002\006\000\000\b\026\b\030\b*\b>\000\000\005v\000\000\000\000\002\n\000\000\000\000\000\000\000\000\017\202\000\000\b\178\001\210\028\154\000\000\000\000\000\000\000\000\b\190\b\214\t*\005\130\005\134\017\222\018\n\000\000\000\000\004\193\000\000\003\154\000\000\000\000\000\000\001\006\000\000\007\002\001\222\000\000\000\000\003V\002\190\t\018\002\178\002\130\0222\005\138\b2\000\000\002\246\001\n\bJ\004r\t>\002\142\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\001\014\001\018\001\022\003v\001\030\001\"\000\000\000\000\007\006\000\000\000\000\003\t\000\000\003z\003\t\001.\011\030\000\000\000\000\003r\001\190\0016\003\t\000\000\001:\000\000\002\178\000\000\000\000\003\246\000\000\000\000\003\t\003\250\000\000\004\002\005j\000\n\005v\000\000\003\t\001>\001B\001F\001J\001N\000\000\000\000\000\n\001R\005z\000\000\003\t\001V\000\000\000\000\000\000\003\t\005\130\005\134\000\000\005\202\001Z\003\t\003\t\003\t\003\t\000\000\001^\000\000\003\t\000\000\000\000\000\000\000\000\000\000\003\t\000\000\001\154\011\"\000\000\000\000\005\138\000\000\000\000\001\158\000\000\001\162\004r\001\006\000\000\001\166\003\t\001\170\001\174\003V\002\190\n\226\003\t\002\130\016\026\000\000\000\000\002\130\002\246\001\n\000\000\000\000\000\000\002\142\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\001\014\001\018\001\022\003v\001\030\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003z\000\000\001.\011\030\000\000\000\000\003r\001\190\0016\007\217\016\030\001:\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\016*\005v\021\222\000\000\001>\001B\001F\001J\001N\000\000\000\000\000\000\001R\005z\000\000\007\217\001V\n\249\000\000\000\000\000\000\005\130\005\134\000\000\005\202\001Z\005\134\000\000\000\000\007\217\000\000\001^\007\217\b\166\000\000\000\000\021\234\000\000\000\000\007\217\000\000\001\154\011\"\007\217\000\000\005\138\000\000\n\249\001\158\000\000\001\162\004r\001\006\021\158\001\166\000\000\001\170\001\174\003V\002\190\r\186\n\249\002\130\000\000\n\249\011\150\000\000\002\246\001\n\000\000\000\000\n\249\002\142\000\000\000\000\n\249\000\000\001\210\000\000\000\000\000\000\001\014\001\018\001\022\003v\001\030\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003z\000\000\001.\011\030\000\000\000\000\003r\001\190\0016\000\000\000\000\001:\000\000\002\178\000\000\000\000\003\246\000\000\012\249\012\229\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\001>\001B\001F\001J\001N\000\000\000\000\000\000\001R\005z\012\249\000\000\001V\002\030\000\000\000\000\002\"\005\130\005\134\000\000\005\202\001Z\000\000\002*\000\000\000\000\000\000\001^\000\000\002.\000\000\000\000\0026\012\229\000\000\000\000\000\000\001\154\011\"\003\t\003\t\005\138\000\000\000\000\001\158\000\000\001\162\004r\011\017\000\000\001\166\011\017\001\170\001\174\011\017\011\017\002:\000\000\011\017\003\t\011\017\000\000\003\t\011\017\000\000\003\t\000\n\011\017\011\017\000\000\011\017\011\017\003\t\011\017\000\000\011\017\000\000\000\000\003\t\003\t\011\017\003\t\003\t\011\017\000\000\000\000\000\000\000\000\000\000\000\000\003\t\011\017\000\000\011\017\003\t\000\000\011\017\011\017\000\n\000\000\002>\000\000\000\000\011\017\000\000\003\t\011\017\000\000\000\000\011\017\011\017\000\000\011\017\003\t\011\017\011\017\000\000\000\000\001*\000\000\003\t\000\000\000\000\000\000\011\017\003\t\003\t\011\017\000\000\000\000\000\000\000\000\003\t\000\000\000\000\011\017\011\017\000\000\000\000\011\017\000\000\011\017\000\000\003\t\000\000\000\000\005\166\000\000\003\t\003\t\000\000\000\n\000\000\011\017\011\017\000\000\011\017\011\017\000\000\011\017\000\000\011\017\t-\011\017\000\006\011\017\003\t\011\017\002\186\002\190\000\000\002\234\002\130\003\t\000\000\000\000\000\000\002\246\000\000\003\t\000\000\003\190\t-\000\000\t-\t-\000\000\001\210\000\000\000\000\000\000\002\250\000\000\003>\003B\000\000\000\000\000\000\000\000\b-\003F\003\t\002\254\000\000\b-\000\000\003\214\003\218\t\130\003\222\0032\003\234\003\242\006\214\001\202\001\206\011N\002\178\000\000\000\000\003:\000\000\000\000\b-\b\026\b\030\b*\b>\000\000\005v\000\000\000\000\000\000\001\210\002\170\001\230\000\000\000\000\000\000\b\178\000\000\000\000\000\000\001\242\000\000\b-\b\190\b\214\t*\005\130\005\134\000\000\000\000\b-\000\000\000\000\001\246\002\146\b-\b-\000\238\002\158\000\000\002\178\004\030\004*\000\000\b-\b-\000\000\0046\000\000\000\000\005\138\b2\t-\005)\005)\bJ\004r\t>\005)\000\000\005)\005)\000\000\005)\004:\005)\005)\b-\000\000\005)\b-\005)\005)\005)\005)\005)\005)\005)\005)\b-\005)\017\022\005)\000\000\000\000\000\000\000\000\000\000\002\006\005)\000\000\000\000\000\000\000\000\005)\005)\005)\000\000\002\n\005)\005)\005)\005)\000\000\005)\000\000\001\210\005)\000\000\000\000\000\000\000\000\005)\005)\005)\000\000\000\000\005)\005)\005)\000\000\005)\005)\003\154\000\000\000\000\000\000\000\000\005)\007\002\001\222\000\000\005)\005)\000\000\005)\002\178\005)\000\000\000\000\000\000\000\000\005)\005)\005)\000\000\005)\005)\005)\005)\000\000\005)\005)\000\000\000\000\000\000\005)\000\000\005)\005)\000\000\000\000\002\150\005)\007\006\000\000\000\000\020\178\005)\000\000\000\000\000\000\005)\000\000\005)\005)\t\025\t\025\000\000\005)\003\t\t\025\000\000\001\206\t\025\003\t\000\000\000\000\000\000\000\000\000\000\000\000\t\025\000\000\t\025\t\025\t\025\000\000\t\025\t\025\t\025\000\000\000\000\000\000\003\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\025\000\n\000\000\000\000\000\000\000\000\t\025\t\025\000\000\000\000\t\025\000\000\000\000\002\154\003\t\t\025\003\t\000\000\t\025\000\000\000\000\000\000\003\t\t\025\t\025\t\025\000\000\003\t\000\000\003\t\000\000\000\000\t\025\t\025\000\000\000\000\003\t\003\t\000\000\t\025\000\000\000\000\000\000\004\154\000\000\000\000\t\025\000\000\000\000\000\000\000\000\000\000\000\000\t\025\t\025\t\025\000\000\t\025\t\025\000\000\004\133\000\000\003\t\000\000\000\000\004\133\000\000\t\025\004\133\t\025\t\025\003\t\000\000\000\000\t\025\000\000\000\000\000\000\004\133\t\025\000\000\000\000\004\133\t\025\004\133\t\025\t\025\012\185\012\185\000\000\000\000\004\133\012\185\000\000\001\206\012\185\004\133\000\000\000\000\000\000\000\000\000\000\004\133\004\186\000\000\012\185\012\185\012\185\004B\012\185\012\185\012\185\000\000\000\000\004\133\004\133\000\000\000\000\000\000\004\133\002\226\000\000\000\000\012\185\000\000\000\000\000\000\000\000\000\000\012\185\012\185\000\000\000\000\012\185\000\000\004\133\002\154\004\133\012\185\000\000\000\000\012\185\000\000\000\000\000\000\004\133\012\185\012\185\012\185\004\133\004\133\002\226\000\238\004\133\004\133\012\185\012\185\000\000\000\000\004R\004\133\000\000\012\185\000\000\000\000\000\000\004\154\000\000\000\000\012\185\004\133\000\000\000\000\000\000\000\000\021\178\012\185\012\185\012\185\000\000\012\185\012\185\000\000\004\133\000\000\004\133\000\000\000\000\004\133\000\000\012\185\004\133\012\185\012\185\004\133\000\000\000\000\012\185\000\000\000\000\000\000\004\133\012\185\000\000\000\000\004\133\012\185\004\133\012\185\012\185\t\029\t\029\000\000\000\000\000\000\t\029\000\000\001\206\t\029\004\133\000\000\000\000\000\000\000\000\000\000\004\133\t\029\000\000\t\029\t\029\t\029\000\000\t\029\t\029\t\029\000\000\000\000\004\133\000\000\000\000\000\000\000\000\004\133\002\226\000\000\000\000\t\029\000\000\000\000\000\000\000\000\000\000\t\029\t\029\000\000\000\000\t\029\000\000\004\133\002\154\000\000\t\029\000\000\000\000\t\029\000\000\000\000\000\000\000\000\t\029\t\029\t\029\004\133\004\133\000\000\000\000\004\133\004\133\t\029\t\029\000\000\000\000\007n\000\000\000\000\t\029\000\000\000\000\000\000\004\154\000\000\000\000\t\029\004\133\000\000\000\000\000\000\000\000\000\000\t\029\t\029\t\029\000\000\t\029\t\029\000\000\000\000\000\000\003\t\003\t\000\000\000\000\003\t\t\029\003\t\t\029\t\029\003\t\003\t\003\t\t\029\003\t\003\t\003\t\003\t\t\029\000\000\003\t\000\000\t\029\003\t\t\029\t\029\000\000\003\t\000\n\000\000\003\t\000\n\003\t\000\000\003\t\000\000\003\t\003\t\000\n\000\000\003\t\000\000\000\000\003\t\003\t\003\t\003\t\000\000\000\000\003\t\003\t\000\000\003\t\003\t\003\t\003\t\003\t\003\t\000\000\003\t\003\t\000\000\003\t\003\t\000\000\000\000\003\t\003\t\003\t\003\t\003\t\003\t\003\t\000\000\003\t\000\000\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\000\000\006\185\000\000\0009\000\000\003\t\000\000\0009\0009\000\000\0009\0009\003\t\000\000\000\000\000\000\0009\000\000\003\t\000\000\006\222\006\185\003\t\003\t\000\000\000\000\0009\003\t\003\t\003\t\0009\000\000\0009\0009\000\000\000\000\000\000\000\000\000\000\0009\000\000\0009\000\000\000\000\000\000\0009\0009\000\000\0009\0009\0009\0009\0009\000\000\000\000\000\000\0009\000\000\000\000\0009\000\000\000\000\000\000\0009\0009\0009\0009\000\000\0009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0009\000\000\000\000\000\000\012\249\012\229\000\000\0009\0009\0009\0009\0009\000\000\006\181\000\000\0005\000\000\000\000\000\000\0005\0005\000\000\0005\0005\012\249\000\000\000\000\002\030\0005\000\000\002\"\000\000\000\000\006\181\0009\0009\000\000\002\206\0005\0009\0009\0009\0005\002.\0005\0005\0026\012\229\000\000\000\000\000\000\0005\000\000\0005\000\000\000\000\000\000\0005\0005\000\000\0005\0005\0005\0005\0005\000\000\000\000\000\000\0005\000\000\002:\0005\000\000\000\000\000\000\0005\0005\0005\0005\000\000\0005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\000\000\000\000\000\000\000\000\000\000\000\000\0005\0005\0005\0005\0005\000\000\006\197\000\000\012\129\000\000\000\000\000\000\012\129\012\129\000\000\012\129\012\129\002>\000\000\000\000\000\000\012\129\000\000\000\000\000\000\000\000\006\197\0005\0005\000\000\000\000\012\129\0005\0005\0005\012\129\000\000\012\129\012\129\000\000\000\000\000\000\000\000\000\000\012\129\000\000\012\129\000\000\000\000\000\000\012\129\012\129\000\000\012\129\012\129\012\129\012\129\012\129\000\000\025\214\000\000\012\129\000\000\000\000\012\129\000\000\002\006\000\000\012\129\012\129\012\129\012\129\000\000\012\129\000\000\000\000\002\n\000\000\000\000\000\000\000\000\000\000\000\000\012\129\001\210\000\000\000\000\000\000\000\000\000\000\012\129\012\129\012\129\012\129\012\129\000\000\006\193\000\000\012}\000\000\000\000\003\154\012}\012}\000\000\012}\012}\007\002\001\222\000\000\000\000\012}\000\000\000\000\002\178\000\000\006\193\012\129\012\129\000\000\000\000\012}\012\129\012\129\012\129\012}\000\000\012}\012}\000\000\000\000\000\000\000\000\000\000\012}\000\000\012}\000\000\000\000\000\000\012}\012}\007\006\012}\012}\012}\012}\012}\000\000\001\202\001\206\012}\000\000\000\000\012}\000\000\000\000\000\000\012}\012}\012}\012}\000\000\012}\000\000\000\000\000\000\000\000\001\210\001\214\001\230\000\000\000\000\012}\000\000\000\000\000\000\000\000\001\242\000\000\012}\012}\012}\012}\012}\001\250\000\000\000\000\000\000\000\000\000\000\001\246\002\146\000\000\000\000\000\000\002\158\000\000\002\178\004\030\004*\012\189\012\189\000\000\000\000\0046\012\189\012}\012}\012\189\000\000\000\000\012}\012}\012}\000\000\000\000\004\138\000\000\012\189\012\189\012\189\004:\012\189\012\189\012\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\189\000\000\000\000\000\000\000\000\000\000\012\189\012\189\000\000\000\000\012\189\000\000\000\000\000\000\000\000\012\189\000\000\000\000\012\189\000\000\000\000\000\000\000\000\012\189\012\189\012\189\000\000\000\000\000\000\000\000\000\000\000\000\012\189\012\189\000\000\000\000\000\000\000\000\000\000\012\189\000\000\000\000\000\000\012\189\000\000\000\000\012\189\000\000\000\000\000\000\000\000\000\000\000\000\012\189\012\189\012\189\004\169\012\189\012\189\000\000\000\000\019^\000\000\000\000\000\000\000\000\000\000\012\189\000\000\012\189\012\189\000\000\000\000\000\000\012\189\000\000\005Y\r9\000\000\012\189\003\182\011\029\000\000\012\189\011\029\012\189\012\189\003V\002\190\000\000\000\000\002\130\000\000\006\166\000\000\005Y\002\246\000\000\000\000\005Y\011\029\011\029\019\138\011\029\011\029\000\000\001\210\000\000\006\198\000\000\017\170\000\000\000\000\003Z\000\000\017\194\b\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\029\019\198\003f\000\000\000\000\003r\001\190\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\011\029\003\250\000\000\004\002\005j\n\238\005v\000\000\004\169\000\000\000\000\000\000\r9\r9\000\000\011\029\000\000\020*\005z\001\202\001\206\000\000\000\000\000\000\000\000\005Y\005\130\005\134\000\000\005\202\011\029\r9\011\029\r9\000\000\000\000\000\000\000\000\001\210\001\214\005Y\000\000\000\000\005Y\011\029\000\000\000\000\011\029\011\029\000\000\005\138\000\000\011\029\000\000\011\029\000\000\004r\011\025\011\029\000\000\011\025\001\246\002\162\003V\002\190\000\000\002\158\002\130\002\178\004\030\004*\000\000\002\246\000\000\000\000\0046\011\025\011\025\000\000\011\025\011\025\000\000\001\210\000\000\000\000\000\000\002\190\000\000\000\000\003Z\000\000\000\000\004:\000\000\000\000\026\182\000\000\000\000\000\000\000\000\011\025\000\000\003f\000\000\001\210\003r\001\190\000\000\000\000\000\000\000\000\026\162\002\178\000\000\000\000\003\246\000\000\022N\011\025\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\023\138\003\n\000\000\023\142\000\000\000\000\011\025\002\178\000\000\005z\000\000\000\000\000\000\000\000\023\190\000\000\000\000\005\130\005\134\000\000\005\202\011\025\000\000\011\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\025\000\000\023\206\011\025\011\025\000\000\005\138\000\000\011\025\000\000\011\025\000\006\004r\000\000\011\025\002\186\002\190\000\000\002\234\002\130\tE\000\000\000\000\000\000\002\246\000\000\003V\002\190\000\000\000\000\002\130\003\254\000\000\000\000\001\210\002\246\000\000\000\000\002\250\000\000\003>\003B\tE\000\000\000\000\001\210\000\000\003F\000\000\002\254\000\000\000\000\003Z\003\214\003\218\000\000\003\222\0032\003\234\003\242\006\214\000\000\000\000\000\000\002\178\003f\000\000\003:\003r\001\190\000\000\b\026\b\030\b*\b>\002\178\005v\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\b\178\005v\000\000\000\000\000\000\000\000\000\000\b\190\b\214\t*\005\130\005\134\000\000\005z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\006\005\202\000\000\000\000\002\186\002\190\000\000\002\234\002\130\000\000\000\000\005\138\b2\002\246\000\000\000\000\bJ\004r\t>\000\000\014\214\000\000\005\138\001\210\tE\000\000\b\202\002\250\004r\003>\003B\000\000\000\000\000\000\b)\000\000\003F\000\000\002\254\b)\000\000\000\000\003\214\003\218\000\000\003\222\0032\003\234\003\242\006\214\000\000\000\000\000\000\002\178\000\000\000\000\003:\000\000\b)\000\000\b\026\b\030\b*\b>\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005]\r9\b\178\000\000\000\000\000\000\000\000\b)\000\000\b\190\b\214\t*\005\130\005\134\000\000\b)\000\000\000\000\000\000\005]\b)\b)\000\238\005]\000\000\000\000\003E\003E\000\000\b)\b)\003E\000\000\000\000\003E\000\000\005\138\b2\000\000\000\000\000\000\bJ\004r\t>\003E\003E\003E\000\000\003E\003E\003E\000\000\b)\000\000\000\000\b)\000\000\000\000\000\000\000\000\000\000\000\000\003E\000\000\b)\000\000\000\000\000\000\003E\004\130\000\000\000\000\003E\000\000\000\000\000\000\000\000\003E\r9\r9\003E\000\000\000\000\000\000\000\000\003E\003E\003E\000\000\000\000\000\000\005]\000\000\000\000\003E\003E\000\000\r9\000\000\r9\000\000\003E\000\000\000\000\000\000\003E\005]\000\000\003E\005]\000\000\000\000\000\000\000\000\000\000\003E\003E\003E\000\000\003E\003E\000\000\000\000\000\000\000\000\004\141\000\000\000\000\000\000\003E\000\246\003E\003E\002\018\002\005\002\005\003E\000\000\000\000\002\005\000\000\003E\002\005\018J\000\000\003E\000\000\003E\003E\003\182\000\000\000\000\002\005\002\005\002\005\000\000\002\005\002\005\002\005\000\000\000\000\018N\000\000\000\000\000\000\000\000\000\000\018v\000\000\000\000\002\005\000\000\000\000\000\000\000\000\000\000\002\005\002\005\000\000\017\170\002\005\000\000\000\000\000\000\017\194\002\005\000\000\000\000\002\005\000\000\000\000\000\000\000\000\002\005\002\005\002\005\000\000\000\000\000\000\000\000\018\242\000\000\002\005\002\005\000\000\000\000\000\000\000\000\000\000\002\005\000\000\000\000\000\000\002\005\017\222\019\006\002\005\000\000\004\141\004\141\000\000\000\000\000\000\002\005\002\005\002\005\000\000\002\005\002\005\000\000\000\000\000\000\000\000\000\000\000\000\019\022\000\000\002\005\000\000\002\005\002\005\003V\002\190\000\000\002\005\002\130\000\000\006\166\000\000\002\005\002\246\000\000\000\000\004\254\000\000\002\005\000\000\000\000\000\000\000\000\001\210\000\000\006\198\000\000\000\000\000\000\000\000\003Z\000\000\000\000\b\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003f\000\000\000\000\n\222\001\190\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\n\245\003\250\000\000\004\002\000\000\n\238\005v\000\000\000\000\000\000\003V\002\190\000\000\000\000\002\130\000\000\006\166\000\000\005z\002\246\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\001\210\n\246\006\198\000\000\000\000\000\000\000\000\003Z\000\000\000\000\b\226\000\000\000\000\000\000\000\000\n\245\tr\000\000\n\245\011J\003f\005\138\000\000\n\222\001\190\n\245\000\000\004r\000\000\n\245\002\178\000\000\000\000\003\246\000\000\000\000\n\245\003\250\000\000\004\002\000\000\n\238\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\000\000\n\246\005\169\005\169\000\000\000\000\000\000\005\169\000\000\000\000\005\169\000\000\000\000\000\000\000\000\n\245\000\000\000\000\n\245\n\245\005\169\005\138\005\169\000\000\005\169\n\245\005\169\004r\000\000\n\245\000\000\000\000\000\000\000\000\000\000\000\000\012\157\000\000\005\169\012\157\000\000\000\000\000\000\000\000\005\169\005\169\000\000\000\000\000\000\012\157\005\169\000\000\000\000\005\169\000\000\012\157\005\169\000\000\000\000\000\000\000\000\005\169\005\169\005\169\000\000\000\000\000\000\012\157\000\000\000\000\000\000\000\000\000\000\012\157\000\000\000\000\000\000\005\169\005\169\000\000\000\000\005\169\012\157\000\000\001\006\012\157\000\000\000\000\000\000\000\000\012\157\005\169\005\169\005\169\000\000\005\169\005\169\000\000\000\000\000\000\001\n\007n\000\000\000\000\002\142\000\000\012\157\000\000\005\169\000\000\012\157\005\169\005\169\001\014\001\018\001\022\001\026\001\030\001\"\000\000\012\157\012\157\000\000\005\169\012\157\000\000\001&\000\000\001.\0012\028\146\000\000\000\000\000\000\0016\000\000\000\000\001:\000\000\000\000\000\000\012\157\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>\001B\001F\001J\001N\000\000\005\157\005\157\001R\000\000\007\t\005\157\001V\000\000\005\157\007\t\000\000\000\000\000\000\000\000\000\000\001Z\000\000\000\000\005\157\000\000\005\157\001^\005\157\000\000\005\157\000\000\000\000\000\000\007\t\000\000\000\000\001\154\027\206\000\000\000\000\000\000\005\157\000\000\001\158\000\000\001\162\000\000\005\157\005\157\001\166\000\000\001\170\001\174\007\222\000\000\007\t\005\157\000\000\000\000\005\157\000\000\000\000\000\000\007\t\005\157\005\157\000\238\000\000\007\t\007\t\000\238\000\000\000\000\000\000\000\000\000\000\000\000\007\t\007\t\000\000\005\157\005\157\000\000\000\000\005\157\000\000\t)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\157\005\157\005\157\000\000\005\157\005\157\000\000\000\000\t\250\007\t\000\000\012J\t)\000\000\t)\t)\000\000\005\157\007\t\000\000\005\157\005\157\n2\nJ\nR\n:\nZ\000\000\000\000\000\000\000\000\000\000\005\157\000\000\024R\000\000\nb\nj\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nr\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\238\000\000\000\000\000\000\000\000\000\000\001\006\000\000\000\000\n\002\nB\nz\n\130\n\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\154\001\n\000\000\000\000\014~\000\000\000\000\000\000\000\000\n\162\000\000\000\000\000\000\000\000\001\014\001\018\001\022\001\026\001\030\001\"\000\000\000\000\000\000\n\194\000\000\n\202\n\138\001&\000\000\001.\0012\t)\n\170\000\000\000\000\0016\000\000\000\000\001:\000\000\n\178\n\186\000\000\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>\001B\001F\001J\001N\000\000\003\133\003\133\001R\000\000\000\000\003\133\001V\000\000\003\133\000\000\000\000\000\000\000\000\000\000\000\000\001Z\000\000\000\000\003\133\000\000\003\133\001^\003\133\000\000\003\133\000\000\000\000\000\000\000\000\000\000\000\000\001\154\027\234\000\000\000\000\000\000\003\133\000\000\001\158\000\000\001\162\000\000\003\133\003\133\001\166\000\000\001\170\001\174\0051\000\000\000\000\003\133\000\000\000\000\003\133\000\000\000\000\000\000\000\000\003\133\003\133\003\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\000\000\003\133\000\000\001\202\001\206\003\133\b\157\b\157\000\000\000\000\000\000\b\157\000\000\000\000\b\157\003\133\003\133\003\133\000\000\003\133\003\133\000\000\001\210\001\214\b\157\0051\b\157\000\000\b\157\000\000\b\157\000\000\003\133\000\000\000\000\000\000\003\133\000\000\000\000\000\000\000\000\000\000\b\157\000\000\000\000\001\246\002\154\003\133\b\157\b\157\002\158\000\000\002\178\004\030\004*\000\000\000\000\b\157\000\000\0046\b\157\0166\000\000\000\000\000\000\b\157\b\157\b\157\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\b\157\000\000\000\000\000\000\b\157\r\133\r\133\000\000\000\000\000\000\r\133\000\000\000\000\r\133\b\157\b\157\b\157\000\000\b\157\b\157\000\000\000\000\000\000\r\133\000\000\r\133\000\000\r\133\b\157\r\133\000\000\b\157\000\000\000\000\000\000\b\157\000\000\000\000\000\000\000\000\000\000\r\133\000\000\000\000\004\254\000\000\b\157\r\133\r\133\r\137\r\137\000\000\000\000\004B\r\137\000\000\r\133\r\137\000\000\r\133\000\000\000\000\000\000\000\000\r\133\r\133\r\133\r\137\000\000\r\137\000\000\r\137\000\000\r\137\000\000\000\000\000\000\000\000\000\000\000\000\r\133\000\000\000\000\000\000\r\133\r\137\000\000\000\000\000\000\000\000\000\000\r\137\r\137\000\000\r\133\r\133\r\133\004B\r\133\r\133\r\137\000\000\000\000\r\137\004R\000\000\000\000\000\000\r\137\r\137\r\137\r\133\000\000\000\000\000\000\r\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\137\000\000\r\133\000\000\r\137\003\133\003\133\000\000\000\000\000\000\003\133\000\000\000\000\003\133\r\137\r\137\r\137\000\000\r\137\r\137\000\000\000\000\000\000\003\133\004R\003\133\000\000\003\133\000\000\003\133\000\000\r\137\000\000\000\000\000\000\r\137\000\000\000\000\000\000\000\000\000\000\003\133\000\000\000\000\000\000\000\000\r\137\003\133\003\133\000\000\000\000\000\000\000\000\0055\000\000\000\000\003\133\000\000\000\000\003\133\001\141\000\000\000\000\000\000\003\133\003\133\003\133\000\000\000\000\000\000\000\000\000\000\000\000\t\250\000\000\000\000\000\000\000\000\000\000\001\141\003\133\000\000\000\000\000\000\003\133\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\000\000\003\133\003\133\003\133\000\000\003\133\003\133\000\000\nb\nj\000\000\0055\000\000\000\000\000\000\000\000\000\000\nr\003\133\000\000\000\000\000\000\003\133\000\000\000\000\000\238\000\000\000\000\000\000\016\250\000\000\000\000\001\137\003\133\n\002\nB\nz\n\130\n\146\000\000\r\150\000\000\000\000\000\000\000\000\t\250\n\154\000\000\000\000\016\254\001\141\001\137\000\000\000\000\000\000\n\162\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\000\000\000\000\000\000\000\000\n\194\000\000\n\202\n\138\nb\nj\000\000\000\000\001\141\n\170\000\000\000\000\000\000\nr\000\000\000\000\001\141\n\178\n\186\000\000\000\000\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\002\nB\nz\n\130\n\146\000\000\001\245\000\000\000\000\000\000\000\000\001\245\n\154\001\206\001\245\000\000\001\137\000\000\000\000\000\000\000\000\n\162\t\005\000\000\001\245\000\000\r\154\000\000\001\245\000\000\001\245\000\000\000\000\000\000\000\000\n\194\017\002\n\202\n\138\017\018\000\000\000\000\001\245\001\137\n\170\000\000\000\000\000\000\001\245\001\245\000\000\001\137\n\178\n\186\000\000\002\154\000\000\001\245\000\000\000\000\001\245\000\000\000\000\000\000\000\000\001\245\001\245\001\245\000\000\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\245\001\245\000\000\000\000\004\154\003i\000\000\000\000\000\000\000\000\003i\000\000\001\206\003i\001\245\001\245\000\000\000\000\001\245\001\245\000\000\t\001\000\000\003i\000\000\000\000\000\000\003i\001\245\003i\000\000\000\000\000\000\000\000\000\000\001\245\000\000\000\000\000\000\000\000\001\245\003i\000\000\000\000\000\000\000\000\001\245\003i\001\241\000\000\000\181\000\000\000\000\000\000\002\154\000\181\003i\000\000\000\181\003i\000\000\000\000\000\000\000\000\003i\003i\003i\000\000\000\181\000\000\000\181\000\000\000\181\000\000\000\181\000\000\000\000\000\000\000\000\000\000\003i\003i\000\000\000\000\004\154\000\000\000\181\000\000\000\000\000\000\000\000\000\000\000\181\000\000\003i\003i\000\181\000\000\003i\003i\000\000\000\181\000\000\000\000\000\181\000\000\000\000\000\000\003i\000\181\000\181\000\238\000\000\000\000\000\000\003i\000\000\000\000\000\181\000\181\003i\000\000\000\000\000\000\000\000\000\181\003i\000\000\000\249\000\181\000\000\000\000\000\000\000\249\000\000\000\000\000\249\000\000\000\000\000\181\000\181\000\000\000\000\000\181\000\181\000\000\000\249\000\000\000\249\000\000\000\249\000\000\000\249\000\181\000\000\000\000\001\021\000\000\000\000\000\181\000\181\001\021\000\000\000\000\000\249\000\000\000\000\000\000\000\000\000\181\000\249\000\181\000\000\000\000\000\249\000\000\000\000\000\000\000\000\000\249\001\021\000\000\000\249\000\000\000\000\000\000\000\000\000\249\000\249\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\249\000\249\000\000\000\000\000\000\000\000\001\021\000\249\019N\000\000\000\189\000\249\000\000\000\000\001\021\000\189\000\000\000\000\000\189\001\021\000\000\000\249\000\249\000\000\000\000\000\249\000\249\000\000\000\189\001\021\000\189\000\000\000\189\000\000\000\189\000\249\000\000\000\000\000\000\000\000\000\000\000\249\000\249\000\000\000\000\000\000\000\189\000\000\000\000\000\000\000\000\000\249\000\189\000\249\001\021\000\000\000\189\000\000\000\000\000\000\000\000\000\189\000\000\001\021\000\189\000\000\000\000\000\000\000\000\000\189\000\189\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\189\000\189\000\000\000\000\000\000\000\000\000\000\000\189\000\000\000\000\000\185\000\189\000\000\000\000\001\237\000\185\000\000\000\000\000\185\001\237\000\000\000\189\000\189\000\000\000\000\000\189\000\189\000\000\000\185\000\000\000\185\000\000\000\185\000\000\000\185\000\189\000\000\000\000\001\237\000\000\000\000\000\189\000\189\000\000\000\000\000\000\000\185\000\000\000\000\000\000\000\000\000\189\000\185\000\189\000\000\000\000\000\185\000\000\000\000\000\000\001\237\000\185\000\000\000\000\000\185\000\000\000\000\000\000\001\237\000\185\000\185\000\238\000\000\001\237\001\237\000\238\000\000\000\000\000\185\000\185\000\000\000\000\001\237\001\237\000\000\000\185\000\000\000\000\001\209\000\185\000\000\000\000\000\000\001\209\000\000\000\000\001\209\000\000\000\000\000\185\000\185\000\000\000\000\000\185\000\185\000\000\001\209\000\000\001\237\000\000\001\209\rE\001\209\000\185\000\000\000\000\rE\001\237\000\000\000\185\000\185\000\000\000\000\000\000\001\209\001\209\000\000\000\000\000\000\000\185\001\209\000\185\000\000\000\000\000\000\rE\0051\000\000\000\000\001\209\000\000\000\000\001\209\000\000\000\000\000\000\000\000\001\209\001\209\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rE\000\000\000\000\000\000\000\000\000\000\001\209\000\000\rE\000\000\001\209\r\129\r\129\rE\rE\000\238\r\129\000\000\000\000\r\129\001\209\001\209\rE\rE\001\209\001\209\000\000\000\000\000\000\r\129\0051\r\129\000\000\r\129\001\209\r\129\000\000\000\000\000\000\000\000\001\209\001\209\000\000\000\000\000\000\000\000\001\209\r\129\rE\000\000\000\000\000\000\001\209\r\129\r\129\000\000\000\000\rE\000\000\000\000\000\000\000\000\r\129\000\000\000\000\r\129\000\000\000\000\000\000\000\000\r\129\r\129\r\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\r\129\000\000\000\000\000\000\r\129\r}\r}\000\000\000\000\000\000\r}\000\000\000\000\r}\r\129\r\129\r\129\000\000\r\129\r\129\000\000\000\000\000\000\r}\000\000\r}\000\000\r}\000\000\r}\000\000\r\129\000\000\000\000\000\000\r\129\000\000\000\000\000\000\000\000\000\000\r}\000\000\000\000\004\254\000\000\r\129\r}\r}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r}\000\000\000\000\r}\000\000\000\000\000\000\000\000\r}\r}\r}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r}\000\000\b\161\b\161\r}\000\000\004\133\b\161\000\000\000\000\b\161\004\133\000\000\000\000\r}\r}\r}\000\000\r}\r}\b\161\000\000\b\161\000\000\b\161\000\000\b\161\000\000\007J\000\000\004\133\r}\000\000\000\000\000\000\r}\000\000\000\000\b\161\000\000\000\000\000\000\000\000\000\000\b\161\b\161\r}\000\000\000\000\000\000\000\000\000\000\004\133\b\161\t)\000\000\b\161\000\000\000\000\000\000\004\133\b\161\b\161\000\238\000\000\004\133\002\226\000\000\000\000\000\000\t\250\000\000\000\000\012J\004\133\004\133\t)\b\161\000\000\000\000\000\000\b\161\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\000\000\b\161\b\161\b\161\000\000\b\161\b\161\000\000\nb\nj\004\133\000\000\000\000\000\000\000\000\b\161\000\000\nr\b\161\004\133\000\000\000\000\b\161\000\000\000\000\000\238\000\000\000\000\000\000\007\029\000\000\000\000\000\000\b\161\n\002\nB\nz\n\130\n\146\000\000\000\000\000\000\000\000\000\000\000\000\t\250\n\154\000\000\007\029\000\000\014\234\000\000\007\029\000\000\000\000\n\162\000\000\000\000\000\000\n2\nJ\nR\n:\nZ\000\000\000\000\000\000\000\000\000\000\n\194\000\000\n\202\n\138\nb\nj\000\000\000\000\000\000\n\170\000\000\000\000\000\000\nr\000\000\000\000\000\000\n\178\n\186\000\000\000\000\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\002\nB\nz\n\130\n\146\000\000\000\000\000\000\000\000\001\241\000\000\007\029\n\154\000\000\001\241\000\000\001\206\001\241\000\000\000\000\000\000\n\162\000\000\000\000\000\000\t\001\000\000\001\241\000\000\000\000\000\000\001\241\000\000\001\241\000\000\n\194\000\000\n\202\n\138\000\000\000\000\000\000\000\000\000\000\n\170\001\241\000\000\000\000\000\000\000\000\000\000\001\241\n\178\n\186\000\000\000\000\000\000\000\000\002\154\000\000\001\241\000\000\000\000\001\241\000\000\000\000\000\000\000\000\001\241\001\241\001\241\000\000\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\241\001\241\000\000\000\000\004\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\241\001\241\000\000\000\000\001\241\001\241\000\000\000\000\000\000\000\000\000\000\004\141\000\000\000\000\001\241\001\r\000\246\001\202\001\206\002\018\001\r\001\241\000\000\000\000\000\000\000\000\001\241\000\000\000\000\018J\000\000\000\000\001\241\004\141\000\000\003\182\001\210\001\214\001\230\001\r\000\000\000\000\000\000\000\000\000\000\000\000\001\242\018N\000\000\000\000\000\000\000\000\000\000\018v\000\000\000\000\000\000\000\000\000\000\001\246\002\146\001\r\000\000\003R\002\158\017\170\002\178\004\030\004*\001\r\017\194\005\213\005\213\0046\001\r\000\000\005\213\000\000\000\000\005\213\000\000\000\000\000\000\001\r\001\r\000\000\018\242\000\000\000\000\005\213\004:\005\213\000\000\005\213\000\000\005\213\000\000\000\000\000\000\000\000\017\222\019\006\000\000\000\000\004\141\004\141\000\000\005\213\000\000\001\r\000\000\000\000\000\000\005\213\005\213\000\000\000\000\000\000\001\r\007\222\000\000\019\022\005\213\000\000\000\000\005\213\004n\006u\004r\000\000\005\213\005\213\000\238\000\000\002\190\000\000\000\000\002\130\000\000\000\000\000\000\000\000\002\246\000\000\003\t\003\t\005\213\006u\003\t\000\000\005\213\000\000\001\210\003\t\000\000\000\000\002\250\000\000\000\000\003\t\005\213\005\213\005\213\003\t\005\213\005\213\000\000\002\254\000\000\000\000\003\t\000\n\000\000\000\000\006\218\0032\001\190\005\213\000\000\000\000\015\210\005\213\002\178\003\t\000\000\003:\003\t\003\t\000\000\b\026\b\030\b*\005\213\003\t\005v\000\000\003\t\000\000\000\000\003\t\003\t\000\000\003\t\003\t\000\000\003\t\000\000\000\000\000\000\000\000\000\000\005\209\007\030\000\000\005\130\005\134\005\209\003\t\000\000\005\209\000\000\000\000\000\000\000\000\000\000\003\t\003\t\000\000\016\014\005\209\000\000\005\209\000\000\005\209\000\000\005\209\000\000\000\000\005\138\b2\000\000\000\000\000\000\bJ\004r\000\000\000\000\005\209\000\000\003\t\000\000\000\000\000\000\005\209\007\138\003\t\000\000\000\000\000\000\000\000\000\000\000\000\005\209\000\000\000\000\005\209\000\000\000\000\004\177\000\000\005\209\005\209\000\238\022Z\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\209\000\000\005\237\005\237\005\209\000\000\003\182\005\237\000\000\000\000\005\237\000\000\000\000\000\000\005\209\005\209\005\209\000\000\005\209\005\209\005\237\000\000\005\237\000\000\005\237\000\000\005\237\000\000\022\202\000\000\000\000\005\209\000\000\000\000\000\000\005\209\017\170\000\000\005\237\000\000\000\000\017\194\000\000\000\000\005\237\005\237\005\209\000\000\000\000\000\000\023n\023~\000\000\005\237\000\000\000\000\005\237\000\000\000\000\000\000\000\000\005\237\005\237\005\237\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\177\005\237\000\000\005\233\007\030\005\237\000\000\000\000\005\233\024r\000\000\005\233\000\000\000\000\000\000\005\237\005\237\005\237\000\000\005\237\005\237\005\233\000\000\005\233\000\000\005\233\000\000\005\233\000\000\000\000\000\000\000\000\005\237\000\000\000\000\000\000\005\237\000\000\000\000\005\233\000\000\000\000\000\000\000\000\000\000\005\233\007\138\007\130\000\000\000\000\000\000\000\000\000\000\000\000\005\233\000\000\000\000\005\233\000\000\000\000\000\000\000\000\005\233\005\233\000\238\000\000\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\233\003V\002\190\000\000\005\233\002\130\000\000\006\166\000\000\000\000\002\246\000\000\000\000\000\000\005\233\005\233\005\233\000\000\005\233\005\233\001\210\000\000\006\198\000\000\000\000\000\000\000\000\003Z\000\000\000\000\b\226\005\233\000\000\000\000\000\000\005\233\000\000\000\000\000\000\000\000\003f\000\000\000\000\n\222\001\190\000\000\005\233\012\202\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\000\000\n\238\005v\t\250\000\000\000\000\012J\000\000\000\000\000\000\t)\000\000\000\000\000\000\005z\000\000\000\000\n2\nJ\nR\n:\nZ\005\130\005\134\000\000\000\000\n\246\000\000\000\000\000\000\000\000\nb\nj\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nr\tr\000\000\000\000\t~\000\000\005\138\000\000\000\238\000\000\000\000\000\000\004r\000\000\000\000\000\000\000\000\n\002\nB\nz\n\130\n\146\000\000\003e\000\000\000\000\000\000\000\000\003e\n\154\001\206\003e\000\000\014~\000\000\000\000\000\000\000\000\n\162\000\000\000\000\003e\000\000\000\000\000\000\003e\000\000\003e\000\000\000\000\000\000\000\000\n\194\000\000\n\202\n\138\000\000\000\000\000\000\003e\014\142\n\170\000\000\000\000\000\000\003e\000\000\000\000\001M\n\178\n\186\000\000\002\154\001M\003e\000\000\001M\003e\000\000\000\000\000\000\000\000\003e\003e\003e\000\000\001M\000\000\001M\000\000\001M\000\000\001M\000\000\000\000\000\000\000\000\000\000\003e\003e\000\000\000\000\004\154\000\000\001M\000\000\000\000\000\000\000\000\000\000\001M\000\000\003e\003e\001M\000\000\003e\003e\000\000\001M\000\000\000\000\001M\000\000\000\000\000\000\003e\001M\001M\000\238\000\000\001I\000\000\003e\000\000\000\000\001I\001M\003e\001I\000\000\000\000\000\000\001M\003e\000\000\000\000\001M\000\000\001I\000\000\001I\000\000\001I\000\000\001I\000\000\001M\001M\001M\000\000\001M\001M\000\000\000\000\000\000\000\000\001I\000\000\000\000\000\000\001M\000\000\001I\000\000\000\000\000\000\001I\001M\000\000\000\000\000\000\001I\000\000\000\000\001I\000\000\000\000\000\000\001M\001I\001I\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\000\000\000\000\000\000\000\000\000\001I\000\000\000\000\000\000\001I\001\133\000\000\000\000\000\000\000\000\001\133\000\000\012\221\001\133\001I\001I\001I\000\000\001I\001I\000\000\012\221\000\000\001\133\000\000\001\133\000\000\001\133\001I\001\133\000\000\000\000\000\000\000\000\000\000\001I\000\000\000\000\000\000\000\000\000\000\001\133\000\000\000\000\000\000\000\000\001I\001\133\012\221\000\000\000\000\000\000\000\000\000\000\012\221\000\000\000\000\000\000\000\000\001\133\000\000\000\000\000\000\000\000\001\133\001\133\001\133\000\000\000\000\0019\000\000\000\000\000\000\000\000\0019\000\000\000\157\0019\000\000\000\000\001\133\000\000\000\000\000\000\012\221\000\157\000\000\0019\000\000\0019\000\000\0019\000\000\0019\001\133\001\133\001\133\000\000\001\133\001\133\000\000\000\000\000\000\000\000\000\000\0019\000\000\000\000\000\000\000\000\000\000\0019\000\157\000\000\000\000\001\133\000\000\000\000\000\157\000\000\000\000\000\000\000\000\0019\000\000\000\000\001\133\000\000\0019\0019\0019\000\000\001\253\000\000\000\000\000\000\000\000\001\253\000\000\016\026\001\253\000\000\002\130\000\000\0019\000\000\000\000\000\000\000\157\000\000\001\253\000\000\000\000\000\000\001\253\000\000\001\253\000\000\0019\0019\0019\000\000\0019\0019\000\000\000\000\000\000\000\000\001\253\000\000\000\000\000\000\000\000\000\000\001\253\000\000\000\000\000\000\000\000\0019\016\030\000\000\000\000\001\253\000\000\000\000\001\253\000\000\000\000\000\000\0019\001\253\001\253\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\001\253\000Y\000\000\000\000\001\253\000\000\000Y\000\000\000Y\000\000\000\000\000\000\000\000\005\134\001\253\001\253\000\000\000Y\001\253\001\253\000Y\000\000\000\000\000\000\000Y\000Y\000\000\b\189\001\253\000\000\000\000\000\000\000\000\000\000\000\000\001\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Y\000\000\001\253\000Y\000\000\000\000\000Y\000\000\000\000\000\000\000\000\000Y\000\000\000\000\000\000\000\000\000Y\000Y\000Y\000\000\000\000\000\000\000\000\000\000\000\000\000Y\000Y\000\000\003V\002\190\000\000\000\000\002\130\000\000\006\166\000\000\000Y\002\246\000\000\000Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\210\000Y\006\198\000\000\000Y\000\000\000\000\003Z\000\000\b\189\b\226\000\000\000\000\000Y\004\133\007\030\000Y\000\000\t&\004\133\003f\000\000\004\133\r\182\001\190\000\000\000\000\000\000\000\000\000Y\002\178\000\000\004\133\003\246\000\000\000\000\004\133\003\250\004\133\004\002\000\000\n\238\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\133\000\000\000\000\000\000\005z\000\000\004\133\007\138\000\000\000\000\004\133\000\000\005\130\005\134\000\000\004\133\000\000\000\000\004\133\000\000\000\000\000\000\000\000\004\133\002\226\000\238\000\000\000\000\000\000\000\000\000\000\000\000\004\133\004\133\r\198\000\000\005\138\000\000\000\000\004\133\004\133\000\000\004r\004\133\000\000\012&\000\000\000\000\000\000\000\000\012&\000\000\000\000\004\133\004\133\000\000\000\000\004\133\004\133\000\000\000\000\t\250\000\000\000\000\000\000\000\000\t\250\004\133\012*\000\000\000\000\000\000\000\000\r\002\004\133\n2\nJ\nR\n:\nZ\n2\nJ\nR\n:\nZ\004\133\000\000\000\000\000\000\nb\nj\000\000\000\000\000\000\nb\nj\000\000\000\000\nr\000\000\000\000\000\000\000\000\nr\000\000\000\000\000\238\000\000\000\000\000\000\000\000\000\238\000\000\000\000\000\000\n\002\nB\nz\n\130\n\146\n\002\nB\nz\n\130\n\146\000\000\000\000\n\154\000\000\000\000\000\000\000\000\n\154\000\000\000\000\000\000\n\162\000\000\000\000\000\000\000\000\n\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\194\000\000\n\202\n\138\000\000\n\194\000\000\n\202\n\138\n\170\t\250\000\000\000\000\000\000\n\170\000\000\014\250\n\178\n\186\000\000\000\000\000\000\n\178\n\186\n2\nJ\nR\n:\nZ\000\000\000\000\000\000\000\000\000\000\000\000\003]\000\000\000\000\nb\nj\003]\000\000\000\000\003]\000\000\000\000\000\000\nr\000\000\000\000\000\000\000\000\000\000\003]\000\000\000\238\000\000\003]\000\000\003]\000\000\000\000\006\249\006\249\n\002\nB\nz\n\130\n\146\000\000\000\000\003]\0162\000\000\000\000\000\000\n\154\003]\004.\000\000\014\234\006\249\006\249\006\249\000\000\n\162\003]\000\000\000\000\003]\000\000\006\249\000\000\000\000\003]\003]\003]\000\000\000\000\n\194\000\000\n\202\n\138\000\000\006\249\006\249\000\000\000\000\n\170\006\249\003]\006\249\006\249\006\249\003]\000\000\n\178\n\186\006\249\000\000\000\000\000\000\000\000\000\000\003]\003]\026&\006y\003]\003]\000\000\000\000\000\000\003V\002\190\006\249\000\000\002\130\003]\006\166\000\000\000\000\002\246\000\000\016\146\003]\000\000\006y\000\000\000\000\003]\000\000\001\210\000\000\006\198\000\000\003]\000\000\000\000\003Z\000\000\000\000\b\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\218\004\"\003f\006\249\000\000\003r\001\190\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\n\238\005v\000\000\000\000\000\000\003V\002\190\000\000\000\000\002\130\000\000\006\166\000\000\005z\002\246\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\001\210\022J\006\198\000\000\000\000\000\000\000\000\003Z\000\000\000\000\b\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\166\003f\005\138\000\000\n\222\001\190\000\000\000\000\004r\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\000\000\n\238\005v\000\000\000\000\000\000\003V\002\190\000\000\000\000\002\130\000\000\006\166\000\000\005z\002\246\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\001\210\n\246\006\198\000\000\000\000\000\000\000\000\003Z\000\000\000\000\b\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\226\003f\005\138\000\000\n\222\001\190\000\000\000\000\004r\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005\194\n\238\005v\000\000\000\000\000\000\003V\002\190\000\000\000\000\002\130\000\000\000\000\000\000\005z\002\246\000\000\000\000\000\000\000\000\005\198\000\000\005\130\005\134\000\000\001\210\n\246\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023B\003f\005\138\000\000\003r\001\190\000\000\000\000\004r\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\000\000\000\000\000\000\003\t\003\t\000\000\000\000\003\t\000\000\005z\000\000\000\000\003\t\000\000\000\000\000\000\000\000\005\130\005\134\000\000\005\202\000\000\003\t\000\000\000\000\000\000\000\000\000\000\000\000\003\t\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\022\000\000\000\000\005\138\003\t\006\146\000\000\003\t\003\t\004r\000\000\000\000\000\000\000\000\003\t\000\000\000\000\003\t\000\000\000\000\003\t\003\t\000\000\003\t\003\t\000\000\003\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004m\004m\003\t\000\000\004m\000\000\000\000\000\000\000\000\004m\003\t\003\t\000\000\003\t\000\000\004m\000\000\000\000\000\000\004m\000\000\000\000\000\000\000\000\000\000\000\000\004m\023\146\000\000\000\000\023\170\000\000\000\000\000\000\003\t\000\000\000\000\000\000\003\t\004m\003\t\000\000\004m\004m\000\000\001\202\001\206\000\000\000\000\004m\000\000\000\000\004m\000\000\000\000\000\238\004m\000\000\004m\004m\000\000\004m\003]\000\000\001\210\001\214\001\230\003]\000\000\000\000\003]\000\000\000\000\004m\001\242\000\000\000\000\019F\000\000\000\000\003]\004m\004m\000\000\003]\000\000\003]\001\246\020\174\000\000\019\206\000\000\002\158\000\000\002\178\004\030\004*\000\000\003]\0162\000\000\020\190\000\000\000\000\003]\004m\000\000\000\000\000\000\000\000\000\000\004m\000\000\003]\000\000\000\000\003]\000\000\004:\000\000\000\000\003]\003]\003]\012\213\000\000\000\000\000\000\000\000\012\213\000\000\000\000\012\213\000\000\000\000\000\000\000\000\003]\000\000\000\000\000\000\003]\012\213\000\000\000\000\000\000\012\213\000\000\012\213\000\000\000\000\003]\003]\026V\005)\003]\003]\000\000\000\000\000\000\012\213\000\000\000\000\000\000\000\000\000\000\012\213\000\000\000\000\000\000\000\000\016\146\003]\000\000\000\000\012\213\000\000\003]\012\213\000\000\000\000\003V\002\190\012\213\012\213\002\130\000\000\006\166\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\213\001\210\000\000\006\198\012\213\000\000\000\000\000\000\003Z\000\000\000\000\b\226\000\000\000\000\012\213\012\213\002z\000\000\012\213\012\213\000\000\003f\000\000\000\000\t\014\001\190\000\000\000\000\012\213\000\000\000\000\002\178\027\022\000\000\003\246\012\213\000\000\000\000\003\250\000\000\004\002\000\000\n\238\005v\005\129\000\000\012\213\000\000\000\000\005\129\000\000\000\000\005\129\000\000\000\000\005z\000\000\000\000\000\000\000\000\000\000\000\000\005\129\005\130\005\134\000\000\005\129\000\000\005\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\129\000\000\000\000\000\000\000\000\000\000\005\129\005\138\000\000\000\000\000\000\000\000\007\222\004r\000\000\005\129\000\000\000\000\005\129\000\000\000\000\000\000\000\000\005\129\005\129\000\238\000\000\005\133\000\000\000\000\000\000\000\000\005\133\000\000\000\000\005\133\000\000\000\000\000\000\005\129\005\129\000\000\000\000\005\129\000\000\005\133\000\000\000\000\000\000\005\133\000\000\005\133\000\000\005\129\005\129\000\000\000\000\005\129\005\129\000\000\000\000\000\000\000\000\005\133\000\000\000\000\000\000\000\000\000\000\005\133\000\000\003]\000\000\000\000\005\129\007\222\003]\000\000\005\133\003]\000\000\005\133\000\000\000\000\000\000\005\129\005\133\005\133\000\238\003]\000\000\000\000\000\000\003]\000\000\003]\000\000\000\000\000\000\000\000\000\000\000\000\005\133\005\133\000\000\000\000\005\133\003]\0162\000\000\000\000\000\000\000\000\003]\000\000\000\000\005\133\005\133\000\000\000\000\005\133\005\133\003]\000\000\000\000\003]\000\000\000\000\000\000\000\000\003]\003]\003]\006-\000\000\000\000\000\000\005\133\006-\000\000\000\000\006-\000\000\000\000\000\000\000\000\003]\000\000\005\133\000\000\003]\006-\000\000\000\000\000\000\006-\000\000\006-\000\000\000\000\003]\003]\018\026\000\000\003]\003]\000\000\000\000\000\000\006-\000\000\000\000\000\000\000\000\000\000\006-\000\000\000\000\000\000\000\000\016\146\003]\000\000\000\000\006-\000\000\000\000\006-\000\000\000\000\000\000\000\000\006-\006-\000\238\000\000\000\000\000\000\000\000\000\000\025\254\000\000\000\000\000\000\000\000\000\000\003V\002\190\006-\000\000\002\130\000\000\006-\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\006-\006-\021\214\001\210\006-\006-\000\000\000\000\000\000\000\000\003Z\001\202\001\206\000\000\006-\000\000\000\000\000\000\000\000\000\000\000\000\006-\000\000\003f\000\000\000\000\003r\001\190\000\000\000\000\001\210\001\214\006-\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\000\000\005\238\000\000\000\000\000\000\001\246\002\162\003V\002\190\005z\002\158\002\130\002\178\004\030\004*\000\000\002\246\005\130\005\134\0046\005\202\000\000\000\000\003\254\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\004:\000\000\000\000\004\249\000\000\005\138\000\000\000\000\000\000\b\202\003f\004r\000\000\003r\001\190\000\000\000\000\000\000\000\000\026\162\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\006.\000\000\000\000\000\000\000\000\000\000\003V\002\190\000\000\005z\002\130\000\000\000\000\000\000\000\000\002\246\000\000\005\130\005\134\000\000\005\202\000\000\006R\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\006:\000\000\000\000\000\000\000\000\005\138\003V\002\190\000\000\003f\002\130\004r\003r\001\190\000\000\002\246\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\001\210\003\250\000\000\004\002\005j\000\000\005v\003Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005z\000\000\003f\000\000\000\000\003r\001\190\000\000\005\130\005\134\000\000\005\202\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\011\182\000\000\000\000\000\000\000\000\005\138\003V\002\190\000\000\005z\002\130\004r\000\000\000\000\000\000\002\246\000\000\005\130\005\134\000\000\005\202\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\005\138\003V\002\190\000\000\003f\002\130\004r\003r\001\190\000\000\002\246\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\001\210\003\250\000\000\004\002\005j\000\000\005v\003Z\000\000\000\000\000\000\000\000\000\246\000\000\000\000\002\194\000\000\000\000\005z\000\000\003f\000\000\000\000\003r\001\190\004\185\005\130\005\134\000\000\005\202\002\178\003\182\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\003\186\000\000\011\206\000\000\000\000\000\000\017F\005\138\003V\002\190\000\000\005z\002\130\004r\000\000\024\242\000\000\002\246\017\170\005\130\005\134\000\000\005\202\017\194\000\000\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\000\000\017\202\000\000\000\000\000\000\005\138\000\000\000\000\000\000\003f\006\157\004r\003r\001\190\000\000\017\222\018\n\002\190\000\000\002\178\002\130\000\000\003\246\000\000\000\000\002\246\003\250\000\000\004\002\005j\006\157\005v\000\000\000\000\000\000\001\210\0222\000\000\000\000\002\250\000\000\000\000\000\000\005z\000\000\000\000\000\000\000\000\000\000\000\000\002\254\005\130\005\134\000\000\005\202\000\000\000\000\000\000\0032\001\190\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\003:\000\000\000\000\000\000\b\026\b\030\b*\005\138\000\000\005v\000\000\000\000\000\000\004r\007%\007\030\000\000\000\000\000\000\007%\000\000\000\000\007%\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\007%\000\000\000\000\000\000\007%\000\000\007%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007%\000\000\000\000\005\138\b2\000\000\007%\007\138\bJ\004r\000\000\000\000\000\000\000\000\000\000\007%\000\000\000\000\007%\000\000\000\000\000\000\000\000\007%\007%\000\238\001\221\000\000\000\000\000\000\000\000\001\221\000\000\000\000\001\221\000\000\000\000\000\000\000\000\007%\000\000\000\000\000\000\007%\001\221\000\000\000\000\000\000\001\221\000\000\001\221\000\000\000\000\007%\007%\000\000\000\000\007%\007%\000\000\000\000\000\000\001\221\000\000\000\000\000\000\000\000\000\000\001\221\000\000\002\001\000\000\000\000\000\000\007%\002\001\000\000\001\221\002\001\000\000\001\221\000\000\000\000\000\000\000\000\001\221\001\221\001\221\002\001\000\000\000\000\000\000\002\001\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\001\221\000\000\000\000\000\000\001\221\002\001\000\000\000\000\000\000\000\000\000\000\002\001\000\000\000\000\001\221\001\221\000\000\000\000\001\221\001\221\002\001\000\000\000\000\002\001\018&\000\000\000\000\000\000\002\001\002\001\000\000\000\000\000\000\000\000\000\000\001\221\000\000\000\000\000\000\000\000\001\221\000\000\000\000\000\000\002\001\000\000\0061\000\000\002\001\000\000\000\000\0061\000\000\000\000\0061\000\000\000\000\000\000\002\001\002\001\000\000\000\000\002\001\002\001\0061\000\000\000\000\000\000\0061\000\000\0061\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\002\001\000\000\000\000\0061\000\000\021\178\000\000\000\000\000\000\0061\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\0061\000\000\000\000\0061\000\000\000\000\000\000\000\000\0061\0061\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0061\000\000\012\213\000\000\0061\000\000\000\000\012\213\000\000\000\000\012\213\000\000\000\000\000\000\0061\0061\000\000\000\000\0061\0061\012\213\000\000\000\000\000\000\012\213\000\000\012\213\000\000\0061\000\000\000\000\000\000\005)\000\000\000\000\0061\000\000\000\000\012\213\000\000\000\000\000\000\000\000\000\000\012\213\000\000\0061\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\213\000\000\000\000\000\000\000\000\012\213\012\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\141\000\000\002\190\012\141\000\000\028\162\000\000\012\213\000\000\000\000\028\166\000\000\000\000\012\141\000\000\000\000\000\000\000\000\000\000\012\141\000\000\012\213\012\213\002z\000\000\012\213\012\213\000\000\000\000\000\000\000\000\012\141\000\000\000\000\000\000\012\213\000\000\012\141\000\000\027N\000\000\000\000\012\213\001\002\001\190\000\000\012\141\000\000\000\000\012\141\000\000\000\000\000\000\012\213\012\141\004\133\000\000\000\000\000\000\000\000\004\133\000\000\028\170\004\133\000\000\000\000\000\000\000\000\000\000\000\000\012\141\000\000\000\000\004\133\012\141\000\000\000\000\004\133\000\000\004\133\000\000\000\000\000\000\028\174\012\141\012\141\000\000\000\000\012\141\000\000\000\000\004\133\000\000\000\000\000\000\000\000\000\000\004\133\b]\b]\000\000\000\000\b]\007\222\000\000\012\141\004\133\b]\000\000\004\133\000\000\000\000\000\000\016\194\004\133\002\226\000\238\b]\000\000\000\000\000\000\000\000\000\000\000\000\b]\000\000\000\000\000\000\000\000\000\000\004\133\000\000\000\000\000\000\004\133\000\000\000\000\b]\000\000\000\000\b]\b]\000\000\000\000\004\133\004\133\000\000\b]\004\133\004\133\b]\000\000\000\000\000\000\b]\000\000\b]\b]\007J\b]\000\000\000\000\000\000\000\000\001q\004\133\000\000\000\000\000\000\001q\026\030\b]\001q\000\000\000\000\000\000\004\133\000\000\000\000\b]\b]\000\000\001q\000\000\001q\000\000\001q\000\000\001q\000\000\000\237\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\237\000\000\001q\000\000\000\000\b]\000\000\000\000\001q\000\000\000\237\b]\000\000\000\000\000\237\000\000\000\237\000\000\000\000\000\000\001q\000\000\000\000\000\000\000\000\001q\001q\000\238\000\237\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\000\000\000\001q\000\000\000\237\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\237\000\237\000\238\000\000\001q\001q\001q\000\000\001q\001q\000\000\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\241\000\237\000\000\000\000\000\000\000\241\001q\000\000\000\241\000\000\000\000\000\237\000\237\000\000\000\000\000\237\000\237\001q\000\241\000\000\000\000\000\000\000\241\000\000\000\241\000\000\000\000\001\202\002~\000\000\000\000\002\130\000\237\000\000\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\241\000\237\000\000\000\000\001\210\001\214\001\230\002\134\000\000\000\241\000\000\000\000\000\241\000\000\001\242\000\000\000\000\000\241\000\241\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\138\002\146\000\000\000\000\000\000\002\158\000\241\002\178\004\030\004*\000\241\000\000\000\000\000\000\021\138\000\000\021\142\000\000\000\000\000\000\000\241\000\241\000\000\000\000\000\241\000\241\000\000\007!\000\000\000\000\000\000\004:\007!\000\000\000\000\007!\000\000\000\000\000\000\000\000\005\134\000\241\000\000\000\000\000\000\007!\000\000\000\000\000\000\007!\021\154\007!\000\241\006%\000\000\000\000\000\000\000\000\006%\000\000\000\000\006%\000\000\007!\000\000\000\000\000\000\021\158\017\250\007!\000\000\006%\000\000\000\000\000\000\006%\000\000\006%\007!\000\000\000\000\007!\000\000\000\000\000\000\000\000\007!\007!\000\000\006%\000\000\000\000\000\000\000\000\000\000\006%\000\000\000\000\000\000\000\000\000\000\000\000\007!\000\000\006%\000\000\007!\006%\000\000\000\000\000\000\000\000\006%\006%\000\000\000\000\007!\007!\017Z\000\000\007!\007!\000\000\000\000\000\000\000\000\005\141\007\030\006%\000\000\000\000\005\141\006%\000\000\005\141\000\000\000\000\007!\000\000\000\000\000\000\000\000\006%\006%\005\141\000\000\006%\006%\005\141\000\000\005\141\000\000\012=\000\000\000\000\000\000\000\000\012=\000\000\000\000\012=\000\000\005\141\006%\000\000\000\000\000\000\000\000\005\141\007\138\012=\000\000\000\000\000\000\012=\000\000\012=\000\000\000\000\000\000\005\141\000\000\000\000\000\000\000\000\005\141\005\141\000\238\012=\000\000\000\000\000\000\000\000\000\000\012=\000\000\000\000\000\000\000\000\000\000\000\000\005\141\000\000\012=\000\000\000\000\012=\000\000\000\000\000\000\000\000\012=\000\000\000\000\000\000\005\141\005\141\000\000\000\000\005\141\005\141\000\000\000\000\000\000\000\000\000\000\000\000\012=\t\238\001\202\002~\012=\000\000\002\130\000\000\000\000\005\141\000\000\000\000\004]\000\000\012=\012=\000\000\004]\012=\012=\004]\001\210\001\214\001\230\000\000\000\000\000\000\000\000\000\000\000\000\004]\001\242\000\000\000\000\004]\012=\004]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\138\002\146\n\210\000\000\004]\002\158\000\000\002\178\004\030\004*\004]\000\000\004U\000\000\021\138\000\000\026\250\004U\000\000\004]\004U\000\000\004]\000\000\000\000\000\000\000\000\004]\000\000\000\000\004U\004:\000\000\000\000\004U\000\000\004U\000\000\000\000\000\000\005\134\000\000\000\000\004]\000\000\000\000\000\000\004]\004U\000\000\027\006\000\000\000\000\000\000\004U\000\000\000\000\004]\004]\000\000\000\000\004]\004]\004U\000\000\000\000\004U\021\158\000\000\000\000\000\000\004U\004u\000\000\000\000\000\000\000\000\004u\004]\000\000\004u\000\000\000\000\000\000\000\000\000\000\000\000\004U\000\000\017\130\004u\004U\000\000\tv\004u\000\000\004u\000\000\000\000\001\202\001\206\004U\004U\000\000\000\000\004U\004U\000\000\004u\000\000\000\000\000\000\000\000\002\142\004u\000\000\004E\000\000\001\210\001\214\001\230\004E\004U\004u\004E\000\000\004u\000\000\001\242\000\000\000\000\004u\000\000\020n\004E\001\250\000\000\000\000\004E\000\000\004E\001\246\002\146\000\000\000\000\000\000\002\158\004u\002\178\004\030\004*\004u\004E\000\000\007\173\0046\000\000\007\173\004E\000\000\000\000\004u\004u\000\000\000\000\004u\004u\004E\000\000\000\000\004E\000\000\004:\007\173\007\173\004E\007\173\007\173\000\000\000\000\000\000\000\000\004u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004E\000\000\021N\000\000\004E\000\000\007\173\000\000\007\193\000\000\016\"\007\193\000\000\000\000\004E\004E\000\000\000\000\004E\004E\000\000\000\000\000\000\000\000\007\173\000\000\000\000\007\193\007\193\000\000\007\193\007\193\000\000\000\000\000\000\004E\000\000\000\000\000\000\007\173\000\000\000\000\007\153\000\000\000\000\007\153\024\198\000\000\000\000\000\000\000\000\007\193\000\000\000\000\007\173\000\000\007\173\000\000\000\000\000\000\000\000\007\153\007\153\000\000\007\153\007\153\000\000\007\197\005\226\000\238\007\197\007\173\007\173\000\000\000\000\000\000\007\173\000\000\007\173\000\000\000\000\000\000\007\173\000\000\007\193\007\153\007\197\007\197\000\000\007\197\007\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\193\000\000\007\193\000\000\007\153\000\000\000\000\000\000\000\000\000\000\000\000\007\197\000\000\000\000\007\193\000\000\000\000\005\234\007\193\007\153\000\000\000\000\007\193\007\181\007\193\000\000\007\181\000\000\007\193\000\238\000\000\000\000\000\000\000\000\007\153\000\000\007\153\000\000\000\000\000\000\000\000\000\000\007\181\007\181\007\197\007\181\007\181\000\000\007\153\000\000\000\000\005\234\007\153\000\000\000\000\000\000\007\153\000\000\007\153\007\197\000\000\007\197\007\153\000\000\004e\000\000\007\181\000\000\000\000\004e\000\000\000\000\004e\007\197\000\000\000\000\005\234\007\197\000\000\000\000\000\000\007\197\004e\007\197\000\238\000\000\004e\007\197\004e\000\000\000\000\000\000\000\000\004M\000\000\000\000\000\000\000\000\004M\007\181\004e\004M\000\000\000\000\000\000\000\000\004e\000\000\000\000\000\000\000\000\004M\000\000\000\000\007\181\004M\007\181\004M\004e\004}\000\000\000\000\000\000\004e\004}\000\000\000\000\004}\006*\004M\000\000\005\234\007\181\000\000\000\000\004M\007\181\004}\007\181\004e\000\000\004}\007\181\004}\t\130\000\000\000\000\004M\000\000\000\000\001\202\001\206\004M\004e\004e\004}\000\000\004e\004e\000\000\000\000\004}\000\000\000\000\000\000\000\000\003\254\000\000\004M\001\210\001\214\001\230\000\000\004}\004e\000\000\000\000\000\000\004}\001\242\000\000\000\000\004M\004M\000\000\018\170\004M\004M\000\000\000\000\000\000\000\000\001\246\002\146\004}\000\000\000\000\002\158\000\000\002\178\004\030\004*\000\000\004M\000\000\000\000\0046\000\000\004}\004}\000\000\000\000\004}\004}\020\250\000\000\000\000\000\000\000\000\000\000\004\153\000\000\000\000\004:\000\000\000\246\006\245\006\245\002\194\004}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\178\000\000\021v\000\000\004\153\000\000\003\182\006\245\006\245\006\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\245\003\186\000\000\000\000\004n\000\000\004r\017F\000\000\000\000\000\000\000\000\000\000\006\245\006\245\000\000\024\242\000\000\006\245\017\170\006\245\006\245\006\245\000\000\017\194\000\000\000\000\006\245\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\202\r\141\r\141\000\000\006\245\000\000\011:\000\000\000\000\000\000\000\000\000\000\001\202\001\206\017\222\018\n\000\000\000\000\004\153\004\153\r\141\r\141\r\141\0072\000\000\000\000\000\000\000\000\000\000\000\000\r\141\001\210\001\214\001\230\000\000\0222\000\000\000\000\000\000\000\000\000\000\001\242\000\000\r\141\r\141\000\000\000\000\004\230\r\141\000\000\r\141\r\141\r\141\000\000\001\246\002\146\000\000\r\141\000\000\002\158\000\000\002\178\004\030\004*\000\000\000\000\000\000\000\000\0046\001\202\001\206\022\230\000\000\000\000\r\141\000\000\000\000\000\000\000\000\000\000\001\202\001\206\023F\000\000\000\000\004:\000\000\000\000\001\210\002\170\001\230\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\242\001\210\002\170\001\230\000\246\000\000\000\000\002\194\000\000\000\000\000\000\001\242\000\000\001\246\002\146\000\000\000\000\028\234\002\158\000\000\002\178\004\030\004*\003\182\001\246\002\146\000\000\0046\000\000\002\158\000\000\002\178\004\030\004*\000\000\003\186\000\000\000\000\0046\000\000\000\000\017F\000\000\000\000\004:\000\000\000\000\000\000\001\202\001\206\024\242\000\000\000\000\017\170\000\000\004:\000\000\000\000\017\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\210\001\214\000\000\000\000\000\000\000\000\000\000\017\202\000\000\000\000\000\000\028\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\222\018\n\001\246\002\162\004\193\000\000\000\000\002\158\000\000\002\178\004\030\004*\000\000\000\000\000\000\000\000\0046\000\000\000\000\000\000\000\000\0222\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\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\162")) + ((16, "ENQ2F@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\204F@\000\000\000\000\020\214F@EN\0218\000K\001\234e\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\202\000\000\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\224\000(\000<\000\000\001\128\002\130\000\000\000~\001\196\003\128\000\000\0038\002\006\004~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003p\000\000\000\000\000\000\0026mD\000\000\000\000\000\000\001\250\000\000\000\000\000\000\002\200\002\240\000\000\000\000\145\200G\200\020\214C*g\200\020\214\148\166Q\028\020\214F\240\000\000\003&\000\000F\240\004$\000\000E6\000\000\0224\000\000\000\000\004b\000\000\001\250\000\000\000\000\000\000\002r\000\000E6\000\000\003\150\128\132\139\016lH\000\000\1416\145\200\000\000q6\000\000\146\142\025\200~\246\001\250zvP@\151jq6F@EN\000\000\000\000Q\028\020\214N\200F\240\003\188\128\132\000\000\139\136F@ENQ2\020\214\000\000\000\000\016\222\022\144\005\146\004\148\000\000\004~\004\244\000\000\000\000\000\000\000\000\000\000\020\214\000\000Cf\131\194EN\000\000\000\000Q2\020xR\238Z\144\000\000\000\"\000\000\000\000\001 \000\000\000\000J\144\000\"\022d\005\152\000*\000\000\000\000\002<\000\000C*\005\132\005\178\020\214\026\184\020\214ENEN\000\000PrHJ\020\214\026\184D\002\020\214\000\000\000\000\000\000Q2\020\214\000\000\000\000\000\254\000\000Z\144\131l~\150\000\000\004\148\000\000\004\026\000\000\000\000B\186mDY(\000\000mDY(\000\000mD\133 \006\148\002\236\006\\\000\000\000\168\000\000\006\182\000\000\000\000\006\182\000\000\000\000\000\000mD\001\250\000\000\000\000\\T\148\212q6\\\218\149\152q6]`Y\160q6\000\000\000\000R\028\006\148\000\000\000\000S\024q6T\020]\230\000\000\151\176q6\007D\149\222q6^l^\242\000\000\007j\150\020q6_x_\254\000\000`\132\000\000\000\000\000\000\000\000\000%\000\000mD\000\000\020L\134\026\000\000mD\005\252mD\000\000C<\b2\001\250\000\000\000\000G\196\000\000\001\006\000\000c\"\005\020\000\000\007\138mD\006\024\000\000\007<\000\000\005@\000\000\000\000\004\024\000\000\000\000\000\000\029\190\000FZ\144Q2\020\214Z\144\000\000\006\148\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000OJJz\000\000\000\000\000\000\002\000\015\200~\150\000\000\000\000Q>\020\214Z\144\000\000\000\000Z\222Z\144j^\132R\000\000\1462\000\000Z\144\000\000\000\000[\130\000\000\000\000\000\000\bx\000\000C\022\000\000\000\000\132\192\000\000\146L\133L\000\000\146\190\003D\000\000\000\000\132R\000\000\0016\000\000\000\000D\254\127\"\000\000\000\000\000\000F\130\025D\027\156\026@\000\000\000\000\000\000\000\000\007*\000\000\000\000d~\003\158\006:\006:\021|mD\bf\b\158\000\000\t\132\000\000\000\000\007\222\b\212\006:\004\166\000\000Q2Q\000HJ\020\214\026\184\000K\007\194\r&\000\000\t6C*C*\000K\007\194\007\194C*\000\000s\228\bDF\240\004\148\006\212\148$\000\000mDo\192mDhnp@mD\b\130mDp\192\000\000\000\000\000\224\003\150h\244\004\244\003\150iz\000\000td\bD\000\000C*t\228\000\000\007@\006\240j\000\000\000\000\000\000\000\000\000\000\000\000\000\001J\000\000\000\000\004D\000\000\t\222\026\184\000\000f D\002\000\000\024B\000\000\000\000C*\002H\000\000\000\000\000\000\000\000e<\000\000\004\224\000\000W\254\nV\007@\000\000\022\192S\142Q2\020\214I\nQ2\020\214\016\222\016\222\000\000\000\000\000\000\000\000\001\252\023pDZ\000\000U\006U\192S\156\020\214\026\184\012zY\210\000\000\005B\000\000VzW4\133\186\0210mD\b\146\000\000Q2\020\214\000\000QD\020\214~\150Z\144\0240\000\000Q2\020\214\129\028\002\160\000\000Z\144Z\144DHmD\td\004\166\n\018\000\000\004\166\n(\000\000\000\000\000\000J\144\002@\002@\000\000\n\130z\254\000\000Q>\020\214Z\144\025N\000\000Q2\020\214\016\222\022\192\016\222\002\250\016\198\000\000\000\000\016\222\b\240\n\136\0064mD\000\000\027@\133 \000\000\022lmD\027\194\011\018\000\000\000\000\011B\000\000\016\222\003\248\012@\000\000\017\196\000\000\006@\000\000\000\000\026\184\000\000\017\220\023\190\000\000\000\000\000\000\000\000\000\"\000\000\000\000\027\182\000\000\028\180\000\000\029\178\000\000\018\218\024\188\000\000\000\000\000\000F@\000\000\000\000\000\000\000\000\030\176\000\000\031\174\000\000 \172\000\000!\170\000\000\"\168\000\000#\166\000\000$\164\000\000%\162\000\000&\160\000\000'\158\000\000(\156\000\000)\154\000\000*\152\000\000+\150\000\000,\148\000\000-\146\000\000.\144\000\000/\142\000\0000\140\000\0001\138\020\214[\130\001\234u|K\130\002@\012\218v\b\143jNX\001 Z\144\028\014\000\000\r\018\000\000H\194\000\000\000\000\148v\000\000\nb\000\000\000\000\000\000\000\000\000\000\r:\000\000\000\000\000\000\000\000\000\000v\b\000\000Z\144\014\006\000\000~\246\b\242\001\250\000\000mD\t\144\000\000\000\000\rt\000\000\000\000\000\000c\242Lt\002@\014\016v\148\000\000\000\000\r\248\000\000\000\000\000\000v\148\000\000\000\000~\246\002@\014\026mD\nb\000\000\000\000\nhmD\n\142\000\000\000\000\0142\000\000\000\000\000\000\023RmD\n\150\000\000\000\000\028H\000\000\000\000\134F\000\000\029F\134\180\000\000\030D\135@\000\000\031B\004\200\000\000\000\000\000\000\000\000 @Z\144!>{z{z\000\000\000\000\000\0002\136\000\000\t\152\000\000\000\000\000\000kT\000\000\000\000\b\210\024,\000\000\b\226\000\000\000\000f\200I\n\000\000\000\000\n\150\000\000\000\000\000\000\011\220\000\000\000\000\000\000\016\222\004\246\025*\000\000\tt\000\000\005\244\000\0003\134\000\000\011\"\000\000\006\242\000\0004\132\000\000\014\208\007\240\000\0005\130w\002\000\000\018\194\000\000\t\224\b\238\000\0006\128\000\000\011\148\t\236\000\0007~\000\000{\236\n\234\000\0008|\t,\025N\000\000\nr\011\232\000\0009z\000\000\011\240\012\230\000\000:x\000\000\012\004\r\228\000\000;v\014\226\000\000p\000\000?n\000\000\"<\000\000\000\000\004\b\000\000\000\000[\130\000\000\000\000\135\180\011p\000\000\000\000I\196\000\000\012H\000\000\000\000f\200Q>\020\234\000\000r\200\000\000\000\000\000\000Q>\020\214Z\144H\194\000\000j\146\000\000j\146\000\000kT\000\000\000\000\000\000\000\000X\200\000\000\012\146\000\000\000\000q2Q>\023\000\000\000q\188\000\000\000\000\000\000\000\000\000\000\nV\n\152\000\000\000\000\022\192\024\160\004\148\000\000E\248\000\000\025\002\026\158\023\246\000\000\000\000\012\218\000\000\000\000\001d\024nW\202\000\000\025\186\000\000\012\238\000\000\000\000\r\216\000\000\000\000q\188\001(\n\144\000\000\000\000\011\150\000\000\000\000\012\242\000\000\000\000q2\000\000\000\000\020\214\026\184\007f\000\000\000\000\022d\005\152\000*\n\254\026\184\129\152C*\002\166\026\184\130\026\015`\000\000\000\000\n\254\000\000Dh\020\154\028\242\000\000\n\020\016\004\000\000\016\004\006\220q6\005\238\000\000\000\000\000\000\015\222\015\134~\246\rPmDB\136\007\024\r\194\020\176\000\000B\238\016P\000\000\025r\000\000\000\000\016lq6k\168\000\000r\\q6\016Xq6wVlv\006L\016\026\000\000\000\000\000\000\020\214\136.\000\000[\130{z\000\000\000\000\016\186\000\000\004\166\016\194\000\000\000\000\000\000@l\000\000\016\248~\150Ajr\200\000\000\000\000[\192\000\000\b<\000\000[\246\000\000\028\192\000\000C*\t:\000\000{z\000\000\020\214\026\184{z\000\000#\204\022\144\005\146\001\250\141\190C*\136\194{z\000\000\020x\000*\000*\n\254{z\143\206\005\152\000*\n\254{z\143\206\000\000\000\000\n\254{z\000\000F@ENZ\144\025.\000\000\000\000F@ENHJ\020\214\026\184{z\000\000\0218\000K\001\234\016(mD\011|\016\244\141\244\000\000{z\000\000Dh\020\154\028\242\130v\029\240\011r\136\240\012\136\0168\020\214{z\000\000\020\214{z\000\000mD\148\166\019\254\t\226\005\146\003\150\144B\000\000\005\146\003\150\144B\000\000#\204\020x\b.\023d\012\134\000\000\144B\000\000\000*\016JC*{z\147>\005\152\000*\016LC*{z\147>\000\000\000\000\012\250\000\000\144n\000\000C*\142\152T\186\000\000\012V\000\000G\200\020\214C*{z\000\000Dh\020\154\028\242|@Fj\026\136\020\154\023\\\000\000\r\178E6\004\244\000\000\016\200\016vKb\020xWLmD\rn\000\000W\254\000\"\005N\011\248\000\000\r>\000\000\016\216\016bmDT\192\000\000\020\196\026\152\015\156\000\000\014,\000\000\016\238\016\132~\246\014zmDE\156T\192\000\000O\028\020\154Kb\0174\021\022\005\146\000\000\012~KbmD\011\\\006\148\000\000mD\003\222\005\218\000\000\000\000w\246\000\000\000\000\014\030KbxvT\192\000\000\020\214mD\r\144mDL\028T\192\000\000\0150\000\000\000\000T\192\000\000\000\000W\254\000\000{z\144\156\020\154\023\\\r\178\017\028\016\204Kb{z\144\156\000\000\000\000\020\154\023\\\r\178\017$\016\172\135\020P\012q6\0176\135\020\133 \024F\017D\135\020q6\017P\135\020x\252y|\000\000\139\228\000\000\000\000T\186\147\128\020\154\023\\\r\178\017H\016\212\135\020T\186\147\128\000\000\000\000\000\000\148\166\000\000\000\000\000\000\000\000\000\000\000\000T\186\000\000\145\016\020\162F\240\017j\128\132\000\000\139\136\145\016\000\000\000\000\147\186\020\162F\240\017z\017\b\139\016\145\200\005\238\017\186\000\000\000\000y\254|@\020\214\000\000\137D\028\242\000\000\000\000T\186\147\186\000\000\000\000\000\000\130\246I\208G\b\005\238\017\192\000\000\000\000\000\000|@\020\214\000\000\005\238\017\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\166Fj\020\154\023\\\r\178\017\152|\254J\144R\004\020xR\238HP\000\"\000\"\r\244\000\000\017\160\012\176\000\000\000\000\017T\000\000\000\000T\192\000\000\bH\014<\000\000\015&\000\000\017\174\017HmDM\014\017\198\r\174\000\000\000\000\017t\000\000\000\000\020\196\004\224\016\030\000\000\017\214}J\149\028\002@\017tmD\014Z\000\000\000\000\017\148\000\000\000\000\000\000T\192\000\000\026\184\016\154\000\000\015:\000\000\017\236\017\130~\246\000\000\018\020}\220\149b\002@\017\180mD\014\142\000\000\000\000\017\202\000\000\000\000\000\000\020\214\000\000T\192\000\000\020\248\020\154R\004R\004~(F@\020\214\136.[\130\003\176\000\000\021(\005\146\000\000\015\028R\004mD\011\192\004\148\000\000\020\214|\254\127\180R\004\011vR\004\000\000G,H\024\000\000m\192\000\000\000\000n@\000\000\000\000n\192\000\000\015HR\004o@\136.[\130\003\176\000\000\006\190\000\000\000\000\135\020\r\148\000\000\000\000K*\018\"\000\000T\192\000\000R\004K*T\192\000\000\020\214mDT\192\000\000\015V\000\000\000\000T\192\000\000\000\000HP\000\000\140d\135\020\017\206R\004\140\192|\254\000\000{z\145\"\020\154\023\\\r\178\018&|\254{z\145\"\000\000\000\000\000\000z\254Q2\000\000\000\000\000\000\000\000\000\000\000\000\142\210{z\000\000\145\016\000\000\000\000\000\000\000\000{zz\254\000\000\018n\000\000\000\000\142\210\018z\000\000{zz\254\000\000\000\000\015\146\000\000\000\000sd\003F\000\000\000\000\025\020\000\000mD\016\012\000\000HP\016.\000\000\000\000\000\000\015\004\000\000\000\000f\200\000\000\000\000S\156\020\214\026\184\t\214\000\000e(\000\000\0116\000\000\021\202\000\000\000\000\018\132\000\000\018\176\131l\000\000Bh\018\162\000\000\000\000\018\162F\174J\014\028\242|@\029\240\020\214\000\000{z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\1280\029\240\020\214\000\000\b\178\128\132\000\000\139\136\000\000\018\166F\174J\014{z\000\000\018\186\000\000\018\148\150Zq6a\na\144\000\000\018\158\150\144q6b\022b\156\000\000\005\160\012\234\020\214\151\012\000\000\000\000\027^\151\"\000\000\000\000\018T\000\000\018\172\014\028\r\242\006\148\000\000\000\000mD\014Z\014\174\000\000mD\019P\005\238\018\224\000\000\000\000\137\196\000\000\000\000\139\016\000\000T\186\000\000\018\214F\174KNT\186\000\000\000\000\000\000\000\000\015(\138D\139\016\000\000T\186\000\000\018\234F\174KNT\186\000\000\016\144\000\000\000\000\0124\000\000{z\000\000\018\254\000\000\000\000\018\\\000\000\018l\000\000\018~\000\000\000\000RL\018\142\000\000\000\000\026\246e\170\019(\000\000\000\000\000\000\b\152\006\240gR\0198\000\000\000\000\000\000\000\000\000\000\000\000\018\190\000\000\029\240\000\000\018\196\000\000mD\000\000\b\130\000\000\000\000\018\198\000\000\000\000\003\150\000\000\000\146\000\000\000\000\000\000\015\222\000\000\015\164\000\000\018\200\000\000Z\144\025N\000\000\000\000\007\146\018\202\000\000\000\000\018\204\b\144I\n\001\250\138\128\000\000\000\000\000\000\000\000\000\000c\162\000\000\000\000\019\128\000\000RH\000\000\016j\019\134\000\000\019\140\000\000I\196I\196\150\240\150\240\000\000\000\000{z\150\240\000\000\000\000\000\000{z\150\240\019\012\000\000\019\028\000\000"), (16, "\t\157\t\157\000\006\t\157\0052\t\157\002\202\002\206\t\157\002\250\002\138\t\157\004\137\t\157\004\137\003\006\t\157\006\245\t\157\t\157\t\157\004\137\t\157\t\157\t\157\001\218\000\246\003\150\003\154\003\n\t\157\003N\003R\n\162\t\157\007i\t\157\006\245\003V\001n\003\141\003\014\018\138\t\157\t\157\003\230\003\234\t\157\003\238\003B\003\250\003\254\004\006\007F\007i\t\157\t\157\002\194\007i\004\137\003J\t\157\t\157\t\157\b\138\b\142\b\154\b\174\004\137\005\214\t\157\t\157\t\157\t\157\t\157\t\157\t\157\t\157\t\157\t\"\000\246\t\157\001n\t\157\t\157\003\141\003n\t.\tF\t\170\005\226\005\230\t\157\t\157\t\157\nn\t\157\t\157\t\157\t\157\0056\0012\014\254\t\157\004b\t\157\t\157\003r\t\157\t\157\t\157\t\157\t\157\t\157\005\234\b\162\t\157\t\157\t\157\b\186\004\134\t\190\004V\t\157\t\157\t\157\t\157\r\201\r\201\005\198\r\201\001r\r\201\004V\r\201\r\201\023z\r\201\r\201\r\201\r\201\011R\r\201\r\201\007\001\r\201\r\201\r\201\tu\r\201\r\201\r\201\r\201\te\r\201\006\186\r\201\r\201\r\201\r\201\r\201\r\201\r\201\r\201\007\001\b.\007\142\016\142\r\201\029\147\r\201\r\201\r\201\r\201\r\201\004f\r\201\006\190\r\201\001\221\r\201\004\002\r\201\r\201\r\201\b2\004f\r\201\r\201\r\201\r\201\r\201\r\201\r\201\000\246\r\201\r\201\r\201\r\201\r\201\r\201\r\201\r\201\r\201\r\201\r\201\007\214\r\201\r\201\007\250\r\201\r\201\001z\003z\007\222\te\r\201\r\201\r\201\r\201\r\201\r\201\007\226\r\201\r\201\r\201\r\201\r\201\000\246\r\201\r\201\tu\r\201\r\201\003~\r\201\r\201\r\201\r\201\r\201\r\201\r\201\r\201\r\201\r\201\r\201\r\201\r\201\001\138\te\r\201\r\201\r\201\r\201\001\221\001\221\001\221\001\221\001\221\001\221\001\226\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\016Z\001\221\001\154\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\bj\007\142\001\n\001\221\001\198\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\230\001\221\003\162\001\221\006]\001\221\001\221\001\221\bn\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\006\193\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\002n\001\221\001\221\007\250\001\221\001\221\t\150\007\142\006\193\tV\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\000\246\b\210\001\221\006\026\001\221\001\221\b]\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001~\001\221\001\221\001\221\001\221\001\221\n\209\n\209\007\250\n\209\tZ\n\209\t\134\n\209\n\209\006]\n\209\n\209\n\209\n\209\001\206\n\209\n\209\003\166\n\209\n\209\n\209\000\246\n\209\n\209\n\209\n\209\001\242\n\209\r\141\n\209\n\209\n\209\n\209\n\209\n\209\n\209\n\209\006\166\026\150\007\142\002r\n\209\004V\n\209\n\209\n\209\n\209\n\209\r\141\n\209\001n\n\209\016\242\n\209\003\141\n\209\n\209\n\209\026\154\001\190\n\209\n\209\n\209\n\209\n\209\n\209\n\209\006\201\n\209\n\209\n\209\n\209\n\209\n\209\n\209\n\209\n\209\n\209\n\209\001\194\n\209\n\209\007\250\n\209\n\209\001\214\001\n\006\201\001\198\n\209\n\209\n\209\n\209\n\209\n\209\004r\n\209\n\209\n\209\n\209\t\214\000\246\n6\n\209\001\214\n\209\n\209\001\246\n\209\n\209\n\209\n\209\n\209\n\209\n\209\n\209\n\209\n\209\n\209\n\209\n\209\001\142\n\209\n\209\n\209\n\209\n\209\003\213\003\213\002~\003\213\007\n\003\213\007.\003\213\003\213\t5\003\213\003\213\003\213\003\213\002.\003\213\003\213\004\"\003\213\003\213\003\213\002\230\003\213\003\213\003\213\003\213\002\242\003\213\r\145\003\213\003\213\003\213\003\213\003\213\003\213\003\213\003\213\001j\005\178\007\142\004&\003\213\004\161\003\213\003\213\003\213\003\213\003\213\r\145\003\213\000\246\003\213\001\130\003\213\001\146\003\213\003\213\003\213\b:\002V\003\213\003\213\003\213\003\213\003\213\003\213\003\213\006\209\003\213\003\213\003\213\003\213\003\213\003\213\003\213\003\213\003\213\003\213\003\213\002Z\t\206\n.\007\250\003\213\003\213\002\206\015B\006\209\004\161\003\213\003\213\003\213\003\213\003\213\003\213\t5\003\213\003\213\003\213\003\213\t\214\000\246\n6\003\213\012\218\003\213\003\213\007q\003\213\003\213\003\213\003\213\003\213\003\213\003\213\003\213\003\213\003\213\003\213\003\213\003\213\001\158\003\213\003\213\003\213\003\213\003\213\003\197\003\197\003\026\003\197\015J\003\197\003&\003\197\003\197\004\134\003\197\003\197\003\197\003\197\002:\003\197\003\197\004\137\003\197\003\197\003\197\020N\003\197\003\197\003\197\003\197\001\n\003\197\001\198\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\005\134\bN\007\142\004\137\003\197\003\"\003\197\003\197\003\197\003\197\003\197\020~\003\197\003*\003\197\000\246\003\197\007B\003\197\003\197\003\197\t\002\005\166\003\197\003\197\003\197\003\197\003\197\003\197\003\197\b\134\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\174\t\206\n.\007\250\003\197\003\197\004\137\020\134\004\137\004\137\003\197\003\197\003\197\003\197\003\197\003\197\006E\003\197\003\197\003\197\003\197\t\214\000\246\n6\003\197\004\137\003\197\003\197\002r\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\005\170\003\197\003\197\003\197\003\197\003\197\nM\nM\004\137\nM\003\178\nM\ta\nM\nM\t1\nM\nM\nM\nM\000\246\nM\nM\000\246\nM\nM\nM\000\246\nM\nM\nM\nM\004\137\nM\0056\nM\nM\nM\nM\nM\nM\nM\nM\017:\nB\017>\005\150\nM\004\137\nM\nM\nM\nM\nM\0065\nM\000\246\nM\004Z\nM\r\146\nM\nM\nM\nF\001\214\nM\nM\nM\nM\nM\nM\nM\000\246\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\014\150\nM\nM\017B\nM\nM\007\014\007\018\001\214\004\137\nM\nM\nM\nM\nM\nM\t1\nM\nM\nM\nM\nM\025V\nM\nM\004j\nM\nM\000\246\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\025Z\004\137\nM\nM\nM\nM\nE\nE\005R\nE\002\158\nE\b\014\nE\nE\0056\nE\nE\nE\nE\t\242\nE\nE\t\254\nE\nE\nE\004v\nE\nE\nE\nE\0172\nE\006\250\nE\nE\nE\nE\nE\nE\nE\nE\000\246\004\137\007Y\014\154\nE\004\137\nE\nE\nE\nE\nE\029.\nE\001\230\nE\003Y\nE\r\170\nE\nE\nE\007Y\005\158\nE\nE\nE\nE\nE\nE\nE\003Y\nE\nE\nE\nE\nE\nE\nE\nE\nE\nE\nE\007\158\nE\nE\000\246\nE\nE\004\238\025^\002\206\004V\nE\nE\nE\nE\nE\nE\007\166\nE\nE\nE\nE\nE\017\154\nE\nE\005\006\nE\nE\bN\nE\nE\nE\nE\nE\nE\nE\nE\nE\nE\nE\nE\nE\000\246\007Y\nE\nE\nE\nE\nU\nU\001\n\nU\001\198\nU\b\150\nU\nU\016\202\nU\nU\nU\nU\b\n\nU\nU\006\254\nU\nU\nU\007\130\nU\nU\nU\nU\007b\nU\0056\nU\nU\nU\nU\nU\nU\nU\nU\003\150\019\154\007\142\0076\nU\017\242\nU\nU\nU\nU\nU\023\174\nU\007\146\nU\019\174\nU\r\190\nU\nU\nU\018&\005b\nU\nU\nU\nU\nU\nU\nU\005\142\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\003\185\nU\nU\007\250\nU\nU\007\206\023\182\003&\006z\nU\nU\nU\nU\nU\nU\006-\nU\nU\nU\nU\nU\000\246\nU\nU\001\214\nU\nU\007\"\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\r>\000\246\nU\nU\nU\nU\n5\n5\001\n\n5\001\198\n5\004V\n5\n5\000\246\n5\n5\n5\n5\rB\n5\n5\000\246\n5\n5\n5\027\134\n5\n5\n5\n5\003\185\n5\011\242\n5\n5\n5\n5\n5\n5\n5\n5\007:\007\018\007\142\007\194\n5\029s\n5\n5\n5\n5\n5\t\030\n5\t\234\n5\n\026\n5\r\222\n5\n5\n5\018B\029*\n5\n5\n5\n5\n5\n5\n5\r\138\n5\n5\n5\n5\n5\n5\n5\n5\n5\n5\n5\004I\n5\n5\007\250\n5\n5\r\022\r2\r\142\003\"\n5\n5\n5\n5\n5\n5\007*\n5\n5\n5\n5\n5\000\246\n5\n5\011\250\n5\n5\r\026\n5\n5\n5\n5\n5\n5\n5\n5\n5\n5\n5\n5\n5\nB\000\246\n5\n5\n5\n5\n=\n=\003\r\n=\014\018\n=\003\"\n=\n=\026\238\n=\n=\n=\n=\r\218\n=\n=\000\246\n=\n=\n=\007n\n=\n=\n=\n=\004I\n=\000\n\n=\n=\n=\n=\n=\n=\n=\n=\bB\bN\tv\002\150\n=\007b\n=\n=\n=\n=\n=\012\002\n=\t\130\n=\000\246\n=\r\242\n=\n=\n=\003\r\011\170\n=\n=\n=\n=\n=\n=\n=\r>\n=\n=\n=\n=\n=\n=\n=\n=\n=\n=\n=\011\174\n=\n=\ty\n=\n=\rZ\016\022\014\030\011\242\n=\n=\n=\n=\n=\n=\t\162\n=\n=\n=\n=\n=\026\242\n=\n=\b\146\n=\n=\r^\n=\n=\n=\n=\n=\n=\n=\n=\n=\n=\n=\n=\n=\r\138\000\246\n=\n=\n=\n=\nu\nu\t\238\nu\017\"\nu\b\146\nu\nu\016\150\nu\nu\nu\nu\014v\nu\nu\000\246\nu\nu\nu\000\246\nu\nu\nu\nu\012f\nu\r\162\nu\nu\nu\nu\nu\nu\nu\nu\012r\ty\007\142\n\022\nu\016\026\nu\nu\nu\nu\nu\012z\nu\r\166\nu\012\158\nu\014\006\nu\nu\nu\026\254\007b\nu\nu\nu\nu\nu\nu\nu\015^\nu\nu\nu\nu\nu\nu\nu\nu\nu\nu\nu\021\006\nu\nu\007\250\nu\nu\r\022\016\158\015b\002\150\nu\nu\nu\nu\nu\nu\n\"\nu\nu\nu\nu\nu\000\246\nu\nu\016\226\nu\nu\r\238\nu\nu\nu\nu\nu\nu\nu\nu\nu\nu\nu\nu\nu\rj\016\234\nu\nu\nu\nu\ne\ne\024\230\ne\rZ\ne\r\162\ne\ne\000\246\ne\ne\ne\ne\rj\ne\ne\rn\ne\ne\ne\025\002\ne\ne\ne\ne\0142\ne\014\130\ne\ne\ne\ne\ne\ne\ne\ne\014F\021\014\007\142\019\014\ne\016\162\ne\ne\ne\ne\ne\015r\ne\020\130\ne\011\138\ne\014\"\ne\ne\ne\028\202\006M\ne\ne\ne\ne\ne\ne\ne\011R\ne\ne\ne\ne\ne\ne\ne\ne\ne\ne\ne\019\162\ne\ne\007\250\ne\ne\015\222\001\214\003&\021\014\ne\ne\ne\ne\ne\ne\n2\ne\ne\ne\ne\ne\000\246\ne\ne\007b\ne\ne\015\226\ne\ne\ne\ne\ne\ne\ne\ne\ne\ne\ne\ne\ne\016N\bN\ne\ne\ne\ne\n]\n]\019B\n]\016r\n]\016\170\n]\n]\000\246\n]\n]\n]\n]\011n\n]\n]\016R\n]\n]\n]\027\234\n]\n]\n]\n]\020\250\n]\016\174\n]\n]\n]\n]\n]\n]\n]\n]\015v\003\150\003\154\019\242\n]\011\142\n]\n]\n]\n]\n]\020\138\n]\007\222\n]\007f\n]\0146\n]\n]\n]\b\246\007b\n]\n]\n]\n]\n]\n]\n]\023\142\n]\n]\n]\n]\n]\n]\n]\n]\n]\n]\n]\011\242\n]\n]\t\242\n]\n]\t\254\0051\025f\020n\n]\n]\n]\n]\n]\n]\006I\n]\n]\n]\n]\n]\016v\n]\n]\019\230\n]\n]\025j\n]\n]\n]\n]\n]\n]\n]\n]\n]\n]\n]\n]\n]\016~\019\242\n]\n]\n]\n]\nm\nm\017f\nm\000\246\nm\003\161\nm\nm\011\194\nm\nm\nm\nm\001\214\nm\nm\016\130\nm\nm\nm\000\246\nm\nm\nm\nm\003)\nm\017V\nm\nm\nm\nm\nm\nm\nm\nm\011\230\012\014\020F\020\182\nm\012*\nm\nm\nm\nm\nm\028\026\nm\023\130\nm\021N\nm\014J\nm\nm\nm\002\158\006-\nm\nm\nm\nm\nm\nm\nm\023\214\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\tI\nm\nm\t\242\nm\nm\t\254\023\178\b\141\028\030\nm\nm\nm\nm\nm\nm\r\245\nm\nm\nm\nm\nm\011\242\nm\nm\012:\nm\nm\0212\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\0286\000\246\nm\nm\nm\nm\n\189\n\189\012^\n\189\007\222\n\189\012\134\n\189\n\189\028*\n\189\n\189\n\189\n\189\r\186\n\189\n\189\026\202\n\189\n\189\n\189\000\246\n\189\n\189\n\189\n\189\024\022\n\189\014\142\n\189\n\189\n\189\n\189\n\189\n\189\n\189\n\189\000\246\023\186\021b\tI\n\189\001\214\n\189\n\189\n\189\n\189\n\189\024F\n\189\020\202\n\189\024v\n\189\014V\n\189\n\189\n\189\025\166\014\166\n\189\n\189\n\189\n\189\n\189\n\189\n\189\014\174\n\189\n\189\n\189\n\189\n\189\n\189\n\189\n\189\n\189\n\189\n\189\014\194\n\189\n\189\028:\n\189\n\189\0061\028\146\014\242\026\134\n\189\n\189\n\189\n\189\n\189\n\189\b\133\n\189\n\189\n\189\n\189\n\189\015\030\n\189\n\189\002\014\n\189\n\189\024\218\n\189\n\189\n\189\n\189\n\189\n\189\n\189\n\189\n\189\n\189\n\189\n\189\n\189\020\174\003&\n\189\n\189\n\189\n\189\003\193\003\193\025:\003\193\007\222\003\193\026\206\003\193\003\193\021f\003\193\003\193\003\193\003\193\016\254\003\193\003\193\b\145\003\193\003\193\003\193\001\230\003\193\003\193\003\193\003\193\007\222\003\193\025\170\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\006\030\017&\026\186\004\018\003\193\026\174\003\193\003\193\003\193\003\193\003\193\004\n\003\193\017J\003\193\006\174\003\193\004\022\003\193\003\193\003\193\026\138\023\246\003\193\003\193\003\193\003\193\003\193\003\193\003\193\017N\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\017v\t\206\n.\b\129\003\193\003\193\000\246\017\138\004\161\028\190\003\193\003\193\003\193\003\193\003\193\003\193\029\163\003\193\003\193\003\193\003\193\t\214\007\222\n6\003\193\017\162\003\193\003\193\017\182\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\024>\003\193\003\193\003\193\003\193\003\193\002\021\002\021\017\226\002\021\002\242\002\021\017\238\002\206\002\021\026\190\002\138\002\021\t\230\002\021\018\006\003\006\002\021\014\001\002\021\002\021\002\021\019\006\002\021\002\021\002\021\001\218\019\018\n\030\006v\003\n\002\021\002\021\002\021\002\021\002\021\n&\002\021\t\218\019\182\019\206\020V\003\014\020Z\002\021\002\021\002\021\002\021\002\021\020\146\003B\020\150\001\198\014z\002\021\014\134\002\021\002\021\002\194\028\194\020\190\003J\002\021\002\021\002\021\b\138\b\142\b\154\020\194\rv\005\214\002\021\002\021\002\021\002\021\002\021\002\021\002\021\002\021\002\021\020\234\t\206\n.\021\150\002\021\002\021\021\154\021\190\021\194\021\210\002\021\005\226\005\230\002\021\002\021\002\021\021\226\002\021\002\021\002\021\002\021\r~\021\238\r\206\002\021\022\"\002\021\002\021\022&\002\021\002\021\002\021\002\021\002\021\002\021\005\234\b\162\002\021\002\021\002\021\b\186\004\134\022r\002\206\002\021\002\021\002\021\002\021\n\165\n\165\022\154\n\165\022\158\n\165\022\174\002\206\n\165\022\254\002\138\n\165\n\165\n\165\023\030\003\006\n\165\023^\n\165\n\165\n\165\023\138\n\165\n\165\n\165\001\218\023\154\n\165\023\194\003\n\n\165\n\165\n\165\n\165\n\165\n\165\n\165\n:\023\198\003\026\023\210\003\014\023\226\n\165\n\165\n\165\n\165\n\165\023\254\003B\024\014\001\198\r\014\n\165\r\030\n\165\n\165\002\194\024\"\024N\003J\n\165\n\165\n\165\b\138\b\142\b\154\024R\n\165\005\214\n\165\n\165\n\165\n\165\n\165\n\165\n\165\n\165\n\165\024^\n\165\n\165\024n\n\165\n\165\024\130\025v\025\206\025\246\n\165\005\226\005\230\n\165\n\165\n\165\026^\n\165\n\165\n\165\n\165\n\165\026n\n\165\n\165\027\018\n\165\n\165\027\026\n\165\n\165\n\165\n\165\n\165\n\165\005\234\b\162\n\165\n\165\n\165\b\186\004\134\027*\002\206\n\165\n\165\n\165\n\165\n\161\n\161\0276\n\161\027\154\n\161\027\174\002\206\n\161\027\182\002\138\n\161\n\161\n\161\027\206\003\006\n\161\028\014\n\161\n\161\n\161\004\162\n\161\n\161\n\161\001\218\028J\n\161\028r\003\n\n\161\n\161\n\161\n\161\n\161\n\161\n\161\r\210\028\170\003\026\028\218\003\014\028\230\n\161\n\161\n\161\n\161\n\161\028\238\003B\028\247\001\198\r\230\n\161\r\250\n\161\n\161\002\194\029\007\029\026\003J\n\161\n\161\n\161\b\138\b\142\b\154\0296\n\161\005\214\n\161\n\161\n\161\n\161\n\161\n\161\n\161\n\161\n\161\tM\n\161\n\161\029S\n\161\n\161\029c\029\127\029\179\029\207\n\161\005\226\005\230\n\161\n\161\n\161\029\218\n\161\n\161\n\161\n\161\n\161\030\015\n\161\n\161\030#\n\161\n\161\030+\n\161\n\161\n\161\n\161\n\161\n\161\005\234\b\162\n\161\n\161\n\161\b\186\004\134\030g\000\246\n\161\n\161\n\161\n\161\002a\002a\030o\002a\000\000\002a\000\000\002\206\002a\000\000\002\138\002a\t\230\002a\000\000\003\006\002a\000\000\002a\002a\002a\000\000\002a\002a\002a\001\218\003\r\n\030\000\000\003\n\002a\002a\002a\002a\002a\n&\002a\000\000\000\000\000\000\tM\003\014\000\000\002a\002a\002a\002a\002a\000\000\003B\000\000\001\198\000\n\002a\000\000\002a\002a\002\194\000\000\000\000\003J\002a\002a\002a\b\138\b\142\b\154\000\000\rv\005\214\002a\002a\002a\002a\002a\002a\002a\002a\002a\000\000\004\137\002a\003\r\002a\002a\004\137\004\137\004\137\000\000\002a\005\226\005\230\002a\002a\002a\005B\002a\002a\002a\002a\000\000\004\137\000\000\002a\004\137\002a\002a\004\137\002a\002a\002a\002a\002a\002a\005\234\b\162\002a\002a\002a\b\186\004\134\000\246\004\137\002a\002a\002a\002a\004\137\000\000\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\019j\004\137\015\134\004\137\004\137\000\246\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\000\000\004\137\004\137\000\246\004\137\004\137\004\137\000\246\004\137\004\137\004\137\004\137\004\137\004\137\000\246\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\000\246\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\000\246\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\001\214\000\000\004\137\000\000\000\000\004\137\004\137\004\137\000\246\004\137\000\n\000\000\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\004\137\000\000\000\246\004\137\004\137\003\r\015~\003\r\004\137\000\000\003\181\000\246\004\137\004\137\000\000\b\025\014\206\023\238\000\000\003\r\004\137\004\137\004\137\002\158\000\000\004\137\004\137\004\137\004\137\027\006\000\161\004\137\000\161\015\150\000\161\000\161\000\161\000\161\000\161\000\161\000\161\015\154\000\161\024\162\000\161\000\161\b\025\000\161\000\161\027\n\000\000\000\161\000\161\004\194\000\161\000\161\000\161\000\161\020\238\000\161\b\025\000\161\000\161\b\025\t\022\000\161\000\161\024\206\000\161\000\161\b\025\000\161\000\000\000\161\b\025\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\003\181\000\000\000\161\000\161\r\149\000\000\000\161\000\161\000\000\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\007\022\000\000\000\161\000\000\0012\000\161\r\149\000\161\rQ\000\161\003\r\003\r\002J\000\000\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\000\000\000\000\000\000\161\002N\rQ\rQ\000\000\000\230\rQ\000\000\003\r\000\161\000\000\t\242\000\n\000\000\t\254\000\161\000\161\000\161\000\161\000\000\000\000\000\161\000\161\000\161\000\161\002Q\002Q\000\000\002Q\000\000\002Q\000\000\002\206\002Q\000\n\002\138\002Q\000\000\002Q\000\000\003\006\002Q\003\r\002Q\002Q\002Q\000\246\002Q\002Q\002Q\001\218\000\000\003\r\000\000\003\n\002Q\002Q\002Q\002Q\002Q\015\242\002Q\000\000\000\000\003\r\000\000\003\014\000\000\002Q\002Q\002Q\002Q\002Q\000\000\003B\000\000\b\158\rQ\002Q\016\002\002Q\002Q\002\194\000\000\000\000\003J\002Q\002Q\002Q\b\138\b\142\b\154\n\n\000\000\005\214\002Q\002Q\002Q\002Q\002Q\002Q\002Q\002Q\002Q\000\000\t\206\n.\020>\002Q\002Q\000\000\000\000\000\000\000\000\002Q\005\226\005\230\002Q\002Q\002Q\003&\002Q\002Q\002Q\002Q\t\214\000\000\n6\002Q\000\000\002Q\002Q\000\000\002Q\002Q\002Q\002Q\002Q\002Q\005\234\b\162\002Q\002Q\002Q\b\186\004\134\015\234\000\000\002Q\002Q\002Q\002Q\002m\002m\r\237\002m\005\233\002m\000\000\000\000\002m\0119\b\214\002m\001\198\002m\000\000\r\237\002m\000\000\002m\002m\002m\015f\002m\002m\002m\015\210\016\014\016\030\t\145\015\154\002m\002m\002m\002m\002m\002\206\002m\000\000\000\000\000\000\0119\000\000\000\000\002m\002m\002m\002m\002m\000\000\005\233\000\000\t\145\000\000\002m\0119\002m\002m\0119\012\150\000\000\tB\002m\002m\002m\0119\019\158\bZ\005\233\0119\000\000\002m\002m\002m\002m\002m\002m\002m\002m\002m\003\026\t\206\n.\000\000\002m\002m\000\000\b^\000\000\000\000\002m\t1\000\000\002m\002m\002m\003&\002m\002m\002m\002m\t\214\014\250\n6\002m\r6\002m\002m\000\000\002m\002m\002m\002m\002m\002m\016&\bN\002m\002m\002m\rR\000\246\rb\000\000\002m\002m\002m\002m\002i\002i\000\246\002i\000\246\002i\000\000\000\000\002i\000\000\b\214\002i\016^\002i\000\000\000\000\002i\000\000\002i\002i\002i\015f\002i\002i\002i\015\210\016\014\016\030\000\000\000\000\002i\002i\002i\002i\002i\007Y\002i\000\000\006\138\000\000\000\000\006J\000\000\002i\002i\002i\002i\002i\006\150\t1\000\000\bb\006\162\002i\007Y\002i\002i\000\000\007Y\te\018\210\002i\002i\002i\026\162\000\000\t\206\n.\004\241\000\000\002i\002i\002i\002i\002i\002i\002i\002i\002i\ba\t\206\n.\000\000\002i\002i\000\000\t\214\006\222\n6\002i\000\000\004\241\002i\002i\002i\000\000\002i\002i\002i\002i\t\214\000\000\n6\002i\r\130\002i\002i\000\246\002i\002i\002i\002i\002i\002i\003\173\000\000\002i\002i\002i\r\154\000\246\r\178\014\022\002i\002i\002i\002i\002U\002U\b\150\002U\017:\002U\017>\000\000\002U\000\246\014*\002U\014>\002U\005Y\0065\002U\000\000\002U\002U\002U\000\000\002U\002U\002U\006\138\005Y\000\000\006J\026\166\002U\002U\002U\002U\002U\006\150\002U\000\000\006\138\006\162\t\186\006J\029\191\002U\002U\002U\002U\002U\006\150\017B\000\000\000\000\006\162\002U\006\138\002U\002U\006J\005Y\000\000\000\000\002U\002U\002U\006\150\000\000\000\000\007A\006\162\000\000\002U\002U\002U\002U\002U\002U\002U\002U\002U\000\000\t\206\n.\000\000\002U\002U\000\000\006\230\000\000\005Y\002U\007A\005Y\002U\002U\002U\000\000\002U\002U\002U\002U\t\214\000\000\n6\002U\000\000\002U\002U\003\r\002U\002U\002U\002U\002U\002U\t\141\020\170\002U\002U\002U\002\170\000\000\000\000\000\000\002U\002U\002U\002U\002e\002e\000\000\002e\024:\002e\016>\002\206\002e\000\n\t\141\002e\020\178\002e\003\186\000\000\002e\000\000\002e\002e\002e\000\000\002e\002e\002e\001\218\000\000\003\r\024B\000\000\002e\002e\002e\002e\002e\b\137\002e\000\000\002\014\003\r\003\r\002\138\000\000\002e\002e\002e\002e\002e\000\000\003\218\000\000\b\129\000\000\002e\000\000\002e\002e\002\194\000\000\000\000\000\000\002e\002e\002e\000\000\000\000\000\000\000\000\rY\000\000\002e\002e\002e\002e\002e\002e\002e\002e\002e\000\000\029\018\002e\001\230\002e\002e\000\000\007Z\rY\rY\002e\001\214\rY\002e\002e\002e\017*\002e\002e\002e\002e\000\000\000\000\027\254\002e\000\000\002e\002e\000\000\nN\002e\002e\002e\002e\002e\004\245\000\000\002e\002e\002e\000\000\006\226\002\206\005\230\002e\002e\002e\002e\t\153\t\153\000\000\t\153\000\246\t\153\rU\002\158\t\153\000\000\004\245\t\153\000\000\t\153\000\000\000\000\nz\000\000\t\153\n\158\t\153\000\000\t\153\t\153\t\153\rU\rU\000\000\000\000\rU\n\178\n\202\n\210\n\186\n\218\rY\t\153\004\194\003\026\000\000\0055\000\000\000\000\t\153\t\153\n\226\n\234\t\153\000\000\000\000\000\000\000\000\000\000\t\153\000\000\n\242\t\153\000\000\000\000\000\000\000\000\t\153\t\153\000\246\011\134\000\000\000\000\000\000\000\000\000\246\t\153\t\153\n\130\n\194\n\250\011\002\011\018\t\153\t\153\000\000\000\000\t\153\000\000\t\153\011\026\000\000\000\000\000\000\000\000\t\153\000\000\000\000\t\153\t\153\011\"\000\000\t\153\t\153\t\153\t\153\rU\000\000\000\000\t\153\000\000\t\153\t\153\000\246\011B\t\153\011J\011\n\t\153\t\153\000\000\000\000\t\153\011*\t\153\000\000\000\000\000\000\000\000\t\153\t\153\0112\011:\002\153\002\153\000\000\002\153\000\000\002\153\000\000\007\142\002\153\000\246\000\000\002\153\000\000\002\153\000\000\000\000\002\153\000\000\002\153\002\153\002\153\000\000\002\153\002\153\002\153\006\138\0186\000\000\006J\000\000\002\153\002\153\002\153\002\153\002\153\006\150\002\153\000\000\017\026\006\162\012\170\002\138\000\000\002\153\002\153\002\153\002\153\002\153\000\000\000\000\007\250\000\000\000\000\002\153\012\178\002\153\002\153\012\190\000\000\000\000\000\000\002\153\002\153\002\153\012\202\000\000\000\000\000\000\012\214\000\246\002\153\002\153\n\130\002\153\002\153\002\153\002\153\002\153\002\153\000\000\017\030\002\153\000\000\002\153\002\153\000\000\000\000\000\000\000\000\002\153\000\000\000\000\002\153\002\153\002\153\017*\002\153\002\153\002\153\002\153\000\000\000\000\000\000\002\153\000\000\002\153\002\153\000\000\002\153\002\153\002\153\002\153\002\153\002\153\000\000\018:\002\153\002\153\002\153\000\000\000\000\000\000\005\230\002\153\002\153\002\153\002\153\002\129\002\129\000\000\002\129\000\000\002\129\007U\000\000\002\129\000\246\000\000\002\129\000\000\002\129\000\000\000\000\002\129\000\000\002\129\002\129\002\129\000\000\002\129\002\129\002\129\007U\000\000\000\000\000\000\007U\002\129\002\129\002\129\002\129\002\129\000\000\002\129\000\000\002\206\000\000\b\017\002\138\000\000\002\129\002\129\002\129\002\129\002\129\000\000\000\000\000\000\000\000\000\000\002\129\b\017\002\129\002\129\006J\000\000\000\000\000\000\002\129\002\129\002\129\b\017\000\000\000\000\000\000\b\017\000\246\002\129\002\129\n\130\002\129\002\129\002\129\002\129\002\129\002\129\000\000\0196\002\129\000\000\002\129\002\129\000\000\000\000\000\000\000\000\002\129\000\000\000\000\002\129\002\129\002\129\017*\002\129\002\129\002\129\002\129\007U\000\000\000\000\002\129\000\000\002\129\002\129\000\000\002\129\002\129\002\129\002\129\002\129\002\129\000\000\000\000\002\129\002\129\002\129\000\000\000\000\000\000\005\230\002\129\002\129\002\129\002\129\002\141\002\141\000\000\002\141\000\000\002\141\000\000\000\000\002\141\b)\000\000\002\141\000\000\002\141\000\000\000\000\nz\000\000\002\141\002\141\002\141\000\000\002\141\002\141\002\141\000\000\000\000\000\000\000\000\000\000\002\141\002\141\002\141\n\186\002\141\000\000\002\141\000\000\000\000\000\000\b)\000\000\000\000\002\141\002\141\002\141\002\141\002\141\000\000\000\000\000\000\000\000\000\000\002\141\b)\002\141\002\141\006J\000\000\000\000\000\000\002\141\002\141\002\141\b)\000\000\000\000\000\000\b)\000\000\002\141\002\141\n\130\n\194\002\141\002\141\002\141\002\141\002\141\000\000\000\000\002\141\000\000\002\141\002\141\000\000\000\000\000\000\000\000\002\141\000\000\000\000\002\141\002\141\002\141\000\000\002\141\002\141\002\141\002\141\000\000\000\000\000\000\002\141\000\000\002\141\002\141\000\000\002\141\002\141\002\141\002\141\002\141\002\141\000\000\000\000\002\141\002\141\002\141\000\000\000\000\000\000\000\000\002\141\002\141\002\141\002\141\002\157\002\157\000\000\002\157\000\000\002\157\000\000\000\000\002\157\000\246\000\000\002\157\000\000\002\157\000\000\000\000\002\157\000\000\002\157\002\157\002\157\000\000\002\157\002\157\002\157\000\000\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\002\157\000\000\002\157\000\000\000\000\000\000\bE\000\000\000\000\002\157\002\157\002\157\002\157\002\157\000\000\000\000\000\000\000\000\000\000\002\157\006\138\002\157\002\157\006J\000\000\000\000\000\000\002\157\002\157\002\157\bE\000\000\000\000\000\000\bE\000\000\002\157\002\157\n\130\002\157\002\157\002\157\002\157\002\157\002\157\000\000\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\000\000\002\157\000\000\000\000\002\157\002\157\002\157\000\000\002\157\002\157\002\157\002\157\000\000\000\000\000\000\002\157\000\000\002\157\002\157\000\000\002\157\002\157\002\157\002\157\002\157\002\157\000\000\000\000\002\157\002\157\002\157\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\002}\002}\000\000\002}\000\000\002}\000\000\000\000\002}\b=\000\000\002}\000\000\002}\000\000\000\000\002}\000\000\002}\002}\002}\000\000\002}\002}\002}\000\000\000\000\000\000\000\000\000\000\002}\002}\002}\002}\002}\000\000\002}\000\000\000\000\000\000\b=\000\000\000\000\002}\002}\002}\002}\002}\000\000\000\000\000\000\000\000\000\000\002}\012\238\002}\002}\b=\000\000\000\000\000\000\002}\002}\002}\b=\000\000\000\000\000\000\b=\000\000\002}\002}\n\130\002}\002}\002}\002}\002}\002}\000\000\000\000\002}\000\000\002}\002}\000\000\000\000\000\000\000\000\002}\000\000\000\000\002}\002}\002}\000\000\002}\002}\002}\002}\000\000\000\000\000\000\002}\000\000\002}\002}\000\000\002}\002}\002}\002}\002}\002}\000\000\000\000\002}\002}\002}\000\000\000\000\000\000\000\000\002}\002}\002}\002}\002\137\002\137\000\000\002\137\000\000\002\137\000\000\000\000\002\137\000\246\000\000\002\137\000\000\002\137\000\000\000\000\nz\000\000\002\137\002\137\002\137\000\000\002\137\002\137\002\137\000\000\000\000\000\000\000\000\000\000\002\137\002\137\002\137\n\186\002\137\000\000\002\137\000\000\000\000\000\000\b\r\000\000\000\000\002\137\002\137\002\137\002\137\002\137\000\000\000\000\000\000\000\000\000\000\002\137\b\r\002\137\002\137\006J\000\000\000\000\000\000\002\137\002\137\002\137\b\r\000\000\000\000\000\000\b\r\000\000\002\137\002\137\n\130\n\194\002\137\002\137\002\137\002\137\002\137\000\000\000\000\002\137\000\000\002\137\002\137\000\000\000\000\000\000\000\000\002\137\000\000\000\000\002\137\002\137\002\137\000\000\002\137\002\137\002\137\002\137\000\000\000\000\000\000\002\137\000\000\002\137\002\137\000\000\002\137\002\137\002\137\002\137\002\137\002\137\000\000\000\000\002\137\002\137\002\137\000\000\000\000\000\000\000\000\002\137\002\137\002\137\002\137\002\133\002\133\000\000\002\133\000\000\002\133\000\000\000\000\002\133\000\246\000\000\002\133\000\000\002\133\000\000\000\000\nz\000\000\002\133\002\133\002\133\000\000\002\133\002\133\002\133\000\000\000\000\000\000\000\000\000\000\002\133\002\133\002\133\n\186\002\133\000\000\002\133\000\000\000\000\000\000\0156\000\000\000\000\002\133\002\133\002\133\002\133\002\133\000\000\000\000\000\000\000\000\000\000\002\133\012\178\002\133\002\133\012\190\000\000\000\000\000\000\002\133\002\133\002\133\012\202\000\000\000\000\000\000\012\214\000\000\002\133\002\133\n\130\n\194\002\133\002\133\002\133\002\133\002\133\000\000\000\000\002\133\000\000\002\133\002\133\000\000\000\000\000\000\000\000\002\133\000\000\000\000\002\133\002\133\002\133\000\000\002\133\002\133\002\133\002\133\000\000\000\000\000\000\002\133\000\000\002\133\002\133\000\000\002\133\002\133\002\133\002\133\002\133\002\133\000\000\000\000\002\133\002\133\002\133\000\000\000\000\000\000\000\000\002\133\002\133\002\133\002\133\002\173\002\173\000\000\002\173\000\000\002\173\000\000\000\000\002\173\000\000\000\000\002\173\000\000\002\173\000\000\000\000\nz\000\000\002\173\002\173\002\173\000\000\002\173\002\173\002\173\003\r\003\r\018b\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\173\000\000\000\000\000\000\003\r\000\000\000\000\002\173\002\173\n\226\n\234\002\173\000\000\000\000\000\000\000\000\000\n\002\173\000\000\n\242\002\173\000\000\000\000\000\000\000\000\002\173\002\173\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\173\002\173\n\130\n\194\n\250\011\002\011\018\002\173\002\173\000\000\000\000\002\173\003\r\002\173\011\026\000\000\000\000\000\000\000\000\002\173\000\000\000\000\002\173\002\173\011\"\000\000\002\173\002\173\002\173\002\173\000\000\000\000\000\000\002\173\000\000\002\173\002\173\000\000\002\173\002\173\002\173\011\n\002\173\002\173\000\000\000\000\002\173\011*\002\173\000\000\000\000\000\000\000\000\002\173\002\173\0112\011:\002\149\002\149\000\000\002\149\000\000\002\149\000\000\000\000\002\149\000\000\000\000\002\149\000\000\002\149\000\000\000\000\nz\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\n\186\002\149\000\000\002\149\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\n\130\n\194\002\149\002\149\002\149\002\149\002\149\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\002\149\000\000\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\002\149\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\002\149\002\149\002\149\002\149\002\149\002\149\000\000\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\002\145\002\145\000\000\002\145\000\000\002\145\000\000\000\000\002\145\000\000\000\000\002\145\000\000\002\145\000\000\000\000\nz\000\000\002\145\002\145\002\145\000\000\002\145\002\145\002\145\000\000\000\000\000\000\000\000\000\000\002\145\002\145\002\145\n\186\002\145\000\000\002\145\000\000\000\000\000\000\000\000\000\000\000\000\002\145\002\145\002\145\002\145\002\145\000\000\000\000\000\000\000\000\000\000\002\145\000\000\002\145\002\145\000\000\000\000\000\000\000\000\002\145\002\145\002\145\000\000\000\000\000\000\000\000\000\000\000\000\002\145\002\145\n\130\n\194\002\145\002\145\002\145\002\145\002\145\000\000\000\000\002\145\000\000\002\145\002\145\000\000\000\000\000\000\000\000\002\145\000\000\000\000\002\145\002\145\002\145\000\000\002\145\002\145\002\145\002\145\000\000\000\000\000\000\002\145\000\000\002\145\002\145\000\000\002\145\002\145\002\145\002\145\002\145\002\145\000\000\000\000\002\145\002\145\002\145\000\000\000\000\000\000\000\000\002\145\002\145\002\145\002\145\002\165\002\165\000\000\002\165\000\000\002\165\000\000\000\000\002\165\000\000\000\000\002\165\000\000\002\165\000\000\000\000\nz\000\000\002\165\002\165\002\165\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\002\165\000\000\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\165\n\226\n\234\002\165\000\000\000\000\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\002\165\002\165\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\165\n\130\n\194\n\250\011\002\002\165\002\165\002\165\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\002\165\000\000\000\000\002\165\002\165\002\165\000\000\002\165\002\165\002\165\002\165\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\002\165\002\165\002\165\011\n\002\165\002\165\000\000\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002y\002y\000\000\002y\000\000\002y\000\000\000\000\002y\000\000\000\000\002y\000\000\002y\000\000\000\000\nz\000\000\002y\002y\002y\000\000\002y\002y\002y\000\000\000\000\000\000\000\000\000\000\002y\002y\002y\n\186\002y\000\000\002y\000\000\000\000\000\000\000\000\000\000\000\000\002y\002y\002y\002y\002y\000\000\000\000\000\000\000\000\000\000\002y\000\000\002y\002y\000\000\000\000\000\000\000\000\002y\002y\002y\000\000\000\000\000\000\000\000\000\000\000\000\002y\002y\n\130\n\194\002y\002y\002y\002y\002y\000\000\000\000\002y\000\000\002y\002y\000\000\000\000\000\000\000\000\002y\000\000\000\000\002y\002y\002y\000\000\002y\002y\002y\002y\000\000\000\000\000\000\002y\000\000\002y\002y\000\000\002y\002y\002y\002y\002y\002y\000\000\000\000\002y\002y\002y\000\000\000\000\000\000\000\000\002y\002y\002y\002y\002u\002u\000\000\002u\000\000\002u\000\000\000\000\002u\000\000\000\000\002u\000\000\002u\000\000\000\000\nz\000\000\002u\002u\002u\000\000\002u\002u\002u\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\002u\000\000\002u\000\000\000\000\000\000\000\000\000\000\000\000\002u\002u\n\226\n\234\002u\000\000\000\000\000\000\000\000\000\000\002u\000\000\002u\002u\000\000\000\000\000\000\000\000\002u\002u\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002u\002u\n\130\n\194\n\250\011\002\002u\002u\002u\000\000\000\000\002u\000\000\002u\002u\000\000\000\000\000\000\000\000\002u\000\000\000\000\002u\002u\002u\000\000\002u\002u\002u\002u\000\000\000\000\000\000\002u\000\000\002u\002u\000\000\002u\002u\002u\011\n\002u\002u\000\000\000\000\002u\002u\002u\000\000\000\000\000\000\000\000\002u\002u\002u\002u\002\209\002\209\000\000\002\209\000\000\002\209\000\000\000\000\002\209\000\000\000\000\002\209\000\000\002\209\000\000\000\000\nz\000\000\002\209\002\209\002\209\000\000\002\209\002\209\002\209\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\002\209\000\000\002\209\000\000\000\000\000\000\000\000\000\000\000\000\002\209\002\209\n\226\n\234\002\209\000\000\000\000\000\000\000\000\000\000\002\209\000\000\002\209\002\209\000\000\000\000\000\000\000\000\002\209\002\209\002\209\000\000\000\000\000\000\000\000\000\000\000\000\002\209\002\209\n\130\n\194\n\250\002\209\002\209\002\209\002\209\000\000\000\000\002\209\000\000\002\209\002\209\000\000\000\000\000\000\000\000\002\209\000\000\000\000\002\209\002\209\002\209\000\000\002\209\002\209\002\209\002\209\000\000\000\000\000\000\002\209\000\000\002\209\002\209\000\000\002\209\002\209\002\209\011\n\002\209\002\209\000\000\000\000\002\209\002\209\002\209\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002q\002q\000\000\002q\000\000\002q\000\000\000\000\002q\000\000\000\000\002q\000\000\002q\000\000\000\000\nz\000\000\002q\002q\002q\000\000\002q\002q\002q\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\002q\000\000\002q\000\000\000\000\000\000\000\000\000\000\000\000\002q\002q\n\226\n\234\002q\000\000\000\000\000\000\000\000\000\000\002q\000\000\002q\002q\000\000\000\000\000\000\000\000\002q\002q\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002q\002q\n\130\n\194\n\250\011\002\002q\002q\002q\000\000\000\000\002q\000\000\002q\002q\000\000\000\000\000\000\000\000\002q\000\000\000\000\002q\002q\002q\000\000\002q\002q\002q\002q\000\000\000\000\000\000\002q\000\000\002q\002q\000\000\002q\002q\002q\011\n\002q\002q\000\000\000\000\002q\002q\002q\000\000\000\000\000\000\000\000\002q\002q\002q\002q\002\169\002\169\000\000\002\169\000\000\002\169\000\000\000\000\002\169\000\000\000\000\002\169\000\000\002\169\000\000\000\000\nz\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\002\169\000\000\002\169\000\000\000\000\000\000\000\000\000\000\000\000\002\169\002\169\n\226\n\234\002\169\000\000\000\000\000\000\000\000\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\002\169\002\169\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\169\002\169\n\130\n\194\n\250\011\002\002\169\002\169\002\169\000\000\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\002\169\000\000\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\002\169\000\000\000\000\000\000\002\169\000\000\002\169\002\169\000\000\002\169\002\169\002\169\011\n\002\169\002\169\000\000\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\161\002\161\000\000\002\161\000\000\002\161\000\000\000\000\002\161\000\000\000\000\002\161\000\000\002\161\000\000\000\000\nz\000\000\002\161\002\161\002\161\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\002\161\000\000\002\161\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\161\n\226\n\234\002\161\000\000\000\000\000\000\000\000\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\000\000\002\161\002\161\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\161\n\130\n\194\n\250\011\002\002\161\002\161\002\161\000\000\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\000\000\002\161\000\000\000\000\002\161\002\161\002\161\000\000\002\161\002\161\002\161\002\161\000\000\000\000\000\000\002\161\000\000\002\161\002\161\000\000\002\161\002\161\002\161\011\n\002\161\002\161\000\000\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\177\002\177\000\000\002\177\000\000\002\177\000\000\000\000\002\177\000\000\000\000\002\177\000\000\002\177\000\000\000\000\nz\000\000\002\177\002\177\002\177\000\000\002\177\002\177\002\177\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\177\000\000\000\000\000\000\000\000\000\000\000\000\002\177\002\177\n\226\n\234\002\177\000\000\000\000\000\000\000\000\000\000\002\177\000\000\n\242\002\177\000\000\000\000\000\000\000\000\002\177\002\177\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\177\002\177\n\130\n\194\n\250\011\002\011\018\002\177\002\177\000\000\000\000\002\177\000\000\002\177\011\026\000\000\000\000\000\000\000\000\002\177\000\000\000\000\002\177\002\177\011\"\000\000\002\177\002\177\002\177\002\177\000\000\000\000\000\000\002\177\000\000\002\177\002\177\000\000\002\177\002\177\002\177\011\n\002\177\002\177\000\000\000\000\002\177\011*\002\177\000\000\000\000\000\000\000\000\002\177\002\177\0112\011:\002\181\002\181\000\000\002\181\000\000\002\181\000\000\000\000\002\181\000\000\000\000\002\181\000\000\002\181\000\000\000\000\nz\000\000\002\181\002\181\002\181\000\000\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\002\181\000\000\002\181\000\000\000\000\000\000\000\000\000\000\000\000\002\181\002\181\n\226\n\234\002\181\000\000\000\000\000\000\000\000\000\000\002\181\000\000\n\242\002\181\000\000\000\000\000\000\000\000\002\181\002\181\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\181\002\181\n\130\n\194\n\250\011\002\011\018\002\181\002\181\000\000\000\000\002\181\000\000\002\181\011\026\000\000\000\000\000\000\000\000\002\181\000\000\000\000\002\181\002\181\011\"\000\000\002\181\002\181\002\181\002\181\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\002\181\002\181\002\181\011\n\002\181\002\181\000\000\000\000\002\181\002\181\002\181\000\000\000\000\000\000\000\000\002\181\002\181\0112\011:\002\185\002\185\000\000\002\185\000\000\002\185\000\000\000\000\002\185\000\000\000\000\002\185\000\000\002\185\000\000\000\000\nz\000\000\002\185\002\185\002\185\000\000\002\185\002\185\002\185\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\002\185\000\000\002\185\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\185\n\226\n\234\002\185\000\000\000\000\000\000\000\000\000\000\002\185\000\000\n\242\002\185\000\000\000\000\000\000\000\000\002\185\002\185\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\185\n\130\n\194\n\250\011\002\011\018\002\185\002\185\000\000\000\000\002\185\000\000\002\185\011\026\000\000\000\000\000\000\000\000\002\185\000\000\000\000\002\185\002\185\011\"\000\000\002\185\002\185\002\185\002\185\000\000\000\000\000\000\002\185\000\000\002\185\002\185\000\000\002\185\002\185\002\185\011\n\002\185\002\185\000\000\000\000\002\185\002\185\002\185\000\000\000\000\000\000\000\000\002\185\002\185\0112\011:\tU\tU\000\000\tU\000\000\tU\000\000\000\000\tU\000\000\000\000\tU\000\000\tU\000\000\000\000\nz\000\000\tU\tU\tU\000\000\tU\tU\tU\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\tU\000\000\000\000\000\000\000\000\000\000\000\000\tU\tU\n\226\n\234\tU\000\000\000\000\000\000\000\000\000\000\tU\000\000\n\242\tU\000\000\000\000\000\000\000\000\tU\tU\000\246\000\000\000\000\000\000\000\000\000\000\000\000\tU\tU\n\130\n\194\n\250\011\002\011\018\tU\tU\000\000\000\000\tU\000\000\tU\011\026\000\000\000\000\000\000\000\000\tU\000\000\000\000\tU\tU\011\"\000\000\tU\tU\tU\tU\000\000\000\000\000\000\tU\000\000\tU\tU\000\000\tU\tU\tU\011\n\tU\tU\000\000\000\000\tU\011*\tU\000\000\000\000\000\000\000\000\tU\tU\0112\011:\002\189\002\189\000\000\002\189\000\000\002\189\000\000\000\000\002\189\000\000\000\000\002\189\000\000\002\189\000\000\000\000\nz\000\000\002\189\002\189\002\189\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\189\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\n\226\n\234\002\189\000\000\000\000\000\000\000\000\000\000\002\189\000\000\n\242\002\189\000\000\000\000\000\000\000\000\002\189\002\189\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\n\130\n\194\n\250\011\002\011\018\002\189\002\189\000\000\000\000\002\189\000\000\002\189\011\026\000\000\000\000\000\000\000\000\002\189\000\000\000\000\002\189\002\189\011\"\000\000\002\189\002\189\002\189\002\189\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\011B\002\189\011J\011\n\002\189\002\189\000\000\000\000\002\189\011*\002\189\000\000\000\000\000\000\000\000\002\189\002\189\0112\011:\tQ\tQ\000\000\tQ\000\000\tQ\000\000\000\000\tQ\000\000\000\000\tQ\000\000\tQ\000\000\000\000\nz\000\000\tQ\tQ\tQ\000\000\tQ\tQ\tQ\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\tQ\000\000\000\000\000\000\000\000\000\000\000\000\tQ\tQ\n\226\n\234\tQ\000\000\000\000\000\000\000\000\000\000\tQ\000\000\n\242\tQ\000\000\000\000\000\000\000\000\tQ\tQ\000\246\000\000\000\000\000\000\000\000\000\000\000\000\tQ\tQ\n\130\n\194\n\250\011\002\011\018\tQ\tQ\000\000\000\000\tQ\000\000\tQ\011\026\000\000\000\000\000\000\000\000\tQ\000\000\000\000\tQ\tQ\011\"\000\000\tQ\tQ\tQ\tQ\000\000\000\000\000\000\tQ\000\000\tQ\tQ\000\000\tQ\tQ\tQ\011\n\tQ\tQ\000\000\000\000\tQ\011*\tQ\000\000\000\000\000\000\000\000\tQ\tQ\0112\011:\002\237\002\237\000\000\002\237\000\000\002\237\000\000\000\000\002\237\000\000\000\000\002\237\000\000\002\237\000\000\000\000\nz\000\000\002\237\002\237\002\237\000\000\002\237\002\237\002\237\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\237\000\000\000\000\000\000\000\000\000\000\000\000\002\237\002\237\n\226\n\234\002\237\000\000\000\000\000\000\000\000\000\000\002\237\000\000\n\242\002\237\000\000\000\000\000\000\000\000\002\237\002\237\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\237\002\237\n\130\n\194\n\250\011\002\011\018\002\237\002\237\000\000\000\000\002\237\000\000\002\237\011\026\000\000\000\000\000\000\000\000\002\237\000\000\000\000\002\237\002\237\011\"\000\000\002\237\002\237\002\237\002\237\000\000\000\000\000\000\002\237\000\000\002\237\002\237\000\000\011B\002\237\011J\011\n\002\237\002\237\000\000\000\000\002\237\011*\002\237\000\000\000\000\000\000\000\000\002\237\002\237\0112\011:\002\233\002\233\000\000\002\233\000\000\002\233\000\000\000\000\002\233\000\000\000\000\002\233\000\000\002\233\000\000\000\000\nz\000\000\002\233\002\233\002\233\000\000\002\233\002\233\002\233\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\233\000\000\000\000\000\000\000\000\000\000\000\000\002\233\002\233\n\226\n\234\002\233\000\000\000\000\000\000\000\000\000\000\002\233\000\000\n\242\002\233\000\000\000\000\000\000\000\000\002\233\002\233\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\233\002\233\n\130\n\194\n\250\011\002\011\018\002\233\002\233\000\000\000\000\002\233\000\000\002\233\011\026\000\000\000\000\000\000\000\000\002\233\000\000\000\000\002\233\002\233\011\"\000\000\002\233\002\233\002\233\002\233\000\000\000\000\000\000\002\233\000\000\002\233\002\233\000\000\011B\002\233\011J\011\n\002\233\002\233\000\000\000\000\002\233\011*\002\233\000\000\000\000\000\000\000\000\002\233\002\233\0112\011:\002\241\002\241\000\000\002\241\000\000\002\241\000\000\000\000\002\241\000\000\000\000\002\241\000\000\002\241\000\000\000\000\nz\000\000\002\241\002\241\002\241\000\000\002\241\002\241\002\241\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\241\000\000\000\000\000\000\000\000\000\000\000\000\002\241\002\241\n\226\n\234\002\241\000\000\000\000\000\000\000\000\000\000\002\241\000\000\n\242\002\241\000\000\000\000\000\000\000\000\002\241\002\241\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\241\002\241\n\130\n\194\n\250\011\002\011\018\002\241\002\241\000\000\000\000\002\241\000\000\002\241\011\026\000\000\000\000\000\000\000\000\002\241\000\000\000\000\002\241\002\241\011\"\000\000\002\241\002\241\002\241\002\241\000\000\000\000\000\000\002\241\000\000\002\241\002\241\000\000\011B\002\241\011J\011\n\002\241\002\241\000\000\000\000\002\241\011*\002\241\000\000\000\000\000\000\000\000\002\241\002\241\0112\011:\002\221\002\221\000\000\002\221\000\000\002\221\000\000\000\000\002\221\000\000\000\000\002\221\000\000\002\221\000\000\000\000\nz\000\000\002\221\002\221\002\221\000\000\002\221\002\221\002\221\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\221\000\000\000\000\000\000\000\000\000\000\000\000\002\221\002\221\n\226\n\234\002\221\000\000\000\000\000\000\000\000\000\000\002\221\000\000\n\242\002\221\000\000\000\000\000\000\000\000\002\221\002\221\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\221\002\221\n\130\n\194\n\250\011\002\011\018\002\221\002\221\000\000\000\000\002\221\000\000\002\221\011\026\000\000\000\000\000\000\000\000\002\221\000\000\000\000\002\221\002\221\011\"\000\000\002\221\002\221\002\221\002\221\000\000\000\000\000\000\002\221\000\000\002\221\002\221\000\000\011B\002\221\011J\011\n\002\221\002\221\000\000\000\000\002\221\011*\002\221\000\000\000\000\000\000\000\000\002\221\002\221\0112\011:\002\225\002\225\000\000\002\225\000\000\002\225\000\000\000\000\002\225\000\000\000\000\002\225\000\000\002\225\000\000\000\000\nz\000\000\002\225\002\225\002\225\000\000\002\225\002\225\002\225\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\225\000\000\000\000\000\000\000\000\000\000\000\000\002\225\002\225\n\226\n\234\002\225\000\000\000\000\000\000\000\000\000\000\002\225\000\000\n\242\002\225\000\000\000\000\000\000\000\000\002\225\002\225\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\225\002\225\n\130\n\194\n\250\011\002\011\018\002\225\002\225\000\000\000\000\002\225\000\000\002\225\011\026\000\000\000\000\000\000\000\000\002\225\000\000\000\000\002\225\002\225\011\"\000\000\002\225\002\225\002\225\002\225\000\000\000\000\000\000\002\225\000\000\002\225\002\225\000\000\011B\002\225\011J\011\n\002\225\002\225\000\000\000\000\002\225\011*\002\225\000\000\000\000\000\000\000\000\002\225\002\225\0112\011:\002\229\002\229\000\000\002\229\000\000\002\229\000\000\000\000\002\229\000\000\000\000\002\229\000\000\002\229\000\000\000\000\nz\000\000\002\229\002\229\002\229\000\000\002\229\002\229\002\229\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\229\000\000\000\000\000\000\000\000\000\000\000\000\002\229\002\229\n\226\n\234\002\229\000\000\000\000\000\000\000\000\000\000\002\229\000\000\n\242\002\229\000\000\000\000\000\000\000\000\002\229\002\229\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\229\002\229\n\130\n\194\n\250\011\002\011\018\002\229\002\229\000\000\000\000\002\229\000\000\002\229\011\026\000\000\000\000\000\000\000\000\002\229\000\000\000\000\002\229\002\229\011\"\000\000\002\229\002\229\002\229\002\229\000\000\000\000\000\000\002\229\000\000\002\229\002\229\000\000\011B\002\229\011J\011\n\002\229\002\229\000\000\000\000\002\229\011*\002\229\000\000\000\000\000\000\000\000\002\229\002\229\0112\011:\002\249\002\249\000\000\002\249\000\000\002\249\000\000\000\000\002\249\000\000\000\000\002\249\000\000\002\249\000\000\000\000\nz\000\000\002\249\002\249\002\249\000\000\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\249\000\000\000\000\000\000\000\000\000\000\000\000\002\249\002\249\n\226\n\234\002\249\000\000\000\000\000\000\000\000\000\000\002\249\000\000\n\242\002\249\000\000\000\000\000\000\000\000\002\249\002\249\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\249\002\249\n\130\n\194\n\250\011\002\011\018\002\249\002\249\000\000\000\000\002\249\000\000\002\249\011\026\000\000\000\000\000\000\000\000\002\249\000\000\000\000\002\249\002\249\011\"\000\000\002\249\002\249\002\249\002\249\000\000\000\000\000\000\002\249\000\000\002\249\002\249\000\000\011B\002\249\011J\011\n\002\249\002\249\000\000\000\000\002\249\011*\002\249\000\000\000\000\000\000\000\000\002\249\002\249\0112\011:\002\245\002\245\000\000\002\245\000\000\002\245\000\000\000\000\002\245\000\000\000\000\002\245\000\000\002\245\000\000\000\000\nz\000\000\002\245\002\245\002\245\000\000\002\245\002\245\002\245\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\245\000\000\000\000\000\000\000\000\000\000\000\000\002\245\002\245\n\226\n\234\002\245\000\000\000\000\000\000\000\000\000\000\002\245\000\000\n\242\002\245\000\000\000\000\000\000\000\000\002\245\002\245\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\245\002\245\n\130\n\194\n\250\011\002\011\018\002\245\002\245\000\000\000\000\002\245\000\000\002\245\011\026\000\000\000\000\000\000\000\000\002\245\000\000\000\000\002\245\002\245\011\"\000\000\002\245\002\245\002\245\002\245\000\000\000\000\000\000\002\245\000\000\002\245\002\245\000\000\011B\002\245\011J\011\n\002\245\002\245\000\000\000\000\002\245\011*\002\245\000\000\000\000\000\000\000\000\002\245\002\245\0112\011:\002\253\002\253\000\000\002\253\000\000\002\253\000\000\000\000\002\253\000\000\000\000\002\253\000\000\002\253\000\000\000\000\nz\000\000\002\253\002\253\002\253\000\000\002\253\002\253\002\253\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\253\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\253\n\226\n\234\002\253\000\000\000\000\000\000\000\000\000\000\002\253\000\000\n\242\002\253\000\000\000\000\000\000\000\000\002\253\002\253\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\253\n\130\n\194\n\250\011\002\011\018\002\253\002\253\000\000\000\000\002\253\000\000\002\253\011\026\000\000\000\000\000\000\000\000\002\253\000\000\000\000\002\253\002\253\011\"\000\000\002\253\002\253\002\253\002\253\000\000\000\000\000\000\002\253\000\000\002\253\002\253\000\000\011B\002\253\011J\011\n\002\253\002\253\000\000\000\000\002\253\011*\002\253\000\000\000\000\000\000\000\000\002\253\002\253\0112\011:\002\217\002\217\000\000\002\217\000\000\002\217\000\000\000\000\002\217\000\000\000\000\002\217\000\000\002\217\000\000\000\000\nz\000\000\002\217\002\217\002\217\000\000\002\217\002\217\002\217\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\217\000\000\000\000\000\000\000\000\000\000\000\000\002\217\002\217\n\226\n\234\002\217\000\000\000\000\000\000\000\000\000\000\002\217\000\000\n\242\002\217\000\000\000\000\000\000\000\000\002\217\002\217\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\217\002\217\n\130\n\194\n\250\011\002\011\018\002\217\002\217\000\000\000\000\002\217\000\000\002\217\011\026\000\000\000\000\000\000\000\000\002\217\000\000\000\000\002\217\002\217\011\"\000\000\002\217\002\217\002\217\002\217\000\000\000\000\000\000\002\217\000\000\002\217\002\217\000\000\011B\002\217\011J\011\n\002\217\002\217\000\000\000\000\002\217\011*\002\217\000\000\000\000\000\000\000\000\002\217\002\217\0112\011:\002)\002)\000\000\002)\000\000\002)\000\000\000\000\002)\000\000\000\000\002)\000\000\002)\000\000\000\000\002)\000\000\002)\002)\002)\000\000\002)\002)\002)\000\000\000\000\000\000\000\000\000\000\002)\002)\002)\002)\002)\000\000\002)\000\000\000\000\000\000\000\000\000\000\000\000\002)\002)\002)\002)\002)\000\000\000\000\000\000\000\000\000\000\002)\000\000\002)\002)\000\000\000\000\000\000\000\000\002)\002)\002)\000\000\000\000\000\000\000\000\000\000\000\000\002)\002)\002)\002)\002)\002)\002)\002)\002)\000\000\000\000\002)\000\000\002)\002)\000\000\000\000\000\000\000\000\002)\000\000\000\000\002)\002)\002)\000\000\002)\002)\002)\002)\000\000\000\000\000\000\002)\000\000\002)\002)\000\000\002)\002)\002)\002)\002)\002)\000\000\000\000\002)\002)\015\014\000\000\000\000\000\000\000\000\002)\002)\002)\002)\002E\002E\000\000\002E\000\000\002E\000\000\000\000\002E\000\000\000\000\002E\000\000\002E\000\000\000\000\nz\000\000\002E\002E\002E\000\000\002E\002E\002E\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002E\000\000\000\000\000\000\000\000\000\000\000\000\002E\002E\n\226\n\234\002E\000\000\000\000\000\000\000\000\000\000\002E\000\000\n\242\002E\000\000\000\000\000\000\000\000\002E\002E\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002E\002E\n\130\n\194\n\250\011\002\011\018\002E\002E\000\000\000\000\002E\000\000\002E\011\026\000\000\000\000\000\000\000\000\002E\000\000\000\000\002E\002E\011\"\000\000\002E\002E\015&\002E\000\000\000\000\000\000\002E\000\000\002E\002E\000\000\011B\002E\011J\011\n\002E\002E\000\000\000\000\002E\011*\002E\000\000\000\000\000\000\000\000\002E\002E\0112\011:\002A\002A\000\000\002A\000\000\002A\000\000\000\000\002A\000\000\000\000\002A\000\000\002A\000\000\000\000\nz\000\000\002A\002A\002A\000\000\002A\002A\002A\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002A\000\000\000\000\000\000\000\000\000\000\000\000\002A\002A\n\226\n\234\002A\000\000\000\000\000\000\000\000\000\000\002A\000\000\n\242\002A\000\000\000\000\000\000\000\000\002A\002A\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002A\002A\n\130\n\194\n\250\011\002\011\018\002A\002A\000\000\000\000\002A\000\000\002A\011\026\000\000\000\000\000\000\000\000\002A\000\000\000\000\002A\002A\011\"\000\000\002A\002A\002A\002A\000\000\000\000\000\000\002A\000\000\002A\002A\000\000\011B\002A\011J\011\n\002A\002A\000\000\000\000\002A\011*\002A\000\000\000\000\000\000\000\000\002A\002A\0112\011:\002\213\002\213\000\000\002\213\000\000\002\213\000\000\000\000\002\213\000\000\000\000\002\213\000\000\002\213\000\000\000\000\nz\000\000\002\213\002\213\002\213\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\002\213\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\n\226\n\234\002\213\000\000\000\000\000\000\000\000\000\000\002\213\000\000\n\242\002\213\000\000\000\000\000\000\000\000\002\213\002\213\000\246\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\n\130\n\194\n\250\011\002\011\018\002\213\002\213\000\000\000\000\002\213\000\000\002\213\011\026\000\000\000\000\000\000\000\000\002\213\000\000\000\000\002\213\002\213\011\"\000\000\002\213\002\213\002\213\002\213\000\000\000\000\000\000\002\213\000\000\002\213\002\213\000\000\011B\002\213\011J\011\n\002\213\002\213\000\000\000\000\002\213\011*\002\213\000\000\000\000\000\000\000\000\002\213\002\213\0112\011:\0025\0025\000\000\0025\000\000\0025\000\000\000\000\0025\000\000\000\000\0025\000\000\0025\000\000\000\000\0025\000\000\0025\0025\0025\000\000\0025\0025\0025\000\000\000\000\000\000\000\000\000\000\0025\0025\0025\0025\0025\000\000\0025\000\000\000\000\000\000\000\000\000\000\000\000\0025\0025\0025\0025\0025\000\000\000\000\000\000\000\000\000\000\0025\000\000\0025\0025\000\000\000\000\000\000\000\000\0025\0025\0025\000\000\000\000\000\000\000\000\000\000\000\000\0025\0025\0025\0025\0025\0025\0025\0025\0025\000\000\000\000\0025\000\000\0025\0025\000\000\000\000\000\000\000\000\0025\000\000\000\000\0025\0025\0025\000\000\0025\0025\0025\0025\000\000\000\000\000\000\0025\000\000\0025\0025\000\000\0025\0025\0025\0025\0025\0025\000\000\000\000\0025\0025\015\014\000\000\000\000\000\000\000\000\0025\0025\0025\0025\0029\0029\000\000\0029\000\000\0029\000\000\000\000\0029\000\000\000\000\0029\000\000\0029\000\000\000\000\0029\000\000\0029\0029\0029\000\000\0029\0029\0029\000\000\000\000\000\000\000\000\000\000\0029\0029\0029\0029\0029\bu\0029\000\000\000\000\bu\000\000\007Q\000\000\0029\0029\0029\0029\0029\000\000\000\000\000\000\000\000\000\000\0029\000\000\0029\0029\000\000\000\000\000\000\007Q\0029\0029\0029\007Q\000\000\000\000\000\000\000\000\000\000\0029\0029\0029\0029\0029\0029\0029\0029\0029\bu\000\000\0029\000\000\0029\0029\000\000\bq\006\130\000\000\0029\bq\000\000\0029\0029\0029\000\000\0029\0029\0029\0029\bu\000\000\000\000\0029\002\014\0029\0029\006\134\0029\0029\0029\0029\0029\0029\002\018\000\000\0029\0029\015\014\000\000\000\000\000\000\001\218\0029\0029\0029\0029\001\014\t\021\000\006\bq\000\000\000\000\002\202\002\206\007Q\002\250\002\138\005^\000\000\003\170\000\000\003\006\001\018\000\000\000\000\007r\002\150\001\230\000\000\000\246\bq\001\218\004.\002\194\000\000\003F\001\026\b\222\b\226\001&\001*\000\000\000\000\000\000\003V\000\000\000\000\003\014\t\021\026\222\000\000\t\006\t\n\000\000\003\238\003B\003\250\003\254\t\014\007F\000\000\001B\007v\002\194\000\000\000\000\003J\000\000\005^\t\021\b\138\b\142\b\154\b\174\006\138\005\214\000\000\006J\001F\001J\001N\001R\001V\000\000\006\150\t\"\001Z\000\000\006\162\003\222\001^\002\206\000\000\t.\tF\t\170\005\226\005\230\003\186\000\000\001b\000\000\000\000\t\021\bR\000\000\001f\005^\000\000\001\218\t\021\000\000\000\000\000\000\000\000\000\000\001\162\011\138\000\000\000\000\005\234\b\162\000\000\001\166\000\000\015V\004\134\t\190\001\014\001\174\000\006\001\178\001\182\003\218\002\202\002\206\000\000\002\250\002\138\004E\000\000\002\194\003\r\003\006\001\018\003\r\000\000\000\000\b\218\000\000\000\000\000\000\000\000\001\218\000\000\000\000\000\000\003F\001\026\b\222\b\226\001&\001*\000\000\000\000\000\000\003V\000\000\000\n\003\014\007Z\b\230\000\000\t\006\t\n\000\000\003\238\003B\003\250\003\254\t\014\007F\000\246\001B\003\r\002\194\000\000\000\000\003J\000\000\000\000\000\000\b\138\b\142\b\154\b\174\000\000\005\214\003\r\003\r\001F\001J\001N\001R\001V\000\000\000\000\t\"\001Z\000\000\t\129\000\000\001^\004E\000\000\t.\tF\t\170\005\226\005\230\000\000\000\000\001b\000\000\000\000\000\000\003\r\006\138\001f\006\198\006J\tf\t\129\000\000\000\000\000\000\000\000\006\150\001\162\006v\000\000\006\162\005\234\b\162\r\137\001\166\000\000\015V\004\134\t\190\004\181\001\174\000\006\001\178\001\182\000\254\002\202\002\206\002\210\002\250\002\138\000\000\000\000\000\000\r\137\003\006\000\000\002&\003\194\000\000\002*\000\000\004\181\000\246\003\198\001\218\000\000\018\202\000\000\003\n\000\000\003N\003R\000\000\0026\000\000\003\202\000\000\003V\bm\000\000\003\014\000\000\018^\bm\003\230\003\234\000\000\003\238\003B\003\250\003\254\004\006\007F\000\000\000\000\018\194\002\194\000\000\000\000\003J\018\218\002B\bm\b\138\b\142\b\154\b\174\006\138\005\214\000\000\006J\000\000\000\000\000\000\000\000\t\129\018\226\006\150\t\"\000\000\000\000\006\162\000\000\000\000\007y\bm\t.\tF\t\170\005\226\005\230\018\246\019\"\000\000\bm\004\181\004\181\000\000\000\000\bm\bm\000\246\000\000\007y\000\000\000\000\002F\007y\bm\bm\000\000\019^\023J\005\234\b\162\026\194\000\000\000\000\b\186\004\134\t\190\000\014\000\018\000\022\000\026\000\030\000\000\000\"\000&\000*\000.\0002\bm\0006\000:\bm\000\000\000>\000\000\000\000\000\000\000B\000\000\000\000\bm\003\r\000\000\000\000\000F\0202\000\000\000\000\000\000\007m\000J\000\000\000N\000R\000V\000Z\000^\000b\000f\000j\000\000\000\000\000\000\000n\000r\000\000\000v\000z\007m\000~\000\n\000\000\007m\000\000\007y\000\000\000\000\000\000\b\129\000\000\000\000\b\129\000\000\000\130\000\000\000\000\000\134\000\138\003\r\t\242\000\000\000\000\t\254\000\142\000\146\000\150\000\000\000\000\000\000\023\246\003\r\003\r\000\154\000\158\000\162\000\166\000\000\000\170\000\174\000\178\r\137\ru\000\246\000\182\000\186\000\190\000\000\000\000\000\000\000\194\b\129\000\198\000\202\017\026\000\000\000\000\002\138\000\000\000\000\000\206\r\137\000\210\000\000\002&\000\173\b\129\002*\000\214\000\218\000\173\000\222\002\206\000\173\0022\002\138\000\000\t\230\000\000\000\000\003\006\0026\000\000\000\173\002>\000\173\ru\000\173\006\138\000\173\001\218\006J\n\030\b\129\003\n\000\000\017\030\000\000\006\150\000\000\n&\000\173\006\162\000\000\000\000\000\000\003\014\000\000\000\173\002B\000\000\017*\000\173\022\246\003B\000\000\001\198\000\000\000\173\000\000\b\129\000\173\002\194\000\000\000\000\003J\000\173\000\173\000\173\b\138\b\142\b\154\000\000\rv\005\214\000\173\000\173\000\000\005\230\000\000\000\000\000\000\000\173\000\000\000\000\000\000\000\173\000\000\023\002\000\000\003\r\000\000\000\000\000\000\002F\005\226\005\230\000\173\000\173\000\000\003\r\000\173\000\173\t\017\000\000\022\182\000\000\000\000\003\r\000\000\000\000\000\173\000\000\000\000\000\000\000\000\000\n\000\173\000\173\005\234\b\162\000\000\000\000\000\197\b\186\004\134\003\r\000\173\000\197\000\173\002\206\000\197\003\r\002\138\003\r\t\230\000\000\000\000\003\006\000\000\003\r\000\197\000\000\000\197\t\017\000\197\003\r\000\197\001\218\000\000\n\030\004\205\003\n\000\000\000\000\003\r\023v\000\000\n&\000\197\000\000\000\000\003\r\000\000\003\014\t\017\000\197\000\000\000\000\003\r\000\197\000\000\003B\003\r\001\198\003\198\000\197\000\000\000\000\000\197\002\194\000\n\000\000\003J\000\197\000\197\000\197\b\138\b\142\b\154\000\000\rv\005\214\000\197\000\197\000\000\000\000\003\r\023\234\t\017\000\197\000\000\000\000\005^\000\197\003\r\t\017\018\194\011\150\000\000\000\000\003\r\018\218\005\226\005\230\000\197\000\197\000\000\000\000\000\197\000\197\024\142\024\158\000\000\000\000\000\000\000\000\000\000\011\154\000\197\000\000\000\000\000\000\000\000\003\r\000\197\000\197\005\234\b\162\000\000\000\000\000\000\b\186\004\134\tm\000\197\000\006\000\197\004\205\000\254\002\202\002\206\002\210\002\250\002\138\000\000\000\000\025\146\000\000\003\006\000\000\000\000\004\213\000\000\tm\000\000\tm\tm\003\198\001\218\000\000\000\246\000\000\003\n\000\000\003N\003R\000\000\000\000\000\000\003\202\000\000\003V\000\000\000\000\003\014\015\170\018^\000\000\003\230\003\234\000\000\003\238\003B\003\250\003\254\004\006\007F\000\000\000\000\018\194\002\194\015\178\000\000\003J\018\218\000\000\000\000\b\138\b\142\b\154\b\174\000\000\005\214\000\000\000\000\006\138\000\000\000\000\006J\011\158\018\226\000\000\t\"\000\000\029\226\006\150\000\000\000\000\000\000\006\162\t.\tF\t\170\005\226\005\230\018\246\019\"\000\000\000\006\030\003\016j\000\254\002\202\002\206\002\210\002\250\002\138\000\000\000\000\017\026\000\000\003\006\002\138\000\000\0302\000\000\023J\005\234\b\162\tm\003\198\001\218\b\186\004\134\t\190\003\n\000\000\003N\003R\000\000\022\242\000\000\003\202\000\000\003V\000\000\000\000\003\014\000\000\018^\017\026\003\230\003\234\002\138\003\238\003B\003\250\003\254\004\006\007F\000\000\017\030\018\194\002\194\000\000\000\000\003J\018\218\000\000\000\000\b\138\b\142\b\154\b\174\000\000\005\214\017*\000\000\023\022\000\000\000\000\000\000\000\000\018\226\000\000\t\"\000\000\029\226\000\000\000\000\000\000\000\000\017\030\t.\tF\t\170\005\226\005\230\018\246\019\"\000\000\000\000\004\221\005\230\000\000\000\000\000\000\017*\001\014\000\000\000\000\000\000\003\006\023\"\003f\002\206\t\146\000\000\002\138\023J\005\234\b\162\015j\003\006\001\018\b\186\004\134\t\190\002\150\003j\022\182\000\000\000\000\001\218\005\230\000\000\000\000\001\022\001\026\001\030\003\134\001&\001*\003v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\138\000\000\0016\011z\000\000\000\000\003\130\011\222\001\198\001>\027>\000\000\001B\000\000\002\194\005\214\000\000\004\n\000\000\000\000\000\000\004\014\000\000\004\022\005\202\000\000\005\214\000\000\000\000\001F\001J\001N\001R\001V\007I\000\000\005\226\001Z\005\218\007I\000\000\001^\000\000\000\000\000\000\000\000\000\000\005\226\005\230\000\000\006*\001b\000\000\000\000\000\000\000\000\000\000\001f\007I\017\026\005\234\000\000\002\138\000\000\000\000\000\000\000\000\001\162\011\138\001\214\000\000\005\234\000\000\000\000\001\166\000\000\001\170\004\134\001\014\000\000\001\174\007I\001\178\001\182\003f\002\206\011f\001\218\002\138\000\000\007I\000\000\000\000\003\006\001\018\007I\007I\000\246\002\150\000\000\020^\017\030\000\000\001\218\007I\007I\000\000\001\022\001\026\001\030\003\134\001&\001*\002\158\000\000\020\230\017*\000\000\000\000\002\194\000\000\003\138\000\000\0016\011z\000\000\020\254\003\130\011\222\001\198\001>\007I\000\000\001B\000\000\002\194\000\000\000\000\004\n\000\000\007I\000\000\004\014\005\230\004\022\005\202\000\000\005\214\000\000\000\000\001F\001J\001N\001R\001V\001\237\025r\000\000\001Z\005\218\001\237\000\000\001^\000\000\000\000\000\000\000\000\000\000\005\226\005\230\022\202\006*\001b\000\000\000\000\000\000\000\000\000\000\001f\001\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\162\011\138\000\000\000\000\005\234\000\000\000\000\001\166\000\000\001\170\004\134\001\014\000\000\001\174\001\237\001\178\001\182\003f\002\206\012\"\000\000\002\138\000\000\001\237\000\000\000\000\003\006\001\018\001\237\001\237\000\246\002\150\000\000\000\000\000\000\000\000\001\218\001\237\001\237\000\000\001\022\001\026\001\030\003\134\001&\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\138\000\000\0016\011z\000\000\000\000\003\130\011\222\001\198\001>\001\237\000\000\001B\000\000\002\194\000\000\000\000\004\n\000\000\001\237\000\000\004\014\000\000\004\022\005\202\000\000\005\214\000\000\000\000\001F\001J\001N\001R\001V\r\213\000\000\000\000\001Z\005\218\r\213\000\000\001^\000\000\000\000\000\000\000\000\000\000\005\226\005\230\000\000\006*\001b\000\000\000\000\000\000\000\000\000\000\001f\r\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\162\011\138\000\000\000\000\005\234\000\000\000\000\001\166\000\000\001\170\004\134\001\014\000\000\001\174\r\213\001\178\001\182\003f\002\206\014\186\000\000\002\138\000\000\r\213\000\000\000\000\003\006\001\018\r\213\r\213\000\246\002\150\000\000\000\000\000\000\000\000\001\218\r\213\r\213\000\000\001\022\001\026\001\030\003\134\001&\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\138\000\000\0016\011z\000\000\000\000\003\130\011\222\001\198\001>\r\213\000\000\001B\000\000\002\194\000\000\000\000\004\n\000\000\r\213\000\000\004\014\000\000\004\022\005\202\000\000\005\214\000\000\000\000\001F\001J\001N\001R\001V\000\000\000\000\000\000\001Z\005\218\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\005\226\005\230\000\000\006*\001b\000\000\000\000\000\000\000\000\000\000\001f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\162\011\138\000\000\000\000\005\234\000\000\000\000\001\166\000\000\001\170\004\134\001\014\000\000\001\174\000\000\001\178\001\182\003f\002\206\000\000\000\000\002\138\000\000\000\000\000\000\000\000\003\006\001\018\000\000\000\000\000\000\002\150\000\000\000\000\000\000\000\000\001\218\000\000\000\000\000\000\001\022\001\026\001\030\003\134\001&\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\138\000\000\0016\011z\000\000\000\000\003\130\011~\001\198\001>\000\000\000\000\001B\000\000\002\194\000\000\000\000\004\n\000\000\r\137\ru\004\014\000\000\004\022\005\202\000\000\005\214\000\000\000\000\001F\001J\001N\001R\001V\000\000\000\000\000\000\001Z\005\218\r\137\000\000\001^\002&\000\000\000\000\002*\000\000\005\226\005\230\000\000\006*\001b\002\222\000\000\000\000\bi\000\000\001f\000\000\0026\bi\000\000\002>\000\000\ru\000\000\000\000\001\162\011\138\000\000\000\000\005\234\000\000\000\000\001\166\000\000\001\170\004\134\011Q\bi\001\174\011Q\001\178\001\182\011Q\011Q\000\000\002B\011Q\000\000\011Q\000\000\000\000\011Q\000\000\000\000\000\000\011Q\011Q\000\000\011Q\011Q\bi\011Q\000\000\011Q\000\000\000\000\000\000\000\000\011Q\bi\000\000\011Q\000\000\000\000\bi\bi\000\246\000\000\000\000\000\000\011Q\000\000\011Q\bi\bi\011Q\000\000\011Q\000\000\000\000\002F\000\000\000\000\011Q\000\000\000\000\011Q\000\000\000\000\011Q\011Q\000\000\011Q\000\000\011Q\011Q\000\000\bi\000\000\000\000\bi\000\000\000\000\000\000\011Q\000\000\000\000\011Q\000\000\bi\000\000\000\000\000\000\000\000\000\000\000\000\011Q\011Q\000\000\000\000\011Q\000\000\011Q\005Y\000\000\000\000\000\000\006\006\005Y\000\000\005Y\005Y\000\000\000\000\011Q\011Q\000\000\011Q\011Q\005Y\011Q\005Y\011Q\005Y\011Q\005Y\011Q\005Y\011Q\005Y\005Y\000\000\000\000\000\000\005Y\000\000\005Y\005Y\000\000\005Y\000\000\000\000\000\000\000\000\000\000\005Y\005Y\005Y\005Y\005Y\000\000\005Y\005Y\005Y\005Y\000\000\000\000\000\000\000\000\005Y\000\000\003\r\000\000\000\000\005Y\005Y\005Y\000\000\003\r\000\000\000\000\000\000\005Y\005Y\000\000\000\000\005Y\000\000\000\000\003\r\005Y\000\000\005Y\000\000\005Y\005Y\000\000\000\n\000\000\000\000\005Y\005Y\005Y\000\000\000\000\005Y\005Y\005Y\000\000\005Y\005Y\000\000\000\000\003\r\000\000\000\000\005Y\000\000\000\000\000\000\005Y\003\r\000\000\005Y\000\000\021\202\005Y\003\r\000\000\000\000\000\000\005Y\005Y\005Y\000\000\005Y\005Y\005Y\000\000\000\000\000\000\000\000\003\r\000\000\000\000\005Y\000\000\005Y\005Y\003\r\003\r\002\186\005Y\000\000\000\000\003\r\003\r\005Y\000\000\000\000\003\r\005Y\003\r\005Y\005Y\003\r\003\r\003\r\000\n\003\r\003\r\000\000\003\r\003\r\000\000\003\r\003\r\000\000\003\r\003\r\000\000\003\r\000\n\003\206\003\r\003\r\000\000\003\r\003\r\003\r\000\000\003\r\003\r\000\n\003\r\003\r\007J\000\000\003\r\000\n\003\r\003\r\000\n\016\210\000\000\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\000\000\003\r\003\r\003\r\003\r\000\000\003\r\003\r\000\000\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\000\000\003\r\003\r\000\000\003\r\003\r\000\000\003\r\000\000\000\000\000\000\000\000\000\000\003\r\003\r\003\r\003\r\003\r\000\000\017\014\007N\000\000\003\r\003\r\000\000\003\r\003\r\000\000\003\r\000\000\000\000\000\000\003\r\000\000\003\r\000\000\000\000\000\000\002\206\000\000\003\r\003\r\000\000\tY\tY\003\r\003\r\003\r\tY\003\r\001\214\tY\003\r\003\r\000\000\003\r\001\218\000\000\000\000\tY\000\000\tY\tY\tY\000\000\tY\tY\tY\000\000\023j\000\254\000\000\000\254\002\210\000\000\002\026\000\000\000\000\000\000\tY\024\170\000\000\003\026\004\213\024\174\019b\tY\tY\002\194\003\198\tY\003\198\000\000\000\000\002\158\024\222\tY\000\000\000\000\tY\000\000\003\202\000\000\019f\tY\tY\tY\000\000\018^\000\000\019\142\000\000\000\000\tY\tY\000\000\000\000\000\000\026\018\024\238\tY\018\194\000\000\018\194\004\194\000\000\018\218\tY\018\218\000\000\000\000\000\000\000\000\000\000\000\000\tY\tY\tY\000\000\tY\tY\000\000\018\226\000\000\020\n\000\000\000\000\000\000\001\r\tY\000\000\tY\tY\001\r\000\000\000\000\tY\018\246\019\"\018\246\020\030\tY\000\000\004\169\000\000\tY\000\000\tY\tY\rI\rI\000\000\001\r\000\000\rI\000\000\001\214\rI\023J\000\000\020.\000\000\000\000\000\000\000\000\004\210\000\000\rI\rI\rI\000\000\rI\rI\rI\000\000\001\r\000\000\003b\000\000\000\000\000\000\000\000\000\000\000\000\001\r\rI\000\000\000\000\000\000\001\r\000\000\000\000\rI\rI\000\000\000\000\rI\000\000\001\r\001\r\002\158\000\000\rI\000\000\000\000\rI\000\000\000\000\005\137\r\201\rI\rI\rI\000\000\000\000\0012\000\000\000\000\000\000\rI\rI\000\000\003\r\000\000\000\000\001\r\rI\005\137\000\000\003\r\004\194\005\137\000\000\rI\001\r\000\000\000\000\000\000\000\000\000\000\003\r\rI\rI\rI\000\000\rI\rI\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\rI\000\000\rI\rI\000\000\000\000\000\000\rI\000\000\003\r\000\000\000\000\rI\000\000\000\000\000\000\rI\003\r\rI\rI\t]\t]\000\000\003\r\000\000\t]\000\000\001\214\t]\000\000\000\000\000\000\000\000\r\201\r\201\000\000\t]\000\000\t]\t]\t]\000\000\t]\t]\t]\000\000\003\r\005\137\000\000\000\000\000\000\000\000\000\000\r\201\000\000\r\201\t]\000\000\000\000\000\000\000\000\000\000\005\137\t]\t]\005\137\000\000\t]\000\000\000\000\000\000\002\158\000\000\t]\000\000\000\000\t]\000\000\000\000\000\000\000\000\t]\t]\t]\000\000\000\000\000\000\000\000\000\000\000\000\t]\t]\000\000\000\000\000\000\000\000\000\000\t]\000\000\000\000\000\000\004\194\000\000\004\161\t]\000\000\004\161\000\000\004\161\000\000\000\000\004\161\t]\t]\t]\000\000\t]\t]\000\000\000\000\000\000\004\161\000\000\000\000\000\000\004\161\t]\004\161\t]\t]\004\161\000\000\000\000\t]\000\000\000\000\000\000\000\000\t]\004\161\000\000\006\249\t]\0009\t]\t]\004\161\0009\0009\000\000\0009\0009\000\000\004\161\000\000\000\000\0009\000\000\000\000\004\161\000\000\006\249\004\161\000\000\004\161\002\242\0009\004\161\002\242\000\246\0009\000\000\0009\0009\000\000\000\000\004\161\004\161\000\000\0009\004\161\000\000\0009\000\000\000\000\000\000\0009\0009\000\000\0009\0009\0009\0009\0009\0009\004\161\004\161\000\000\0009\004\161\004\161\0009\000\000\004\161\000\000\0009\0009\0009\0009\007\186\0009\000\000\004\161\000\000\000\000\000\000\004\161\000\000\000\000\000\000\0009\022\202\000\000\000\000\000\000\000\000\000\000\004\161\0009\0009\0009\0009\0009\000\000\006\245\000\000\0005\000\000\000\000\000\000\0005\0005\000\000\0005\0005\000\000\000\000\000\000\000\000\0005\000\000\000\000\000\000\000\000\006\245\0009\0009\000\000\000\000\0005\0009\0009\0009\0005\000\000\0005\0005\000\000\000\000\000\000\000\000\000\000\0005\000\000\000\000\0005\000\000\000\000\000\000\0005\0005\000\000\0005\0005\0005\0005\0005\0005\000\000\000\000\000\000\0005\000\000\000\000\0005\000\000\000\000\000\000\0005\0005\0005\0005\000\000\0005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\0005\0005\0005\0005\000\000\007\005\000\000\r\017\000\000\000\000\000\000\r\017\r\017\000\000\r\017\r\017\000\000\000\000\000\000\000\000\r\017\000\000\000\000\000\000\000\000\007\005\0005\0005\000\000\000\000\r\017\0005\0005\0005\r\017\000\000\r\017\r\017\000\000\000\000\000\000\000\000\000\000\r\017\000\000\000\000\r\017\000\000\000\000\000\000\r\017\r\017\000\000\r\017\r\017\r\017\r\017\r\017\r\017\000\000\000\000\000\000\r\017\000\000\000\000\r\017\000\000\000\000\000\000\r\017\r\017\r\017\r\017\000\000\r\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\017\r\017\r\017\r\017\r\017\000\000\007\001\000\000\r\r\000\000\000\000\000\000\r\r\r\r\000\000\r\r\r\r\000\000\001\021\000\000\000\000\r\r\000\000\001\021\000\000\000\000\007\001\r\017\r\017\000\000\000\000\r\r\r\017\r\017\r\017\r\r\000\000\r\r\r\r\000\000\000\000\000\000\001\021\000\000\r\r\000\000\000\000\r\r\000\000\000\000\000\000\r\r\r\r\000\000\r\r\r\r\r\r\r\r\r\r\r\r\000\000\000\000\000\000\r\r\000\000\001\021\r\r\020f\000\000\000\000\r\r\r\r\r\r\r\r\001\021\r\r\000\000\000\000\000\000\001\021\000\000\005\141\r\201\000\000\000\000\r\r\000\000\000\000\000\000\001\021\000\000\000\000\000\000\r\r\r\r\r\r\r\r\r\r\000\000\000\000\005\141\000\000\000\000\000\000\005\141\000\000\000\000\004\197\000\000\000\006\000\000\000\000\020v\002\202\002\206\001\021\002\250\002\138\000\000\000\000\r\r\r\r\003\006\000\000\001\021\r\r\r\r\r\r\000\000\004\018\000\000\003\198\001\218\000\000\000\000\000\000\003\n\000\000\003N\003R\000\000\000\000\000\000\000\000\000\000\003V\000\000\000\000\003\014\000\000\000\000\000\000\003\230\003\234\020\162\003\238\003B\003\250\003\254\004\006\007F\r\201\r\201\018\194\002\194\000\000\000\000\003J\018\218\000\000\000\000\b\138\b\142\b\154\b\174\005\141\005\214\000\000\020\222\000\000\000\000\r\201\000\000\r\201\000\000\000\000\t\"\000\000\000\000\000\000\005\141\000\000\000\000\005\141\t.\tF\t\170\005\226\005\230\000\000\000\000\000\000\000\000\000\000\004\197\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\021B\002\202\002\206\000\000\002\250\002\138\000\000\000\000\005\234\b\162\003\006\000\000\000\000\b\186\004\134\t\190\000\000\015\214\000\000\000\000\001\218\000\000\000\000\000\000\003\n\000\000\003N\003R\000\000\000\000\000\000\000\000\000\000\003V\000\000\000\000\003\014\000\000\000\000\000\000\003\230\003\234\000\000\003\238\003B\003\250\003\254\004\006\007F\0079\0079\000\000\002\194\000\000\000\000\003J\000\000\000\000\000\000\b\138\b\142\b\154\b\174\000\000\005\214\004B\000\000\000\000\0079\0079\0079\000\000\000\000\000\000\t\"\000\000\000\000\000\000\0079\000\000\000\000\000\000\t.\tF\t\170\005\226\005\230\000\000\000\000\000\000\000\000\000\000\0079\0079\0079\000\000\000\000\000\000\0079\000\000\0079\0079\0079\rM\rM\000\000\000\000\0079\rM\005\234\b\162\rM\000\000\000\000\b\186\004\134\t\190\000\000\000\000\004\178\000\000\rM\rM\rM\0079\rM\rM\rM\b\250\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\000\000\rM\000\000\000\000\000\000\000\000\000\000\002\018\rM\rM\000\000\000\000\rM\000\000\000\000\001\218\000\000\000\000\rM\000\000\000\000\rM\000\000\0046\000\000\0079\rM\rM\rM\000\000\000\000\000\000\000\000\003\170\000\000\rM\rM\000\000\000\000\007r\000\000\001\230\rM\000\000\000\000\000\000\rM\002\194\000\000\rM\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rM\rM\rM\000\000\rM\rM\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rM\000\000\rM\rM\000\000\007v\000\000\rM\000\000\000\000\000\000\000\000\rM\000\000\011]\000\000\rM\011]\rM\rM\003f\002\206\000\000\000\000\002\138\000\000\000\000\000\000\000\000\003\006\000\000\000\000\000\000\011]\011]\000\000\011]\011]\000\000\001\218\000\000\000\000\000\000\000\000\000\000\000\000\003j\000\000\000\000\000\000\000\000\000\000\000\000\007\237\000\000\000\000\007\237\000\000\011]\000\000\003v\000\000\000\000\003\130\t^\001\198\000\000\000\000\000\000\000\000\000\000\002\194\007\237\007\237\004\n\007\237\007\237\011]\004\014\000\000\004\022\005\202\000\000\005\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011]\000\000\000\000\005\218\000\000\007\237\000\000\000\000\000\000\000\000\000\000\000\000\005\226\005\230\000\000\006*\011]\000\000\011]\000\000\000\000\000\000\000\000\000\000\007\237\000\000\000\000\000\000\000\000\000\000\011]\000\000\000\000\011]\011]\000\000\005\234\000\000\011]\007\237\011]\000\000\004\134\011Y\011]\000\000\011Y\000\000\000\000\003f\002\206\000\000\000\000\002\138\000\000\007\237\000\000\007\237\003\006\000\000\000\000\000\000\011Y\011Y\000\000\011Y\011Y\000\000\001\218\006B\000\000\000\000\007\237\007\237\018\030\003j\000\000\007\237\000\000\007\237\000\000\002\014\000\000\007\237\000\000\000\000\000\000\011Y\000\000\003v\000\000\002\018\003\130\011Z\001\198\000\000\000\000\000\000\000\000\001\218\002\194\018.\000\000\004\n\000\000\000\000\011Y\004\014\002\014\004\022\005\202\000\000\005\214\000\000\000\000\000\000\000\000\003\170\002\018\000\000\000\000\011Y\000\000\007r\005\218\001\230\001\218\000\000\000\000\000\000\000\000\002\194\000\000\005\226\005\230\000\000\006*\011Y\000\000\011Y\000\000\000\000\000\000\000\000\003\170\000\000\000\000\000\000\003I\003I\007r\011Y\001\230\003I\011Y\011Y\003I\005\234\002\194\011Y\007v\011Y\000\000\004\134\000\000\011Y\003I\003I\003I\000\000\003I\003I\003I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003I\000\000\000\000\007v\000\000\000\000\000\000\003I\004\150\000\000\000\000\003I\000\000\000\000\000\000\000\000\000\000\003I\000\000\000\000\003I\000\000\000\000\000\000\000\000\003I\003I\003I\000\000\000\000\000\000\012\185\012\185\000\000\003I\003I\012\185\000\000\000\000\012\185\000\000\003I\000\000\000\000\000\000\003I\000\000\000\000\003I\012\185\012\185\012\185\000\000\012\185\012\185\012\185\003I\003I\003I\000\000\003I\003I\000\000\000\000\000\000\000\000\000\000\012\185\000\000\000\000\003I\000\000\003I\003I\012\185\004\162\000\000\003I\012\185\000\000\000\000\000\000\003I\000\000\012\185\000\000\003I\012\185\003I\003I\000\000\000\000\012\185\012\185\012\185\000\000\000\000\000\000\012\193\012\193\000\000\012\185\012\185\012\193\000\000\000\000\012\193\000\000\012\185\000\000\000\000\000\000\012\185\000\000\000\000\012\185\012\193\012\193\012\193\000\000\012\193\012\193\012\193\012\185\012\185\012\185\000\000\012\185\012\185\000\000\000\000\000\000\000\000\000\000\012\193\000\000\000\000\012\185\000\000\012\185\012\185\012\193\004\162\000\000\012\185\012\193\000\000\000\000\000\000\012\185\000\000\012\193\000\000\012\185\012\193\012\185\012\185\000\000\000\000\012\193\012\193\012\193\000\000\000\000\000\000\012\189\012\189\000\000\012\193\012\193\012\189\000\000\000\000\012\189\000\000\012\193\000\000\000\000\000\000\012\193\000\000\000\000\012\193\012\189\012\189\012\189\000\000\012\189\012\189\012\189\012\193\012\193\012\193\000\000\012\193\012\193\000\000\000\000\000\000\000\000\000\000\012\189\000\000\000\000\012\193\000\000\012\193\012\193\012\189\004\150\000\000\012\193\012\189\000\000\000\000\000\000\012\193\000\000\012\189\000\000\012\193\012\189\012\193\012\193\000\000\000\000\012\189\012\189\012\189\000\000\000\000\000\000\012\161\012\161\000\000\012\189\012\189\012\161\000\000\000\000\012\161\000\000\012\189\000\000\000\000\000\000\012\189\000\000\000\000\012\189\012\161\012\161\012\161\000\000\012\161\012\161\012\161\012\189\012\189\012\189\000\000\012\189\012\189\000\000\000\000\000\000\000\000\000\000\012\161\000\000\000\000\012\189\000\000\012\189\012\189\012\161\004\162\000\000\012\189\012\161\000\000\000\000\000\000\012\189\000\000\012\161\000\000\012\189\012\161\012\189\012\189\000\000\000\000\012\161\012\161\012\161\000\000\000\000\000\000\012\157\012\157\000\000\012\161\012\161\012\157\000\000\000\000\012\157\000\000\012\161\000\000\000\000\000\000\012\161\000\000\000\000\012\161\012\157\012\157\012\157\000\000\012\157\012\157\012\157\012\161\012\161\012\161\000\000\012\161\012\161\000\000\000\000\000\000\000\000\000\000\012\157\000\000\000\000\012\161\000\000\012\161\012\161\012\157\004\150\000\000\012\161\012\157\000\000\000\000\000\000\012\161\000\000\012\157\000\000\012\161\012\157\012\161\012\161\000\000\000\000\012\157\012\157\012\157\000\000\000\000\000\000\012\153\012\153\000\000\012\157\012\157\012\153\000\000\000\000\012\153\000\000\012\157\000\000\000\000\000\000\012\157\000\000\000\000\012\157\012\153\012\153\012\153\000\000\012\153\012\153\012\153\012\157\012\157\012\157\000\000\012\157\012\157\000\000\000\000\000\000\000\000\000\000\012\153\000\000\000\000\012\157\000\000\012\157\012\157\012\153\004\162\000\000\012\157\012\153\000\000\000\000\000\000\012\157\000\000\012\153\000\000\012\157\012\153\012\157\012\157\000\000\000\000\012\153\012\153\012\153\000\000\000\000\000\000\012\149\012\149\000\000\012\153\012\153\012\149\000\000\000\000\012\149\000\000\012\153\000\000\000\000\000\000\012\153\000\000\000\000\012\153\012\149\012\149\012\149\000\000\012\149\012\149\012\149\012\153\012\153\012\153\000\000\012\153\012\153\000\000\000\000\000\000\000\000\000\000\012\149\000\000\000\000\012\153\000\000\012\153\012\153\012\149\004\150\000\000\012\153\012\149\000\000\000\000\000\000\012\153\000\000\012\149\000\000\012\153\012\149\012\153\012\153\000\000\000\000\012\149\012\149\012\149\000\000\000\000\000\000\012\181\012\181\000\000\012\149\012\149\012\181\000\000\000\000\012\181\000\000\012\149\000\000\000\000\000\000\012\149\000\000\000\000\012\149\012\181\012\181\012\181\000\000\012\181\012\181\012\181\012\149\012\149\012\149\000\000\012\149\012\149\000\000\000\000\000\000\000\000\000\000\012\181\000\000\000\000\012\149\000\000\012\149\012\149\012\181\004\150\000\000\012\149\012\181\000\000\000\000\000\000\012\149\000\000\012\181\000\000\012\149\012\181\012\149\012\149\000\000\000\000\012\181\012\181\012\181\000\000\000\000\000\000\012\177\012\177\000\000\012\181\012\181\012\177\000\000\000\000\012\177\000\000\012\181\000\000\000\000\000\000\012\181\000\000\000\000\012\181\012\177\012\177\012\177\000\000\012\177\012\177\012\177\012\181\012\181\012\181\000\000\012\181\012\181\000\000\000\000\000\000\000\000\000\000\012\177\000\000\000\000\012\181\000\000\012\181\012\181\012\177\004\162\000\000\012\181\012\177\000\000\000\000\000\000\012\181\000\000\012\177\000\000\012\181\012\177\012\181\012\181\000\000\000\000\012\177\012\177\012\177\000\000\000\000\000\000\012\173\012\173\000\000\012\177\012\177\012\173\000\000\000\000\012\173\000\000\012\177\000\000\000\000\000\000\012\177\000\000\000\000\012\177\012\173\012\173\012\173\000\000\012\173\012\173\012\173\012\177\012\177\012\177\000\000\012\177\012\177\000\000\000\000\000\000\000\000\000\000\012\173\000\000\000\000\012\177\000\000\012\177\012\177\012\173\004\150\000\000\012\177\012\173\000\000\000\000\000\000\012\177\000\000\012\173\000\000\012\177\012\173\012\177\012\177\000\000\000\000\012\173\012\173\012\173\000\000\000\000\000\000\012\169\012\169\000\000\012\173\012\173\012\169\000\000\000\000\012\169\000\000\012\173\000\000\000\000\000\000\012\173\000\000\000\000\012\173\012\169\012\169\012\169\000\000\012\169\012\169\012\169\012\173\012\173\012\173\000\000\012\173\012\173\000\000\000\000\000\000\000\000\000\000\012\169\000\000\000\000\012\173\000\000\012\173\012\173\012\169\004\162\000\000\012\173\012\169\000\000\000\000\000\000\012\173\000\000\012\169\000\000\012\173\012\169\012\173\012\173\000\000\000\000\012\169\012\169\012\169\000\000\000\000\000\000\012\165\012\165\000\000\012\169\012\169\012\165\000\000\000\000\012\165\000\000\012\169\000\000\000\000\000\000\012\169\000\000\000\000\012\169\012\165\012\165\012\165\000\000\012\165\012\165\012\165\012\169\012\169\012\169\000\000\012\169\012\169\000\000\000\000\000\000\000\000\000\000\012\165\000\000\000\000\012\169\000\000\012\169\012\169\012\165\004\150\000\000\012\169\012\165\000\000\000\000\000\000\012\169\000\000\012\165\000\000\012\169\012\165\012\169\012\169\000\000\000\000\012\165\012\165\012\165\000\000\000\000\000\000\002\005\002\005\000\000\012\165\012\165\002\005\000\000\000\000\002\005\000\000\012\165\000\000\000\000\000\000\012\165\000\000\000\000\012\165\002\005\002\005\002\005\000\000\002\005\002\005\002\005\012\165\012\165\012\165\000\000\012\165\012\165\000\000\000\000\000\000\000\000\000\000\002\005\000\000\000\000\012\165\000\000\012\165\012\165\002\005\002\005\000\000\012\165\002\005\000\000\000\000\000\000\012\165\000\000\002\005\000\000\012\165\002\005\012\165\012\165\000\000\000\000\002\005\002\005\002\005\000\000\000\000\000\000\000\000\000\000\r-\002\005\002\005\r-\000\000\000\000\000\000\000\000\002\005\000\000\000\000\000\000\002\005\r-\000\000\002\005\000\000\000\000\000\000\r-\000\000\000\000\000\000\002\005\002\005\002\005\000\000\002\005\002\005\000\000\000\000\r-\000\000\000\000\000\000\000\000\000\000\002\005\r-\002\005\002\005\003f\002\206\000\000\002\005\002\138\000\000\007\006\r-\002\005\003\006\r-\000\000\005^\000\000\002\005\r-\000\000\000\000\000\000\001\218\000\000\0072\000\000\000\000\000\000\000\000\003j\000\000\000\000\tR\000\000\r-\000\000\000\000\000\000\r-\000\000\000\000\000\000\000\000\003v\000\000\000\000\012\030\000\000\001\198\r-\r-\000\000\000\000\r-\002\194\000\000\000\000\004\n\000\000\029\218\0115\004\014\000\000\004\022\000\000\011r\005\214\000\000\000\000\000\000\r-\000\000\000\000\003f\002\206\000\000\000\000\002\138\005\218\007\006\000\000\000\000\003\006\000\000\000\000\000\000\000\000\005\226\005\230\000\000\000\000\012.\001\218\000\000\0072\000\000\000\000\000\000\000\000\003j\000\000\000\000\tR\000\000\000\000\0115\t\242\000\000\0115\012R\000\000\005\234\000\000\003v\000\000\0115\012\030\004\134\001\198\0115\000\000\000\000\000\000\000\000\002\194\000\000\000\000\004\n\000\000\000\000\0115\004\014\000\000\004\022\000\000\011r\005\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\218\000\000\000\000\000\000\026\246\000\000\000\000\000\000\000\000\005\226\005\230\002\014\000\000\012.\005\217\005\217\000\000\000\000\000\000\005\217\000\000\002\018\005\217\000\000\000\000\000\000\000\000\0115\000\000\001\218\0115\0115\005\217\005\234\005\217\000\000\005\217\0115\005\217\004\134\000\000\0115\000\000\000\000\000\000\000\000\000\000\003\170\000\000\000\000\005\217\000\000\000\000\007r\000\000\001\230\000\000\005\217\005\217\000\000\000\000\002\194\000\000\005\217\000\000\000\000\000\000\005\217\000\000\001\014\005\217\000\000\000\000\000\000\000\000\005\217\005\217\005\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\018\000\000\000\000\000\000\002\150\007v\005\217\005\217\000\000\000\000\005\217\000\000\000\000\001\022\001\026\001\030\001\"\001&\001*\000\000\000\000\005\217\005\217\005\217\000\000\005\217\005\217\001.\000\000\0016\001:\007\222\000\000\000\000\000\000\000\000\001>\000\000\005\217\001B\000\000\005\217\005\217\005\205\005\205\000\000\000\000\000\000\005\205\000\000\000\000\005\205\000\000\005\217\000\000\000\000\001F\001J\001N\001R\001V\005\205\000\000\005\205\001Z\005\205\000\000\005\205\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001b\005\205\000\000\000\000\000\000\000\000\001f\000\000\005\205\005\205\000\000\000\000\000\000\000\000\bN\000\000\001\162\029\022\005\205\000\000\000\000\005\205\000\000\001\166\000\000\001\170\005\205\005\205\000\246\001\174\000\000\001\178\001\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\205\005\205\000\000\000\000\005\205\000\000\000\000\ti\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\205\005\205\005\205\000\000\005\205\005\205\000\000\000\000\nz\000\000\000\000\rJ\ti\000\000\ti\ti\000\000\005\205\000\000\000\000\005\205\005\205\n\178\n\202\n\210\n\186\n\218\000\000\000\000\000\000\000\000\000\000\005\205\000\000\000\000\000\000\000\000\n\226\n\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\001\014\000\000\000\000\n\130\n\194\n\250\011\002\011\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\026\001\018\000\000\000\000\000\000\015~\000\000\000\000\000\000\000\000\011\"\000\000\000\000\000\000\001\022\001\026\001\030\001\"\001&\001*\000\000\000\000\000\000\000\000\011B\000\000\011J\011\n\001.\000\000\0016\001:\ti\011*\000\000\000\000\000\000\001>\000\000\000\000\001B\0112\011:\000\000\003\129\003\129\000\000\000\000\000\000\003\129\000\000\000\000\003\129\000\000\000\000\000\000\000\000\001F\001J\001N\001R\001V\003\129\000\000\003\129\001Z\003\129\000\000\003\129\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001b\003\129\000\000\000\000\000\000\000\000\001f\000\000\003\129\003\129\000\000\000\000\000\000\000\000\005a\000\000\001\162\0292\003\129\000\000\000\000\003\129\000\000\001\166\000\000\001\170\003\129\003\129\003\129\001\174\000\000\001\178\001\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\129\000\000\000\000\000\000\003\129\000\000\b\221\b\221\000\000\000\000\000\000\b\221\000\000\000\000\b\221\003\129\003\129\003\129\000\000\003\129\003\129\000\000\000\000\000\000\b\221\005a\b\221\000\000\b\221\000\000\b\221\000\000\003\129\000\000\000\000\000\000\003\129\000\000\000\000\000\000\000\000\000\000\b\221\000\000\000\000\000\000\000\000\003\129\000\000\b\221\b\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\221\000\000\000\000\b\221\000\000\000\000\000\000\000\000\b\221\b\221\b\221\000\000\000\000\000\000\014\021\014\021\000\000\000\000\000\000\014\021\000\000\000\000\014\021\000\000\b\221\000\000\000\000\000\000\b\221\000\000\000\000\000\000\014\021\000\000\014\021\000\000\014\021\000\000\014\021\b\221\b\221\b\221\000\000\b\221\b\221\000\000\000\000\000\000\000\000\000\000\014\021\000\000\000\000\b\221\000\000\000\000\b\221\014\021\014\021\000\000\b\221\000\000\000\000\004V\000\000\000\000\000\000\014\021\000\000\005^\014\021\b\221\000\000\000\000\000\000\014\021\014\021\014\021\000\000\000\000\000\000\014\025\014\025\000\000\000\000\000\000\014\025\000\000\000\000\014\025\000\000\014\021\000\000\000\000\000\000\014\021\000\000\000\000\000\000\014\025\000\000\014\025\000\000\014\025\000\000\014\025\014\021\014\021\014\021\000\000\014\021\014\021\000\000\000\000\000\000\000\000\004f\014\025\000\000\000\000\000\000\000\000\000\000\014\021\014\025\014\025\000\000\014\021\000\000\000\000\004V\000\000\000\000\000\000\014\025\000\000\000\000\014\025\014\021\000\000\000\000\000\000\014\025\014\025\014\025\000\000\000\000\000\000\003\129\003\129\000\000\000\000\000\000\003\129\000\000\000\000\003\129\000\000\014\025\000\000\000\000\000\000\014\025\000\000\000\000\000\000\003\129\000\000\003\129\000\000\003\129\000\000\003\129\014\025\014\025\014\025\000\000\014\025\014\025\000\000\000\000\000\000\000\000\004f\003\129\000\000\000\000\000\000\000\000\000\000\014\025\003\129\003\129\000\000\014\025\b\001\000\000\005e\b\001\000\000\000\000\003\129\000\000\000\000\003\129\014\025\000\000\000\000\000\000\003\129\003\129\003\129\000\000\000\000\b\001\b\001\000\000\b\001\b\001\000\000\000\000\000\000\000\000\000\000\001\141\003\129\000\000\000\000\000\000\003\129\000\000\000\000\014\150\000\000\000\000\000\000\000\000\nz\000\000\b\001\003\129\003\129\003\129\001\141\003\129\003\129\000\000\000\000\000\000\000\000\005e\n\178\n\202\n\210\n\186\n\218\000\000\003\129\000\246\000\000\000\000\003\129\000\000\000\000\000\000\000\000\n\226\n\234\000\000\000\000\000\000\000\000\003\129\b\001\000\000\000\000\n\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\246\000\000\000\000\000\000\000\000\b\001\000\000\b\001\000\000\n\130\n\194\n\250\011\002\011\018\000\000\000\000\000\000\000\000\000\000\b\001\000\000\011\026\006J\b\001\000\000\000\000\001\141\b\001\000\000\b\001\000\000\011\"\000\000\b\001\r&\000\000\014\154\001\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011B\000\000\011J\011\n\000\000\nz\000\000\000\000\001\141\011*\000\000\001\137\r*\000\000\000\000\000\000\001\141\0112\011:\n\178\n\202\n\210\n\186\n\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\245\000\000\000\000\n\226\n\234\001\245\000\000\001\214\001\245\000\000\000\000\000\000\000\000\n\242\000\000\000\000\tE\000\000\001\245\000\000\000\000\000\246\001\245\000\000\001\245\000\000\000\000\000\000\000\000\000\000\n\130\n\194\n\250\011\002\011\018\000\000\001\245\000\000\000\000\000\000\000\000\000\000\011\026\001\245\001\245\000\000\000\000\001\137\000\000\000\000\000\000\002\158\011\"\001\245\000\000\000\000\001\245\000\000\000\000\000\000\000\000\001\245\001\245\001\245\000\000\000\000\011B\000\000\011J\011\n\000\000\000\000\000\000\000\000\001\137\011*\000\000\001\245\001\245\000\000\001\209\004\194\001\137\0112\011:\001\209\000\000\000\000\001\209\000\000\000\000\000\000\001\245\001\245\000\000\000\000\001\245\001\245\001\209\000\000\000\000\000\000\001\209\003e\001\209\000\000\001\245\000\000\003e\000\000\001\214\003e\000\000\001\245\000\000\000\000\001\209\001\209\001\245\tA\000\000\003e\000\000\001\209\001\245\003e\000\000\003e\000\000\005a\000\000\000\000\000\000\001\209\000\000\000\000\001\209\000\000\000\000\003e\000\000\001\209\001\209\001\209\000\000\000\000\003e\001\241\000\000\000\000\000\000\000\000\000\000\000\000\002\158\000\000\003e\001\209\000\000\003e\000\000\001\209\000\000\000\000\003e\003e\003e\000\000\000\000\000\000\000\000\000\000\001\209\001\209\000\000\000\000\001\209\001\209\000\000\000\000\003e\003e\005a\000\000\004\194\000\000\001\209\000\000\000\000\000\000\000\000\000\000\001\209\001\209\000\000\003e\003e\000\000\001\209\003e\003e\000\000\000\000\000\000\001\209\000\000\t\246\000\000\000\000\003e\000\000\000\254\001\210\001\214\002\026\000\000\003e\000\000\000\000\000\000\000\000\003e\000\000\000\000\019b\000\000\000\000\003e\004\169\000\000\003\198\001\218\001\222\001\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\019f\000\000\000\000\000\000\000\000\000\000\000\000\019\142\000\000\000\000\000\000\000\000\000\000\001\254\002\154\002\182\000\000\000\000\000\000\002\162\018\194\002\194\0042\004>\000\000\018\218\000\181\000\000\004J\000\000\000\000\000\181\000\000\000\000\000\181\000\000\000\000\000\000\000\000\000\000\000\000\020\n\000\000\000\000\000\181\004N\000\181\000\000\000\181\000\000\000\181\000\000\000\000\000\000\000\000\000\000\018\246\020\030\000\000\000\000\000\000\000\000\000\181\000\000\000\000\000\000\000\000\000\000\000\000\000\181\000\000\000\000\000\000\000\181\000\000\000\000\000\000\020.\000\000\000\181\000\000\000\000\000\181\000\000\004\134\000\000\000\000\000\181\000\181\000\246\000\249\000\000\000\000\000\000\000\000\000\249\000\181\000\181\000\249\000\000\000\000\000\000\000\000\000\181\000\000\000\000\000\000\000\181\000\249\000\000\000\249\000\000\000\249\000\000\000\249\000\000\000\000\000\000\000\181\000\181\000\000\000\000\000\181\000\181\000\000\000\000\000\249\000\000\000\000\000\000\000\000\000\000\000\181\000\249\000\000\000\000\000\000\000\249\000\181\000\181\000\000\000\000\000\000\000\249\000\000\000\000\000\249\000\000\000\181\000\000\000\181\000\249\000\249\000\246\000\189\000\000\000\000\000\000\000\000\000\189\000\249\000\249\000\189\000\000\000\000\000\000\000\000\000\249\000\000\000\000\000\000\000\249\000\189\000\000\000\189\000\000\000\189\000\000\000\189\000\000\000\000\000\000\000\249\000\249\000\000\000\000\000\249\000\249\000\000\000\000\000\189\000\000\000\000\000\000\000\000\000\000\000\249\000\189\000\000\000\000\000\000\000\189\000\249\000\249\000\000\000\000\000\000\000\189\000\000\000\000\000\189\000\000\000\249\000\000\000\249\000\189\000\189\000\246\000\185\000\000\000\000\000\000\000\000\000\185\000\189\000\189\000\185\000\000\000\000\000\000\000\000\000\189\000\000\000\000\000\000\000\189\000\185\000\000\000\185\000\000\000\185\000\000\000\185\000\000\000\000\000\000\000\189\000\189\000\000\000\000\000\189\000\189\000\000\000\000\000\185\000\000\000\000\000\000\000\000\000\000\000\189\000\185\000\000\000\000\000\000\000\185\000\189\000\189\000\000\000\000\000\000\000\185\000\000\000\000\000\185\000\000\000\189\000\000\000\189\000\185\000\185\000\246\014\017\014\017\000\000\000\000\000\000\014\017\000\185\000\185\014\017\000\000\000\000\000\000\000\000\000\185\000\000\000\000\000\000\000\185\014\017\000\000\014\017\000\000\014\017\000\000\014\017\000\000\000\000\000\000\000\185\000\185\000\000\000\000\000\185\000\185\000\000\000\000\014\017\000\000\000\000\000\000\000\000\000\000\000\185\014\017\014\017\000\000\000\000\000\000\000\185\000\185\000\000\000\000\000\000\014\017\000\000\000\000\014\017\000\000\000\185\000\000\000\185\014\017\014\017\014\017\014\r\014\r\000\000\000\000\000\000\014\r\000\000\000\000\014\r\000\000\000\000\000\000\000\000\014\017\000\000\000\000\000\000\014\017\014\r\000\000\014\r\000\000\014\r\000\000\014\r\000\000\000\000\000\000\014\017\014\017\014\017\000\000\014\017\014\017\000\000\000\000\014\r\000\000\000\000\000\000\000\000\000\000\000\000\014\r\014\r\014\017\000\000\000\000\000\000\014\017\000\000\000\000\000\000\014\r\000\000\000\000\014\r\000\000\005^\000\000\014\017\014\r\014\r\014\r\b\225\b\225\000\000\000\000\000\000\b\225\000\000\000\000\b\225\000\000\000\000\000\000\000\000\014\r\000\000\000\000\000\000\014\r\b\225\000\000\b\225\000\000\b\225\000\000\b\225\000\000\000\000\000\000\014\r\014\r\014\r\000\000\014\r\014\r\000\000\000\000\b\225\000\000\000\000\000\000\000\000\000\000\007\186\b\225\b\225\014\r\000\000\000\000\000\000\014\r\000\000\000\000\000\000\b\225\000\000\000\000\b\225\ti\000\000\000\000\014\r\b\225\b\225\000\246\000\000\001\210\001\214\000\000\000\000\000\000\000\000\000\000\000\000\nz\000\000\000\000\rJ\b\225\000\000\ti\000\000\b\225\000\000\000\000\001\218\001\222\000\000\n\178\n\202\n\210\n\186\n\218\b\225\b\225\b\225\000\000\b\225\b\225\000\000\000\000\000\000\000\000\n\226\n\234\000\000\000\000\b\225\000\000\001\254\b\225\002\158\000\000\n\242\b\225\002\162\000\000\002\194\0042\004>\000\000\000\246\000\000\000\000\004J\b\225\0176\007]\000\000\000\000\n\130\n\194\n\250\011\002\011\018\000\000\000\000\000\000\000\000\000\000\000\000\004N\011\026\nz\000\000\000\000\007]\015\234\000\000\015\250\007]\000\000\011\"\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\000\000\000\000\000\000\011B\000\000\011J\011\n\000\000\000\000\n\226\n\234\000\000\011*\000\000\000\000\000\000\000\000\000\000\000\000\n\242\0112\011:\000\000\000\000\000\000\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\130\n\194\n\250\011\002\011\018\000\000\000\000\000\000\001\241\000\000\000\000\007]\011\026\001\241\000\000\001\214\001\241\015\234\000\000\000\000\000\000\000\000\011\"\000\000\tA\000\000\001\241\000\000\000\000\000\000\001\241\000\000\001\241\000\000\000\000\000\000\011B\000\000\011J\011\n\000\000\000\000\000\000\000\000\001\241\011*\000\000\000\000\000\000\000\000\000\000\001\241\000\000\0112\011:\000\000\000\000\000\000\000\000\002\158\000\000\001\241\018\018\000\000\001\241\000\000\000\000\000\000\000\000\001\241\001\241\001\241\000\000\000\000\000\000\000\000\000\000\000\000\nz\000\000\000\000\000\000\018\022\000\000\000\000\001\241\001\241\000\000\000\000\004\194\000\000\000\000\n\178\n\202\n\210\n\186\n\218\000\000\000\000\000\000\001\241\001\241\000\000\000\000\001\241\001\241\000\000\n\226\n\234\000\000\000\000\000\000\000\000\000\000\001\241\000\000\000\000\n\242\000\000\000\000\000\000\001\241\000\000\000\000\000\000\000\246\001\241\000\000\000\000\000\000\000\000\000\000\001\241\000\000\n\130\n\194\n\250\011\002\011\018\000\000\006\005\006\005\000\000\000\000\000\000\006\005\011\026\000\000\006\005\000\000\000\000\015~\000\000\000\000\000\000\000\000\011\"\000\000\006\005\000\000\006\005\000\000\006\005\000\000\006\005\000\000\000\000\000\000\000\000\000\000\011B\018\026\011J\011\n\018*\000\000\006\005\000\000\015\142\011*\000\000\000\000\000\000\006\005\006\005\000\000\000\000\0112\011:\bN\000\000\000\000\000\000\006\005\000\000\000\000\006\005\000\000\000\000\000\000\000\000\006\005\006\005\000\246\006\001\007\142\000\000\000\000\000\000\006\001\000\000\000\000\006\001\000\000\000\000\000\000\000\000\006\005\000\000\000\000\000\000\006\005\006\001\000\000\006\001\000\000\006\001\000\000\006\001\000\000\000\000\000\000\006\005\006\005\006\005\000\000\006\005\006\005\000\000\000\000\006\001\000\000\000\000\000\000\000\000\000\000\000\000\006\001\007\250\006\005\000\000\000\000\000\000\006\005\000\000\000\000\000\000\006\001\000\000\000\000\006\001\000\000\000\000\000\000\006\005\006\001\006\001\000\246\006\029\006\029\000\000\000\000\000\000\006\029\000\000\000\000\006\029\000\000\000\000\000\000\000\000\006\001\000\000\000\000\000\000\006\001\006\029\000\000\006\029\000\000\006\029\000\000\006\029\000\000\000\000\000\000\006\001\006\001\006\001\000\000\006\001\006\001\000\000\000\000\006\029\000\000\000\000\000\000\000\000\000\000\000\000\006\029\006\029\006\001\000\000\000\000\000\000\006\001\000\000\000\000\000\000\006\029\000\000\000\000\006\029\000\000\000\000\000\000\006\001\006\029\006\029\006\029\006\025\007\142\000\000\000\000\000\000\006\025\000\000\000\000\006\025\000\000\000\000\000\000\000\000\006\029\000\000\000\000\000\000\006\029\006\025\000\000\006\025\000\000\006\025\000\000\006\025\000\000\000\000\000\000\006\029\006\029\006\029\000\000\006\029\006\029\000\000\000\000\006\025\000\000\000\000\000\000\000\000\000\000\000\000\006\025\007\250\006\029\000\000\000\000\000\000\006\029\000\000\000\000\000\000\006\025\000\000\000\000\006\025\000\000\000\000\000\000\007\242\006\025\006\025\000\246\000\000\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\025\000\000\000\000\000\000\006\025\003f\002\206\000\000\000\000\002\138\000\000\007\006\000\000\000\000\003\006\006\025\006\025\006\025\000\000\006\025\006\025\000\000\000\000\000\000\001\218\000\000\0072\000\000\000\000\000\000\000\000\003j\006\025\000\000\tR\000\000\006\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003v\000\000\006\025\011b\000\000\001\198\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\004\n\000\000\000\000\000\000\004\014\000\000\004\022\000\000\011r\005\214\000\000\000\000\000\000\000\000\000\000\000\000\003f\002\206\000\000\000\000\002\138\005\218\007\006\000\000\000\000\003\006\000\000\000\000\000\000\000\000\005\226\005\230\000\000\000\000\011\182\001\218\000\000\0072\000\000\000\000\000\000\000\000\003j\000\000\000\000\tR\000\000\000\000\000\000\t\242\000\000\000\000\011\234\000\000\005\234\000\000\003v\000\000\000\000\011b\004\134\001\198\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\004\n\000\000\000\000\000\000\004\014\000\000\004\022\000\000\011r\005\214\000\000\000\000\000\000\000\000\000\000\000\000\003f\002\206\000\000\000\000\002\138\005\218\007\006\000\000\000\000\003\006\000\000\000\000\000\000\000\000\005\226\005\230\000\000\000\000\011\182\001\218\000\000\0072\000\000\000\000\000\000\000\000\003j\000\000\000\000\tR\000\000\000\000\000\000\t\242\000\000\000\000\t\254\000\000\005\234\000\000\003v\000\000\000\000\012\030\004\134\001\198\000\000\000\000\000\000\r\202\000\000\002\194\000\000\000\000\004\n\000\000\000\000\000\000\004\014\000\000\004\022\000\000\011r\005\214\000\000\nz\000\000\000\000\rJ\000\000\000\000\000\000\ti\000\000\000\000\005\218\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\005\226\005\230\000\000\000\000\012.\000\000\000\000\003a\000\000\000\000\n\226\n\234\003a\000\000\001\214\003a\000\000\000\000\000\000\t\242\n\242\000\000\t\254\000\000\005\234\003a\000\000\000\000\000\246\003a\004\134\003a\000\000\000\000\000\000\000\000\000\000\n\130\n\194\n\250\011\002\011\018\000\000\003a\000\000\000\000\000\000\000\000\000\000\011\026\003a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\158\011\"\003a\000\000\000\000\003a\000\000\000\000\000\000\000\000\003a\003a\003a\000\000\000\000\011B\000\000\011J\011\n\000\000\000\000\000\000\000\000\000\000\011*\000\000\003a\003a\000\000\001M\004\194\000\000\0112\011:\001M\000\000\000\000\001M\000\000\000\000\000\000\003a\003a\000\000\000\000\003a\003a\001M\000\000\001M\000\000\001M\000\000\001M\000\000\003a\000\000\000\000\000\000\000\000\000\000\000\000\003a\000\000\000\000\001M\000\000\003a\000\000\000\000\000\000\000\000\001M\003a\000\000\000\000\001M\000\000\000\000\000\000\000\000\000\000\001M\000\000\000\000\001M\000\000\000\000\000\000\000\000\001M\001M\000\246\001I\000\000\000\000\000\000\000\000\001I\000\000\001M\001I\000\000\000\000\000\000\000\000\001M\000\000\000\000\000\000\001M\001I\000\000\001I\000\000\001I\000\000\001I\000\000\000\000\000\000\001M\001M\001M\000\000\001M\001M\000\000\000\000\001I\000\000\000\000\000\000\000\000\000\000\001M\001I\000\000\000\000\000\000\001I\000\000\001M\000\000\000\000\000\000\001I\000\000\000\000\001I\000\000\000\000\000\000\001M\001I\001I\000\246\000\000\000\000\000\000\001\133\000\000\000\000\000\000\001I\001\133\000\000\rm\001\133\000\000\001I\000\000\000\000\000\000\001I\000\000\rm\000\000\001\133\000\000\001\133\000\000\001\133\000\000\001\133\001I\001I\001I\000\000\001I\001I\000\000\000\000\000\000\000\000\000\000\001\133\000\000\000\000\001I\000\000\000\000\000\000\001\133\rm\000\000\001I\000\000\000\000\000\000\000\000\rm\000\000\000\000\000\000\000\000\001\133\001I\000\000\000\000\000\000\001\133\001\133\001\133\0019\000\000\000\000\000\000\000\000\0019\000\000\000\157\0019\000\000\000\000\000\000\000\000\001\133\000\000\000\000\000\157\rm\0019\000\000\0019\000\000\0019\000\000\0019\000\000\000\000\000\000\001\133\001\133\001\133\000\000\001\133\001\133\000\000\000\000\0019\000\000\000\000\000\000\000\000\000\000\000\000\0019\000\157\000\000\000\000\000\000\000\000\001\133\000\000\000\157\000\000\000\000\000\000\000\000\0019\000\000\000\000\000\000\001\133\0019\0019\0019\000\000\001\253\000\000\000\000\000\000\000\000\001\253\000\000\017\026\001\253\000\000\002\138\000\000\0019\000\000\000\000\000\000\000\157\000\000\001\253\000\000\000\000\000\000\001\253\000\000\001\253\000\000\000\000\0019\0019\0019\000\000\0019\0019\000\000\000\000\000\000\001\253\000\000\000\000\000\000\000\000\000\000\000\000\001\253\000\000\000\000\000\000\000\000\0019\017\030\000\000\000\000\000\000\001\253\000\000\000\000\001\253\000\000\000\000\0019\000Y\001\253\001\253\000\000\017*\000Y\000\000\000Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Y\001\253\000\000\000Y\000\000\001\253\000\000\000Y\000Y\000\000\b\253\000\000\000\000\000\000\000\000\005\230\001\253\001\253\000\000\000\000\001\253\001\253\000\000\000\000\000\000\000\000\000\000\000\000\000Y\000\000\001\253\000Y\000\000\000\000\000\000\000Y\000\000\001\253\000\000\000\000\000Y\000\000\000\000\000\000\000\000\000Y\000Y\000Y\001\253\000\000\000\000\000\000\004\181\000\000\000Y\000Y\000\000\000\254\003f\002\206\002\210\000\000\002\138\000\000\007\006\000Y\000\000\003\006\000Y\000\000\003\194\000\000\000\000\000\000\004\181\000\000\003\198\001\218\000Y\0072\000\000\000Y\000\000\000\000\003j\000\000\b\253\tR\003\202\000\000\000Y\000\000\000\000\000Y\000\000\018^\t\166\000\000\003v\000\000\000\000\014\182\000\000\001\198\000\000\026\018\000Y\000\000\018\194\002\194\000\000\000\000\004\n\018\218\004\161\007\142\004\014\000\000\004\022\004\161\011r\005\214\004\161\000\000\000\000\000\000\000\000\000\000\000\000\018\226\000\000\000\000\004\161\005\218\000\000\000\000\004\161\000\000\004\161\000\000\000\000\000\000\005\226\005\230\018\246\019\"\000\000\000\000\004\181\004\181\004\161\000\000\000\000\000\000\000\000\000\000\000\000\004\161\007\250\000\000\000\000\004\161\000\000\bN\014\198\023J\005\234\004\161\000\000\000\000\004\161\r&\004\134\000\000\000\000\004\161\002\242\000\246\000\000\000\000\000\000\000\000\000\000\000\000\004\161\004\161\000\000\nz\000\000\000\000\000\000\004\161\004\161\000\000\014\002\004\161\000\000\000\000\000\000\000\000\000\000\n\178\n\202\n\210\n\186\n\218\004\161\004\161\000\000\000\000\004\161\004\161\000\000\003Y\000\000\000\000\n\226\n\234\003Y\000\000\004\161\003Y\000\000\000\000\000\000\000\000\n\242\004\161\000\000\000\000\000\000\003Y\027>\000\000\000\246\003Y\000\000\003Y\004\161\000\000\000\000\000\000\000\000\n\130\n\194\n\250\011\002\011\018\000\000\003Y\0172\000\000\000\000\000\000\000\000\011\026\003Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\"\003Y\000\000\000\000\003Y\000\000\000\000\000\000\000\000\003Y\003Y\003Y\000\000\000\000\011B\000\000\011J\011\n\000\000\000\000\000\000\000\000\000\000\011*\000\000\003Y\000\000\000\000\000\000\003Y\000\000\0112\011:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003Y\003Y\027F\000\000\003Y\003Y\000\000\000\000\000\000\003f\002\206\000\000\000\000\002\138\003Y\007\006\000\000\000\000\003\006\000\000\017\154\003Y\000\000\000\000\000\000\000\000\003Y\000\000\001\218\000\000\0072\000\000\003Y\000\000\000\000\003j\000\000\000\000\tR\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003f\002\206\003v\000\000\002\138\023b\007\006\001\198\000\000\003\006\000\000\000\000\000\000\002\194\000\000\000\000\004\n\000\000\000\000\001\218\004\014\0072\004\022\000\000\011r\005\214\003j\000\000\000\000\tR\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\218\000\000\000\000\003v\000\000\000\000\012\030\000\000\001\198\005\226\005\230\000\000\000\000\023f\002\194\000\000\000\000\004\n\000\000\000\000\000\000\004\014\000\000\004\022\000\000\011r\005\214\000\000\000\000\000\000\000\000\025\198\000\000\005\234\000\000\000\000\003f\002\206\005\218\004\134\002\138\000\000\007\006\000\000\000\000\003\006\000\000\005\226\005\230\000\000\000\000\012.\000\000\000\000\000\000\001\218\000\000\0072\000\000\000\000\000\000\000\000\003j\000\000\000\000\tR\000\000\000\000\000\000\024\002\000\000\005\234\000\000\000\000\004\137\004\137\003v\004\134\004\137\012\030\000\000\001\198\000\000\004\137\000\000\000\000\000\000\002\194\000\000\004\137\004\n\000\000\000\000\004\137\004\014\000\000\004\022\000\000\011r\005\214\004\137\024\178\000\000\000\000\024\202\000\000\000\000\000\000\000\000\000\000\000\000\005\218\000\000\000\000\004\137\000\000\000\000\004\137\004\137\004\137\005\226\005\230\000\000\006\"\012.\004\137\000\000\000\000\004\137\003f\002\206\000\246\004\137\002\138\004\137\004\137\000\000\004\137\003\006\000\000\000\000\000\000\024b\006&\005\234\004\018\000\000\000\000\001\218\004\137\004\134\000\000\000\000\000\000\000\000\003j\000\000\000\000\004\137\004\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003v\000\000\n\002\003\130\000\000\001\198\000\000\000\000\001\210\001\214\012V\002\194\000\000\004\137\004\n\000\000\000\000\000\000\004\014\004\137\004\022\005\202\000\000\005\214\t\133\000\000\000\000\001\218\002\174\001\238\003f\002\206\000\000\000\000\002\138\005\218\000\000\001\250\000\000\003\006\000\000\000\000\000\000\000\000\005\226\005\230\t\133\006*\000\000\001\218\000\000\001\254\002\154\002\182\000\000\000\000\003j\002\162\000\000\002\194\0042\004>\000\000\000\000\000\000\006v\004J\000\000\005\234\000\000\003v\000\000\t:\003\130\004\134\001\198\000\000\000\000\000\000\000\000\000\000\002\194\000\000\004N\004\n\000\000\000\000\000\000\004\014\000\000\004\022\005\202\000\000\005\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003f\002\206\005\218\000\000\002\138\000\000\007\006\000\000\000\000\003\006\000\000\005\226\005\230\000\000\006*\000\000\000\000\000\000\000\000\001\218\000\000\0072\000\000\000\000\000\000\000\000\003j\000\000\000\000\tR\000\000\000\000\000\000\000\000\000\000\005\234\000\000\t\133\024\250\000\000\003v\004\134\000\000\023b\000\000\001\198\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\004\n\000\000\003Y\000\000\004\014\000\000\004\022\003Y\011r\005\214\003Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003Y\005\218\000\000\000\000\003Y\000\000\003Y\000\000\000\000\000\000\005\226\005\230\000\000\000\000\000\000\000\000\000\000\000\000\003Y\0172\000\000\000\000\000\000\000\000\re\003Y\000\000\000\000\000\000\re\000\000\000\000\re\000\000\005\234\003Y\000\000\000\000\003Y\000\000\004\134\000\000\re\003Y\003Y\003Y\re\000\000\re\000\000\000\000\000\000\000\000\000\000\005Y\000\000\000\000\000\000\000\000\003Y\re\000\000\000\000\003Y\000\000\000\000\000\000\re\000\000\000\000\000\000\000\000\000\000\000\000\003Y\003Y\027v\re\003Y\003Y\re\000\000\000\000\000\000\000\000\re\re\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\154\003Y\000\000\000\000\000\000\000\000\003Y\re\000\000\000\000\000\000\re\003f\002\206\000\000\000\000\002\138\000\000\007\006\000\000\000\000\003\006\re\re\002\130\000\000\re\re\000\000\000\000\000\000\001\218\000\000\0072\000\000\000\000\re\000\000\003j\000\000\028^\tR\000\000\re\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003v\000\000\re\t\142\000\000\001\198\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\004\n\000\000\005\177\000\000\004\014\000\000\004\022\005\177\011r\005\214\005\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\177\005\218\000\000\000\000\005\177\000\000\005\177\000\000\000\000\000\000\005\226\005\230\000\000\000\000\000\000\000\000\000\000\000\000\005\177\000\000\000\000\000\000\000\000\000\000\000\000\005\177\000\000\000\000\000\000\000\000\000\000\bN\000\000\000\000\005\234\005\177\000\000\000\000\005\177\000\000\004\134\000\000\000\000\005\177\005\177\000\246\000\000\005\181\000\000\000\000\000\000\000\000\005\181\000\000\000\000\005\181\000\000\000\000\000\000\005\177\005\177\000\000\000\000\005\177\000\000\005\181\000\000\000\000\000\000\005\181\000\000\005\181\000\000\000\000\005\177\005\177\000\000\000\000\005\177\005\177\000\000\000\000\000\000\005\181\000\000\000\000\000\000\000\000\000\000\000\000\005\181\000\000\000\000\003Y\000\000\005\177\bN\000\000\003Y\000\000\005\181\003Y\000\000\005\181\000\000\000\000\005\177\000\000\005\181\005\181\000\246\003Y\000\000\000\000\000\000\003Y\000\000\003Y\000\000\000\000\000\000\000\000\000\000\000\000\005\181\005\181\000\000\000\000\005\181\003Y\0172\000\000\000\000\000\000\000\000\000\000\003Y\000\000\000\000\005\181\005\181\000\000\000\000\005\181\005\181\000\000\003Y\000\000\000\000\003Y\000\000\000\000\000\000\000\000\003Y\003Y\003Y\006m\000\000\000\000\005\181\000\000\006m\000\000\000\000\006m\000\000\000\000\000\000\000\000\003Y\005\181\000\000\000\000\003Y\006m\000\000\000\000\000\000\006m\000\000\006m\000\000\000\000\000\000\003Y\003Y\0192\000\000\003Y\003Y\000\000\000\000\006m\000\000\000\000\000\000\000\000\000\000\000\000\006m\000\000\000\000\000\000\000\000\017\154\003Y\000\000\000\000\000\000\006m\000\000\000\000\006m\000\000\000\000\027\030\000\000\006m\006m\000\246\000\000\003f\002\206\000\000\000\000\002\138\000\000\000\000\000\000\000\000\003\006\000\000\000\000\006m\000\000\000\000\000\000\006m\000\000\000\000\001\218\000\000\000\000\000\000\000\000\000\000\000\000\003j\006m\006m\022\238\000\000\006m\006m\000\000\000\000\000\000\000\000\006\181\000\000\000\000\003v\006m\000\000\003\130\002\206\001\198\000\000\002\138\006m\000\000\000\000\002\194\003\006\000\000\004\n\000\000\000\000\006\181\004\014\006m\004\022\005\202\001\218\005\214\000\000\000\000\003\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\218\000\000\000\000\003\014\000\000\000\000\000\000\000\000\000\000\005\226\005\230\003B\006*\001\198\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\003J\000\000\000\000\000\000\b\138\b\142\b\154\000\000\000\000\005\214\000\000\005\234\006N\006\242\000\000\t:\000\000\004\134\003f\002\206\000\000\000\000\002\138\000\000\000\000\000\000\000\000\003\006\000\000\000\000\005\226\005\230\000\000\000\000\006\178\000\000\000\000\001\218\000\000\000\000\000\000\000\000\000\000\000\000\003j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\234\b\162\000\000\000\000\003v\b\186\004\134\003\130\000\000\001\198\000\000\000\000\000\000\006\142\000\000\002\194\000\000\000\000\004\n\003f\002\206\000\000\004\014\002\138\004\022\005\202\000\000\005\214\003\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\218\005\218\000\000\000\000\000\000\000\000\000\000\003j\000\000\000\000\005\226\005\230\000\000\006*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003v\000\000\n\002\003\130\000\000\001\198\000\000\000\000\001\210\001\214\000\000\002\194\000\000\005\234\004\n\000\000\000\000\000\000\004\014\004\134\004\022\005\202\000\000\005\214\006\154\000\000\000\000\001\218\001\222\001\238\003f\002\206\000\000\000\000\002\138\005\218\000\000\001\250\000\000\003\006\000\000\000\000\000\000\000\000\005\226\005\230\000\000\006*\000\000\001\218\000\000\001\254\002\154\002\182\000\000\000\000\003j\002\162\000\000\002\194\0042\004>\000\000\000\000\000\000\000\000\004J\000\000\005\234\000\000\003v\000\000\000\000\003\130\004\134\001\198\000\000\000\000\000\000\006\185\000\000\002\194\000\000\004N\004\n\003f\002\206\000\000\004\014\002\138\004\022\005\202\000\000\005\214\003\006\000\000\000\000\000\000\000\000\006\185\000\000\000\000\000\000\000\000\001\218\005\218\000\000\000\000\000\000\000\000\000\000\003j\000\000\000\000\005\226\005\230\000\000\006*\000\000\000\000\004\130\000\000\004\134\000\000\000\000\003v\000\000\000\000\003\130\000\000\001\198\000\000\000\000\0075\0075\000\000\002\194\000\000\005\234\004\n\000\000\000\000\000\000\004\014\004\134\004\022\005\202\000\000\005\214\012\182\000\000\000\000\0075\0075\0075\003f\002\206\000\000\000\000\002\138\005\218\000\000\0075\000\000\003\006\000\000\000\000\000\000\000\000\005\226\005\230\000\000\000\000\000\000\001\218\000\000\0075\0075\0075\000\000\000\000\003j\0075\000\000\0075\0075\0075\000\000\000\000\000\000\000\000\0075\000\000\005\234\000\000\003v\000\000\000\000\003\130\004\134\001\198\000\000\000\000\000\000\012\194\000\000\002\194\000\000\0075\004\n\003f\002\206\000\000\004\014\002\138\004\022\005\202\000\000\005\214\003\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\218\005\218\000\000\000\000\000\000\000\000\000\000\003j\000\000\000\000\005\226\005\230\000\000\006*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003v\000\000\005F\003\130\000\000\001\198\000\000\000\000\001\210\001\214\000\000\002\194\000\000\005\234\004\n\000\000\000\000\000\000\004\014\004\134\004\022\005\202\000\000\005\214\012\206\000\000\000\000\001\218\001\222\001\238\003f\002\206\000\000\000\000\002\138\005\218\000\000\001\250\000\000\003\006\020^\000\000\000\000\000\000\005\226\005\230\000\000\006*\000\000\001\218\000\000\001\254\000\000\021\198\000\000\020\230\003j\002\162\000\000\002\194\0042\004>\000\000\000\000\000\000\000\000\021\214\000\000\005\234\000\000\003v\000\000\000\000\003\130\004\134\001\198\000\000\000\000\000\000\000\000\000\000\002\194\006\221\004N\004\n\000\000\000\000\000\000\004\014\002\206\004\022\005\202\002\138\005\214\000\000\000\000\000\000\003\006\000\000\000\000\000\000\000\000\006\221\000\000\000\000\005\218\000\000\001\218\000\000\000\000\000\000\003\n\000\000\000\000\005\226\005\230\000\000\006*\000\000\000\000\000\000\000\000\000\000\003\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003B\000\000\001\198\000\000\000\000\000\000\000\000\005\234\002\194\000\000\000\000\003J\000\000\004\134\000\000\b\138\b\142\b\154\b\157\b\157\005\214\000\000\b\157\000\000\000\000\000\000\000\000\b\157\000\000\000\000\000\000\000\000\000\000\017\202\000\000\000\000\000\000\b\157\000\000\000\000\000\000\005\226\005\230\000\000\b\157\000\000\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\157\000\000\000\000\b\157\b\157\b\157\000\000\005\234\b\162\000\000\000\000\b\157\b\186\004\134\b\157\000\000\000\000\000\000\b\157\000\000\b\157\b\157\000\000\b\157\000\000\000\000\000\000\000\000\007e\007\142\000\000\000\000\000\000\007e\000\000\b\157\007e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\157\b\157\007e\000\000\000\000\000\000\007e\001\221\007e\000\000\000\000\000\000\001\221\000\000\000\000\001\221\000\000\000\000\000\000\000\000\007e\000\000\000\000\000\000\b\157\001\221\000\000\007e\007\250\001\221\b\157\001\221\000\000\000\000\000\000\000\000\000\000\007e\000\000\000\000\007e\000\000\000\000\001\221\000\000\007e\007e\000\246\000\000\002\001\001\221\000\000\000\000\000\000\002\001\000\000\000\000\002\001\000\000\000\000\001\221\007e\000\000\001\221\000\000\007e\000\000\002\001\001\221\001\221\001\221\002\001\000\000\002\001\000\000\000\000\007e\007e\000\000\000\000\007e\007e\000\000\000\000\001\221\002\001\000\000\000\000\001\221\000\000\000\000\000\000\002\001\000\000\000\000\000\000\000\000\007e\000\000\001\221\001\221\000\000\002\001\001\221\001\221\002\001\000\000\000\000\000\000\019>\002\001\002\001\000\000\006q\000\000\000\000\000\000\000\000\006q\000\000\001\221\006q\000\000\000\000\000\000\001\221\002\001\000\000\000\000\000\000\002\001\006q\000\000\000\000\000\000\006q\000\000\006q\000\000\000\000\000\000\002\001\002\001\000\000\000\000\002\001\002\001\000\000\000\000\006q\000\000\000\000\000\000\000\000\000\000\002\001\006q\000\000\000\000\000\000\000\000\000\000\002\001\000\000\000\000\000\000\006q\022\202\000\000\006q\000\000\000\000\000\000\002\001\006q\006q\000\246\re\000\000\000\000\000\000\000\000\re\000\000\000\000\re\000\000\000\000\000\000\000\000\006q\000\000\000\000\000\000\006q\re\000\000\000\000\000\000\re\000\000\re\000\000\000\000\000\000\006q\006q\005Y\000\000\006q\006q\000\000\r\029\re\002\206\r\029\000\000\029\234\000\000\006q\re\000\000\029\238\000\000\000\000\r\029\006q\000\000\000\000\000\000\000\000\r\029\000\000\re\000\000\000\000\000\000\006q\re\re\000\000\000\000\000\000\r\029\000\000\000\000\000\000\000\000\000\000\000\000\r\029\000\000\000\000\000\000\re\000\000\001\n\000\000\001\198\000\000\r\029\000\000\000\000\r\029\000\000\000\000\000\000\000\000\r\029\re\re\002\130\000\000\re\re\000\000\029\242\000\000\000\000\000\000\000\000\000\000\000\000\re\r\029\001\210\002\134\028\150\r\029\002\138\re\000\000\000\000\000\000\000\000\000\000\000\000\000\000\029\246\r\029\r\029\re\000\000\r\029\001\218\001\222\001\238\002\142\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\r\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\146\002\154\002\182\000\000\000\000\000\000\002\162\000\000\002\194\0042\004>\004\161\000\000\000\000\000\000\022\162\004\161\022\166\000\000\004\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\161\000\000\000\000\004N\004\161\000\000\004\161\000\000\000\000\000\000\000\000\000\000\000\000\005\230\000\000\000\000\000\000\000\000\004\161\000\000\000\000\000\000\000\000\022\178\000\000\004\161\000\000\000\000\001q\000\000\000\000\000\000\000\000\001q\000\000\004\161\001q\000\000\004\161\000\000\022\182\000\000\000\000\004\161\002\242\000\000\001q\000\000\001q\000\000\001q\000\000\001q\000\000\000\000\000\000\000\000\000\000\000\000\004\161\000\000\000\000\000\000\004\161\001q\000\000\000\000\000\000\000\000\000\000\000\000\001q\000\000\000\000\004\161\004\161\000\000\000\000\004\161\004\161\000\000\000\000\000\000\000\000\001q\000\000\000\000\000\000\007\186\001q\001q\000\246\000\237\000\000\000\000\004\161\000\000\000\237\000\000\000\000\000\237\000\000\000\000\000\000\000\000\001q\004\161\000\000\000\000\000\000\000\237\000\000\000\000\000\000\000\237\000\000\000\237\000\000\000\000\000\000\001q\001q\001q\000\000\001q\001q\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\241\000\000\000\000\001q\000\000\000\241\000\000\000\237\000\241\000\000\000\237\000\000\000\000\000\000\001q\000\237\000\237\000\246\000\241\000\000\000\000\000\000\000\241\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\000\000\237\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\000\000\000\000\237\000\237\000\000\000\000\000\237\000\237\000\000\000\241\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\241\000\241\000\246\000\000\001\210\002\134\000\237\000\000\002\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\237\000\000\000\000\000\241\000\000\000\000\001\218\001\222\001\238\000\000\000\000\000\000\000\000\000\000\000\241\000\241\001\250\000\000\000\241\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\146\002\154\002\182\000\000\000\000\000\241\002\162\000\000\002\194\0042\004>\000\000\000\000\000\000\000\000\022\162\000\241\028B\000\000\007a\000\000\000\000\000\000\000\000\007a\000\000\000\000\007a\000\000\000\000\000\000\000\000\004N\000\000\000\000\000\000\000\000\007a\000\000\000\000\000\000\007a\005\230\007a\000\000\000\000\006e\000\000\000\000\000\000\000\000\006e\028N\000\000\006e\007a\000\000\000\000\000\000\000\000\000\000\019\018\007a\000\000\006e\000\000\000\000\000\000\006e\022\182\006e\000\000\007a\000\000\000\000\007a\000\000\000\000\000\000\000\000\007a\007a\006e\000\000\000\000\000\000\000\000\000\000\000\000\006e\000\000\000\000\000\000\000\000\000\000\000\000\007a\000\000\000\000\006e\007a\000\000\006e\000\000\000\000\000\000\000\000\006e\006e\000\000\000\000\007a\007a\018r\000\000\007a\007a\000\000\000\000\000\000\000\000\000\000\000\000\006e\000\000\000\000\000\000\006e\005\189\007\142\000\000\000\000\007a\005\189\000\000\000\000\005\189\000\000\006e\006e\000\000\000\000\006e\006e\000\000\000\000\005\189\000\000\000\000\000\000\005\189\000\000\005\189\000\000\000\000\000\000\000\000\012\205\000\000\006e\000\000\000\000\012\205\000\000\005\189\012\205\000\000\000\000\000\000\000\000\000\000\005\189\007\250\000\000\000\000\012\205\000\000\000\000\000\000\012\205\000\000\012\205\000\000\000\000\005\189\000\000\000\000\000\000\000\000\005\189\005\189\000\246\000\000\012\205\000\000\000\000\000\000\000\000\000\000\000\000\012\205\000\000\000\000\000\000\000\000\005\189\000\000\000\000\000\000\000\000\012\205\000\000\000\000\012\205\000\000\000\000\000\000\000\000\012\205\000\000\005\189\005\189\000\000\000\000\005\189\005\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\205\nn\000\000\000\000\012\205\003f\002\206\005\189\000\000\002\138\000\000\000\000\000\000\000\000\003\006\012\205\012\205\000\000\000\000\012\205\012\205\000\000\000\000\000\000\001\218\000\000\000\000\000\000\000\000\000\000\000\000\003j\000\000\000\000\000\000\000\000\012\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003v\000\000\011R\011v\004y\001\198\000\000\000\000\000\000\004y\000\000\002\194\004y\000\000\004\n\000\000\000\000\000\000\004\014\000\000\004\022\000\000\004y\005\214\000\000\000\000\004y\000\000\004y\000\000\000\000\000\000\000\000\000\000\000\000\005\218\000\000\000\000\000\000\000\000\004y\000\000\000\000\000\000\005\226\005\230\000\000\004y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004y\000\000\000\000\004y\000\000\004\161\000\000\000\000\004y\000\000\004\161\005\234\000\000\004\161\000\000\000\000\000\000\004\134\000\000\000\000\000\000\000\000\000\000\004\161\004y\000\000\000\000\004\161\004y\004\161\000\000\000\000\004\161\000\000\000\000\004\161\000\000\000\000\000\000\004y\004y\004\161\000\000\004y\004y\004\161\000\000\000\000\004\161\004\161\004q\004\161\000\000\000\000\004V\004q\000\000\000\000\004q\000\000\004y\004\161\000\000\004\161\000\000\000\000\004\161\002\242\004q\000\000\004\161\018\154\004q\000\000\004q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\161\004\161\000\000\000\000\004q\000\000\004\161\002\242\000\000\000\000\000\000\004q\000\000\000\000\000\000\004\161\004\161\000\000\000\000\004\161\004\161\004q\004\161\000\000\004q\004f\004\145\000\000\000\000\004q\000\000\004\145\000\000\000\000\004\145\004a\004\161\004\161\004\161\000\000\004a\004\161\004\161\004a\004\145\004q\000\000\007\222\004\145\004q\004\145\000\000\000\000\004a\000\000\000\000\000\000\004a\004\161\004a\004q\004q\004\145\000\000\004q\004q\000\000\000\000\000\000\004\145\000\000\004a\000\000\000\000\000\000\000\000\000\000\000\000\004a\004\145\000\000\004q\004\145\000\000\000\000\000\000\000\000\004\145\004a\000\000\000\000\004a\021\134\000\000\000\000\000\000\004a\000\000\000\000\000\000\000\000\000\000\000\000\004\145\000\000\000\000\000\000\004\145\000\000\000\000\000\000\000\000\004a\000\000\000\000\000\000\004a\000\000\004\145\004\145\000\000\000\000\004\145\004\145\001\210\001\214\000\000\004a\004a\000\000\000\000\004a\004a\000\000\000\000\000\000\000\000\000\000\002\150\004\145\004\018\000\000\000\000\001\218\001\222\001\238\000\000\000\000\004a\000\000\022f\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\025\230\000\000\002\002\000\000\000\000\000\000\000\000\000\000\001\254\002\154\002\182\000\000\007\217\000\000\002\162\007\217\002\194\0042\004>\000\000\000\000\000\000\000\000\004J\000\000\b\005\000\000\000\000\b\005\000\000\000\000\007\217\007\217\000\000\007\217\007\217\000\000\000\000\000\000\000\000\004N\000\000\000\000\000\000\b\005\b\005\000\000\b\005\b\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\210\001\214\000\000\000\000\000\000\b\005\017\"\000\000\000\000\000\000\000\000\007\217\000\000\004\130\000\000\004\134\000\000\000\000\007\245\001\218\001\222\007\245\000\000\000\000\000\246\000\000\007\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\245\007\245\b\005\007\245\007\245\007\217\001\254\007\217\002\166\000\000\000\000\000\000\002\162\000\000\002\194\0042\004>\000\000\b\005\007\217\b\005\004J\006J\007\217\000\000\007\245\000\000\007\217\000\000\007\217\000\000\000\000\b\005\007\217\000\000\006J\b\005\000\000\004N\000\000\b\005\028\006\b\005\000\000\000\246\004\129\b\005\000\000\000\000\000\000\004\129\000\000\000\000\004\129\000\000\000\000\000\000\000\000\027\242\007\245\000\000\000\000\000\000\004\129\000\000\000\000\000\000\004\129\000\000\004\129\000\000\000\000\000\000\000\000\000\000\007\245\000\000\007\245\004i\000\000\000\000\004\129\000\000\004i\000\000\000\000\004i\000\000\004\129\006\138\000\000\000\000\006J\007\245\000\000\000\000\004i\007\245\000\000\007\245\004i\004\129\004i\007\245\000\000\000\000\004\129\004\153\000\000\000\000\000\000\000\000\004\153\000\000\004i\004\153\000\000\000\000\000\000\000\000\000\000\004i\004\129\000\000\000\000\004\153\000\000\000\000\000\000\004\153\000\000\004\153\000\000\000\000\004i\000\000\000\000\004\129\004\129\004i\000\000\004\129\004\129\004\153\000\000\000\000\000\000\000\000\000\000\000\000\004\153\000\000\000\000\000\000\000\000\004i\000\000\000\000\004\129\000\000\000\000\000\000\000\000\004\153\000\000\000\000\014\029\014\029\004\153\019\194\004i\004i\000\000\000\000\004i\004i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\153\014\029\014\029\014\029\007\162\000\000\000\000\004i\000\000\000\000\000\000\014\029\000\000\000\000\000\000\004\153\004\153\011\162\022\018\004\153\004\153\000\000\000\000\001\210\001\214\014\029\014\029\014\029\000\000\000\000\000\000\014\029\000\000\014\029\014\029\014\029\004\153\000\000\000\000\000\000\014\029\004\169\001\218\001\222\001\238\000\000\000\254\022\142\000\000\002\026\000\000\000\000\001\250\000\000\000\000\000\000\000\000\014\029\000\000\019b\000\000\000\000\000\000\004\169\000\000\003\198\001\254\002\154\002\182\000\000\001\210\001\214\002\162\000\000\002\194\0042\004>\019f\000\000\000\000\000\000\004J\000\000\000\000\019\142\000\000\000\000\000\000\000\000\001\218\001\222\001\238\000\000\000\000\000\000\000\000\000\000\018\194\004N\001\250\000\000\000\000\018\218\000\000\000\000\000\000\001\210\001\214\024\006\000\000\000\000\000\000\000\000\001\254\004\154\002\182\000\000\000\000\020\n\002\162\000\000\002\194\0042\004>\000\000\001\218\002\174\001\238\004J\000\000\000\000\000\000\000\000\018\246\020\030\001\250\000\000\004\169\004\169\000\000\000\000\001\210\001\214\024f\000\000\004N\000\000\000\000\000\000\001\254\002\154\002\182\000\000\000\000\020.\002\162\000\000\002\194\0042\004>\001\218\002\174\001\238\000\000\004J\000\000\000\000\000\000\001\210\001\214\001\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004N\000\000\000\000\001\254\002\154\002\182\001\218\001\222\001\238\002\162\000\000\002\194\0042\004>\000\000\000\000\001\250\000\000\004J\000\000\000\000\000\000\001\210\001\214\000\000\000\000\000\000\000\000\000\000\000\000\001\254\004\166\002\182\000\000\000\000\004N\002\162\000\000\002\194\0042\004>\001\218\001\222\001\238\000\000\004J\000\000\000\000\000\000\001\210\001\214\001\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004N\000\000\000\000\001\254\004\242\002\182\001\218\001\222\001\238\002\162\000\000\002\194\0042\004>\000\000\000\000\001\250\000\000\004J\000\000\000\000\000\000\001\210\001\214\000\000\000\000\000\000\000\000\000\000\000\000\001\254\005\n\002\182\000\000\000\000\004N\002\162\000\000\002\194\0042\004>\001\218\001\222\001\238\000\000\004J\000\000\000\000\000\000\001\210\001\214\001\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004N\000\000\000\000\001\254\027\186\002\182\001\218\001\222\001\238\002\162\000\000\002\194\0042\004>\000\000\000\000\001\250\000\000\004J\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\254\027\210\002\182\000\000\000\254\004N\002\162\002\210\002\194\0042\004>\000\000\000\000\000\000\000\000\004J\000\000\0302\000\000\001\210\001\214\000\000\000\000\003\198\000\000\000\000\000\000\000\000\000\000\000\000\001\210\001\214\004N\000\000\000\000\003\202\000\000\000\000\001\218\001\222\000\000\000\000\018^\000\000\000\000\000\000\000\000\000\000\000\000\001\218\001\222\000\000\026\018\000\000\000\000\018\194\000\000\000\000\000\000\000\000\018\218\000\000\001\254\000\000\002\166\000\000\001\210\001\214\002\162\000\000\002\194\0042\004>\001\254\000\000\002\166\018\226\004J\000\000\002\162\029\226\002\194\0042\004>\000\000\001\218\001\222\000\000\004J\000\000\000\000\018\246\019\"\000\000\004N\004\221\000\000\005)\000\000\000\000\000\000\001\210\001\214\000\000\000\000\004N\000\000\000\000\005-\001\254\002\190\002\158\023J\000\000\027\242\002\162\000\000\002\194\0042\004>\001\218\001\222\000\000\000\000\004J\027\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\004N\000\000\000\000\001\254\004\230\002\158\000\000\000\000\000\000\002\162\000\000\002\194\0042\004>\000\000\000\000\000\000\000\000\004J\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004N")) and lhs = - (8, "\012\011\n\t\b\007\006\005\004\003\002\001\000\220\220\219\219\218\217\217\216\216\216\216\216\216\216\216\216\216\216\216\216\216\216\216\216\216\216\216\215\215\214\213\213\213\213\213\213\213\213\212\212\212\212\212\212\212\212\211\211\211\210\210\209\208\208\208\207\207\206\206\206\206\206\206\205\205\205\205\205\205\205\205\204\204\204\204\204\204\204\204\203\203\203\203\202\201\200\200\199\199\199\199\198\198\198\198\197\197\197\197\196\196\196\196\195\195\195\194\194\194\194\193\192\192\192\191\191\190\190\189\189\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\188\187\187\186\186\185\184\183\182\182\181\181\180\180\180\180\179\179\179\179\178\178\177\177\177\177\176\175\174\174\173\173\172\172\171\170\170\169\168\168\167\166\165\165\165\164\164\163\162\162\162\162\162\162\161\161\161\161\161\161\161\161\160\160\160\160\160\160\159\159\158\158\158\157\157\156\156\156\155\155\154\154\153\153\152\152\151\151\150\150\149\149\148\148\147\147\146\146\145\145\145\144\144\144\144\143\143\142\142\141\141\140\140\140\140\140\139\139\139\139\138\138\138\137\137\137\137\137\137\137\136\136\136\136\136\136\136\135\135\134\134\133\133\133\133\133\133\132\132\131\131\130\130\129\129\128\128\128\127~~~}}|||||||||{{zzyyyyyyyyyyyxwvvuuuuutssrrqqqqqqqqqqqqqqppoonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmllkkjjiihhggffeeddccbbbbbbbbbbba`_^]\\[ZYXXXXXXXXXXWWWVVVUUUUTTTTTTTTTSSRRRRRQQPPONMMLLLLLKKJJIIIHHHHHHGGGFFEEDDCCBBAAA@@??>>==<<;;::9988776655544433322211110/..................-----,,,,,,,+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++**))))))))))))))))))))))(((((((((((((((((((((((((((((((((((((((((((((((((((''&&&%%$$$$$$$$$$$$$$$$##\"\"!!!!!!! \031\031\030\030\030\030\030\029\029\028\027\026\026\026\025\025\024\024\024\024\024\024\024\024\024\024\023\023\022\022\022\022\021\021\020\019\019\019\019\019\018\017\017\016\016\016\015\015\015\014\014\014\014\r\r") + (8, "\012\011\n\t\b\007\006\005\004\003\002\001\000\224\224\223\223\222\221\221\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\219\219\218\217\217\217\217\217\217\217\217\216\216\216\216\216\216\216\216\215\215\215\214\214\213\212\212\212\211\211\210\210\210\210\210\210\209\209\209\209\209\209\209\209\208\208\208\208\208\208\208\208\207\207\207\207\206\205\204\204\203\203\203\203\202\202\202\202\201\201\201\201\200\200\200\200\199\199\199\198\198\198\198\197\196\196\196\195\195\194\194\193\193\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\192\191\191\190\190\189\188\187\186\186\185\185\184\184\184\184\183\183\182\182\181\181\181\181\180\179\178\178\177\177\176\176\175\174\174\173\172\172\171\170\169\169\169\168\168\167\166\166\166\166\166\166\165\165\165\165\165\165\165\165\165\165\165\165\165\164\164\164\164\164\164\164\164\164\163\163\162\162\162\161\161\160\160\160\159\159\158\158\157\157\156\156\155\155\154\154\153\153\152\152\151\151\150\150\149\149\149\148\148\148\148\147\147\146\146\145\145\144\144\144\144\144\143\143\143\143\142\142\141\141\141\140\140\140\139\139\139\139\139\139\139\138\138\138\138\138\138\138\137\137\136\136\135\135\135\135\135\135\134\134\133\133\132\132\131\131\130\130\130\129\128\128\128\127\127~~~~~~~~~}}||{{{{{{{{{{{zyxxwwwwvvvvvuttssrrrrrrrrrrrrrrqqppooooooooooooooooooooooooooooooonnmmllkkjjiihhggffeeddcccccccccccba`_^]\\[ZYYYYYYYYYYXXXWWWVVVVUUUUUUUUUTTSSSSSRRQQPONNMMMMMLLKKJJJIIIIIIHHHGGFFEEDDCCBBBAA@@??>>==<<;;::998877666555444333222210//////////////////.....-------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++**********************)))))))))))))))))))))))))))))))))))))))))))))))))))))(('''&&&&&&&&&&&&&&&&&&%%$$$$$$$$$$$$$$$$##\"\"!!!!!!! \031\031\030\030\030\030\030\029\029\028\027\026\026\026\025\025\024\024\024\024\024\024\024\024\024\024\023\023\022\022\022\022\021\021\020\019\019\019\019\019\018\017\017\016\016\016\015\015\015\014\014\014\014\r\r") and goto = - ((16, "\000%\001m\000E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000:\000\000\000\000\000\153\000\254\000\030\001Y\000W\001\132\000\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\001%\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\138\000\000\000\000\000\000\000\165\000\000\000\000\000\000\000\000\000\000\000\000\000\000)@\0003\000\022\000\211\000\000\001\168;\194\000\014\002\028\000\030\000\000\000\000\000\000\003\160\000\000\000\000\001\254\000\000\000\000\000\000\000\000\001\150\000\000\000\232\000\000\000\000\000\000\000\000\000\000\001<\000\000\002\134\0020\bL\000\000\000\000\002\250)@\000\000\000\000\000h\000\000\000)\000\000\014\246\001&\000\000\001\014\001V\000\000\000\000\001\028\003f\003\204\004V\002\232\0020\002\"\002r\001d\001\166\001@\004\030\n\242\000\000?\210\001b\004<\000*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\156\000\000\b\012?\210\0114\000\000\000\000\001\218\005\208\002\0123*\000\000\000\000\000\000\000\000\000\000\000\000\000\000 ,\000\000\003\152\005\244\004&\000\000\000\000\000\000\000\000\001`\000\000\000\000\006\022\000i\006d\006$\007\172\000\000\003\176\004>\006f\001X\001\246\007\016 J\000\000\000\000\004\156\007h\011\216\000\000 p\004\174 \146!\210\000\000\000\149\000\000\000\000\000\000\000\000\005\132?\176\005\144\000\000\007\236\006\020\000\000*\162\r&\000\212\000\000\000\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0003\172\005\210\000\000\000\000\000\000\007\\\000\000\012\004\000\000\000\000\0036\003\190\000\000\000\000\000\216\000\000(\134\000\000\0036\0128\0036\000\000\000\000\000\000\000\000\000\0008\238\000\000\007\140\006\188\000\000\t\162\007\244\031Z\000\000\000\000\000\000\006\178\000\000\000\000\000\000\000\000\006\154\000\000\000\000\000\000\000\000\000\0003\250\000\000\000\000\000\000\000\000\000\000\000\000\000\018\007\166\000\000\000\000\000\000\006\154\007\2044.\007|\b$\"\202\000\000\005\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\b\2064\146\000\000\000\000\007\204\b*4\156\000\000\000\000\000\0004\170\b\0125\144\000\000\b\012\000\0005\154\b\012\000\0005\168\b\012\000\000\b\012\000\000\000\000\b\012\000\000\000\0006\012\000\000\b\0126P\000\000\b\012\003T\000\000\000\000!\210\000\000\000\000\000\000\000\000\b\012!\244\000\000\000\000\000\000\b\012\000\000\000W\t\002\000\000\000\000\000\000\000\000\000\000\000\000\000\0009\184\000\000\b\172\000\000?\206\006\154\000\000\000\000\000\000\000\000\b\190\tN\011\254\b\166\b\230\tT\b2\003\176\bN\000S\t\242\000\000\000\000\004\134\006\014\bz\001\132\t\150\0062\000\000\002\206\000\204\tX\000\241\n\240\000\000\000\000%4\000\000E\208\n\134\000\000?\216\006\154@d\006\154\000\000\001\022\000\000\000\222\000\000\000\000\004>\000\000\000\000\000\000\011b\000\000\nx\002\206\000\000\000\000\n*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\206\000\000\000\000\002\206\000\000\t\150\005\004\000\000\001\158\001\246\000\000\001\158\000\000\000\000\014\244\002\206\000\000\000\000\000\000\000\000\000\000\000\000\001\158\012\022\012\198\011 \n\204!\144\0006\000\000\n*\b\164\012\222\nV\b\234@\152@\182\000\000\000\000\000\000\000\000\000\000\003^\tD\000\000\000\000\000\000\nX\b\254\005\186\001\158\016d\000\000\002\206\000\000\000\000\000\000\004\174\000\000@\226\006\154\r\144\n`\t\018\r\168\nj\t\022\005~\"\018\b\012\r\234\n\132\t8;\232\011t\000\000\"\134\b\012@\250\006\154\011\184\000\000\000\000\000\000\000\000 ,\011\164\011\168\000\000\000\000\012p\014B\011\026\t:6\148\b\012\014\154\011\030\tBAL\000\000A\132\000\000\000\000\0150\"\2260\146\000\000\000\000\012rA~\000\000\006\154=h\000\000\006\154A\142\006\154\000\000\000\000\000\000\000\000\000\000B>\000\000\000\000\000\000\006j\015b\000\000\000\000\000\000\000\000#$BH\000\000\000\000\000\000\000\000\000\000\n\254\015\136\000\000\000\206#H\000\206#\128\000\206\000\000BP\000\000#\236\000\206\015\198\0044\016,\000\000\000\000$H\000\206$\156\000\206$\236\000\206$\250\000\206%h\000\206&2\000\206&d\000\206&\132\000\206&\140\000\206'N\000\206'n\000\206(0\000\206(8\000\206(P\000\206(X\000\206)\026\000\206):\000\206)\252\000\206*\004\000\206*\028\000\206\td\001\2166\134 ,\011\212\000\000*\248=:\000\000\016\168\000\000\000\000\016\246\000\000\000\000\000\000+l\000\000\000\000\000\000\000\000\000\000\b\012\000\000\000\000Bp\000\000\006\154\000\000\000\000=h\011\236\000\000B\144\006\154\017X\000\000\000\000\011\134\000\000B\162\006\154\017\154\000\000\000\000\017\252\000\000\000\000\000\000B\226\006\154\018J\000\000\011<\018b\000\0006\254\000\000\b\0127H\000\000\b\0127\144\000\000\b\012\004\016\000\000\000\000\000\000\000\000\000\0007\246\b\012\003\250\004\028\000\000\000\000\000\000\000\206\018\198\000\000\000\000\000\000+\002\000\206\000\000\000\000\000\000\000\000\019,\000\000\000\000\000\000\000\206\019\210\000\000\020*\000\000\000\000\000\000\0202\000\000\000\000\000\000\000\000C0\000\000\000\000\020\130\000\000\000\000\000\000+\196\000\206\020\208\000\000\000\000\000\000+\230\000\206\021(\000\000\000\000,\030\000\206\000\206\000\000\007\130\021N\000\000\000\000,\140\000\206\021\236\000\000\000\000,\224\000\206,\232\000\206\000\000-N\000\206\000\000\000\000\022D\000\000\000\000-\134\000\206\022L\000\000\000\000.L\000\206\022\178\000\000\000\000.r\000\206\000\000.\240\000\206\000\000=\200\000\000\000\000\000\206\000\000\000\000\022\234\000\000\000\000\023\016\000\000\000\000\011z\000\000\000\000\023\180\000\000\023\214\000\000\000\000\000\000 ,\012\016\000\0003\006\012\152\0036\0240\000\0009\158\000\000\000\000\000\0009\214\000\000\000\000\024\128\000\000\024\152\000\000\000\000\000\000\000\000/b\000\000\000\000\000\000/\024\000\206/>\000\206\000\000\011<\025`\000\000\000\000\025\130\000\00000\000\000\000\000@\182\000\000\000\000\000\000\025\254\000\000\000\000\000\000\000\000\005\024\002z\011\1560(\005p\000\000\000\000\000\000\002$\t\1988\002\b\0120\198\000\2060\234\000\2061\"\000\206\000\000\000\000\000\000\000\000\026L\000\000\000\000\000\000\000\000\003H\005$\011\1601\200\004\024\000\000\000\000\000\000\000\000\000\000\012\218\000\000\000\000\000\00086\000\000\000T\000\000\006\162\000\000\012\130\000\000\001\156\000\000\000\000\000\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\206\000\000\012\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\n\028\t&\001\158\026l\000\000\011\246\n&\012\136\003.\tv\001\158\016\138\002\206\t\154\001\158\000\000\026\200\000\000\003\210\000\000\012\022\n:\004(\000\000\000\000\000\000\000\000\000\000\0124\001\240\002\198\000\000\000\000\000\000-\130\000\000E\232\000\000\nB\000\000\nx\000\000\000\000\000\000\000\000\0044\000\000\000\000\000\000\015l\0036\000\000\0036\002\152\000\000\015\176\0036\0036\n\200\000\000\026\234\000\000\000\000\n\212\r,\000\0002(\006\016\000\000\000\000\000\000\000\000\000\000\000\000\000\206\000\000\027\222\000\000\000\206\000\000\000\000\017<\000\000\002\206\000\000\017L\000\000\002\206\000\000\018\140\002\206\000\000\001\158\000\000\n\220\np\002x\000\000\012\154\012\170\n\236\012\208\r\134\020\020\002\206\007\004\000\000\n\246\r\222\r\226\006\194\b\b\r\204\011\n\014 \0076\bb\r\240\000\000\000\000\b\242\b\196\000\000\004\180\002\2228\184\b\012\027\232\000\000\005\002\003.\r\172\011 \n\150\004l\000\000\r\212\011\"\005\226\000\000C6\006\154\014h\014\130\000\000\n\006\000\000\r\242\011,\006\216\014\b\003\028\000\000\000\000\000\000\000\000\011>\n2\000\000\011b\n\132\000\000\007\226\t\"\0148\014R\011t\tT\n\152\000\000\011v\n\012\011Z\000\000\014f\011z\014\234\000\000\n\170\000\000\011\188\000\000\015\b\000\000\021\018\002\206\014\220\011|\015\026\000\000\021r\003\178\014\232\000\000\000\000\000\224\004\250\012\022\000\000\022\004\002\206\0126\000\000\005d\000\000\014\164\011\134\024\018\006:\000\000\014\180\011\156\006\238\014\b\014\194\014\196\011\186\016\026\000\000\014\210\006Z\000\000\000\000\000\000\000\000\000\147\011\206\014\162C\\\006\154\000\000\004&\011\208\015X\000\000\000\000\000\000\000\000\000\000\000\000C\188\007\242\000\000\012\004\015\176\000\000\000\000\000\000\000\000\000\000\000\000\014p\000\000C\220\006\154\012D\000\000\006\154\012\020\000\254\000\000\012 \012V\006\206\000\000\003\224=\242\000\000\004b\000\000D\028\006\154\006\154\000\000\000\000\b\022\000\000\b\004\000\000\006\186\b\022\b\022\000\000\012Z>\014\006\154D:\006\154\012\210\000\000\000\000\000\000\000\000\012\254\000\000\000\000\006N\000\000\b \015\030\012x\016.\014\238\000\000\000\000\007d\bF\015.\000\000\000\000\012~\016@\015\b\000\000\000\000\019n\000\000\002\174\000\000+\2368\222\006\154\000\000.\150\007l\000\0004r\000\000\000\000\000\000\b\022\000\000\000\000\r \015D\012\128\016Z\015\018\000\000\000\0009n\r<\015N\000\000\000\000\000\000(\014\000\000\000\000\000\000\000\000\000\000\000\000\r@\000\000\015\\\012\198\t\216\000\000\016N\016\004\rL\015j\000\000\000\000\015n\012\222\n\002\000\000\000\000\tx\r&\005\156\000\000\000\000\000\000\007\244\0154\012\240\000\000\0158\007\244\000\000\016\014\r^\015x\000\000\000\000\000\000\006\154\000\145\003r\006\012\000\000\000\000\000\000\000\000\015@\012\244\000\000\006\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\154\0154\r\004\016\144\015J\000\0009\244\000\237\r\012\015 \000\167\005 \r\014\015\214\000\000\016\144\028<\000\000\000\000\028\142\000\000\r\164\000\000\007\192\000\000\000\000\000\000\000\000\000\000\000\000D>\006\154\000\000\016\146\028\152\000\000\000\000\028\230\000\000\000\209\r\018\016>\000\000\000\000:\012\019\130\015\246\000\000Dh\006\154\029|\000\000\000\000\029\212\000\000\000\000\r\168\000\000\006x\000\000\000\000\000\000\000\000\000\000\000\000<8\000\000\000\000:nj\000\000\004\186\000\000\r\146\n\136:\194\005\164\0150\006L\000\000=\018=\200\000\000\002\146\000\000\000\000\002\146\000\000\000\000\002\146\t\188\000\000\b\222\002\146\016Z2\194\r\220\000\000\002\146\000\000\000\000D\156\000\000\000\000\000\000\002\146\000\000\000\000\r\232\000\000\b\242\n\234\014\000\000\000\r\150>\204\014\022\000\000\000\000\000\000\000\000\014,\000\000\000\000\003N\000\000\002\146D\184\000\000\n\174\002\146;J\000\000\0142\015\190\r\192\016\210\015\138\000\000;\130\014T\015\196\000\000\000\000\000\000!\002\b\166\000\000\000\000\000\000\000\000\000\000\000\000\n\254\014p\000\000\015\210\000\000\000\000\000\000\000\000\014\136>\252\000\000\000\000\000\000\000\000\n\254\000\000\000\000\014\158?$\000\000\000\000\000\000\000\000\000\000\001\158\002\206\000\000\000\000\b\012\000\000E\146\006\154\000\000\0072\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\144\000\000\000\000\015\140\r\230\011\016\001\158\000\000\024H\000\000\002\206\000\000\016\202\000\000\000\000\000\000\000\000\000\000\031*\000\000\000\000\000\000\000\000\000\000\000\000\016n\000\178\n>\0154\006|\014$\000\000\002\212\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015@\007F\014(\000\000\007\184\016\212\016\138\014\182\000\000\000\000\016\140\001,\007\184\000\000\000\000\000\000\014Z\000\000\014^\0026\000\000\000\000\0036\002\204\000\000\000\000\000\000\000\000\000\0000r\000\000\000\000\bf\007\150\000\000\000\000E\156\006\154\006\154\000\000E\180\006\154\t\000\000\000\000\000\000\000\006\154\000\000\000\000\t\198\016\156\014\242\000\000\000\000\016\146\000\152\002\132\000\000\000\000\000\000\000\000\b\174\016\212\n2\016\166\015\b\000\000\000\000\016\154\002d\003\004\000\000\000\000\000\000\000\000\002\206\000\000\b\132\000\000\000\000\000\000\030\194\000\000\031\164\000\000\000\000\000\000\000\000\000\000;\142\000\000\000\000\000\000\006,\000\177\000\000\000\000\000\000\000\000\000\000\t\154\000\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000>\244\000\000\006\154\000\000\n\218\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000a\000\000\000\000\000\000\001p\000\000\000\000\000\0003\030\b\012\000\000\000\000\005@\000\000\000\000\000\000\000\000\003^\004\156\015\222\005\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\224\000\000\015\012\000\000\000\000\000\000\000\000\004\236\006t\004L\005\242\000\000\000\000\015 =Z\000\000\000\000\000\000\015\"=b\000\000\000\000\000\000\000\000"), (16, "\006;\005l\002\020\002\021\001e\000;\0007\000\196\001\031\000\196\000\200\001\002\000\200\000\201\001\198\000?\006\224\002X\006<\006\235\001\019\006>\000m\001\230\000\\\002Y\001\023\001\234\001\244\001\023\006?\006L\005\196\006;\000`\002\020\002\021\001e\002s\000\147\005\248\006\210\001\215\001\203\007\021\005\198\001\246\002\020\002\021\001e\002X\006<\006K\000\196\006>\001\016\000\200\001\002\002Y\006!\006@\001\023\001\026\006?\006L\001\003\000d\001\235\005\250\0007\003\201\002s\006\\\006\230\001k\002\003\001T\003\210\000\200\007\022\001\031\001\236\000\200\006\177\000\196\006$\005\251\000\200\001\002\001\006\000y\005\253\003\203\006@\006A\006)\001\164\006\228\002u\007\005\006&\003\223\006B\005s\005t\007\017\000@\001\"\001\016\002\024\000\203\002w\000\200\005\001\001\023\001$\001\223\006\175\000\196\005\132\001\006\000\200\000\201\005}\004.\001W\006Q\006A\005\002\006'\004\137\002u\005\026\000\200\002\004\006B\001\031\001\238\000\203\001+\007\018\006R\002\024\002\023\002w\000\200\001\023\006\205\000\196\005\248\006E\000\200\000\201\006\237\003\214\006G\002w\000\200\001\002\006Q\000\129\006\141\000\128\001\"\001\224\006I\001%\0007\002x\000\196\002~\000\203\000\200\001\002\006R\0007\002\132\005\250\001\132\002z\001\016\000:\000\147\006E\006J\000\156\001\023\001$\006G\006;\003\204\002\020\002\021\001e\000\134\005\251\006\171\007\006\006I\001\132\005\253\002x\002\134\002~\006\020\003\204\002X\006<\006K\002\132\006>\001\132\002z\002x\002Y\000q\001e\006J\0007\006?\006L\002y\006\161\001\132\002z\000\203\001l\002s\000\151\006;\000\202\002\020\002\021\001e\001\016\002\134\001\016\004\185\001%\001\219\001\023\001\026\001\023\001$\0009\001\023\002X\006<\006K\006@\006>\006\208\006\209\006\163\002Y\001\016\003\209\002\183\001e\006?\006L\001\023\001\026\001\196\006\145\006\146\001\217\002s\001.\000\200\001\246\005}\004.\006\147\006\148\007\025\001\031\002\229\001v\000\147\001h\001i\000\152\006A\006\149\004.\002\255\002u\000\150\006@\004\187\006B\003\175\006\130\001%\001\198\004L\006]\002\024\002\003\002w\000\200\000\200\007\026\001\230\002\001\004 \001\027\001\234\000\183\001\023\001\031\001\230\005\001\000\153\006Q\001\234\002\131\001\023\000\172\002\234\002\250\002\251\006A\001.\006\145\006\146\002u\005\002\000\178\006R\006B\005\t\000\196\006\147\006\148\000\200\001\002\002\024\006E\002w\000\200\000=\000\184\006G\006\149\004.\000\188\001\235\001\246\000\174\006\202\001\127\004M\006I\006Q\001\235\002x\002\004\002~\001\031\000\132\001\236\001n\000\193\002\132\000\200\001\132\002z\003\204\006R\001\031\001\238\006J\005.\001\250\001\016\006\219\002\003\006E\003\161\000\200\001\023\001$\006G\006;\001\031\002\020\002\021\001e\004 \002\134\002\255\000\186\006I\002\255\002\254\002x\001\"\002~\006\133\002\255\002X\006<\006K\002\132\006>\001\132\002z\001\031\002Y\001\016\001 \006J\002\001\006?\006L\001\023\001$\000\135\006\170\002\002\001\129\002s\000\211\006;\000\203\002\020\002\021\001e\001\130\002\134\001\132\001l\001%\006\023\001\"\002\004\002\255\001)\004#\002\255\002X\006<\006K\006@\006>\001\147\001e\006S\002Y\001\016\003\217\001e\005l\006?\006L\001\023\001$\006\132\001\016\003\168\004Q\002s\004$\002\255\001\023\001$\006\206\001%\006e\001\016\000\196\004\016\003\177\000\200\000\201\001\023\001$\006A\001*\006\208\006\209\002u\000\203\006@\001\016\006B\000\147\006O\000\157\001\215\001\023\001$\002\024\006\173\002w\000\200\006\207\006\171\001\016\005}\004.\005\248\003\168\004\170\001\023\001$\006\142\001\016\000\147\006Q\006\153\001\215\005l\001\023\001$\003\179\001%\006A\004\027\004\029\004\031\002u\004&\004\137\006R\006B\000\200\001%\002\002\005\250\006\220\003\255\002\024\006E\002w\000\200\006\143\001\016\006G\002\248\001e\005\255\001%\001\023\001$\006\144\004)\005\251\006I\006Q\002\255\002x\005\253\002~\005s\005t\006\r\001.\001>\002\132\006\207\001\132\002z\006(\006R\001%\006;\006J\001\246\006\195\006\196\001\229\006\171\006E\005}\004.\0007\000\147\006G\000\181\001\215\007<\000\179\004\002\007=\002\134\002\255\006>\006I\006$\004\140\002x\001\132\002~\002\005\001.\006?\002\003\001H\002\132\000\200\001\132\002z\002\255\006&\001\016\006;\006J\002\020\002\021\001e\001\023\001\026\004\003\005s\005t\003\195\004\176\001\169\001e\0070\0071\001\016\002X\0073\002\134\006@\006>\001\023\001\026\005|\002Y\002\131\006'\005}\004.\006?\0075\001f\002)\0007\001h\001i\002\255\002s\000\224\006;\000\203\002\020\002\021\001e\007D\000\228\003\001\004\016\000\196\002\004\004N\000\200\000\201\006A\007<\002\001\002X\007=\004\002\006@\006>\006B\001\222\003\000\002Y\005\018\005\161\000\189\001\023\006?\007E\001(\0007\005\001\003\141\002\250\002\251\002s\001\229\005\248\001\016\007?\000\194\007!\002\021\001e\001\023\001\026\005\002\001\198\005\021\001\242\005\003\006A\004\030\004\029\004\031\002u\001\230\006@\006D\006B\001\234\004w\001\023\005\023\001\127\005\250\002\024\006E\002w\000\200\003\188\003\192\006G\001d\001e\001n\004\012\004.\000\200\000\241\0078\000\196\006I\005\251\000\200\000\201\005\024\002\131\005\253\001\246\000\203\006A\006\004\001f\001v\002u\001h\001i\006R\006B\001\235\006J\002\138\003\144\003\149\000\203\002\024\006E\002w\000\200\007#\004\253\006G\004\181\001\236\001\247\000\200\003\131\002\003\007I\001`\000\200\006I\004{\001e\002x\000\249\002~\006;\002\002\007-\002\021\001e\002\132\001\129\001\132\002z\001w\006R\001x\0024\006J\001\130\007<\001\132\001l\007=\006E\007$\006>\002w\000\200\006G\006;\005\163\002\020\002\021\001e\006?\002\134\001Y\006\246\006I\005\243\004\188\002x\004l\002~\001\127\001\n\002X\006<\006Y\002\132\006>\001\132\002z\002\004\002Y\001n\001\246\006J\000\200\006?\006L\004\016\000\147\003\238\006@\000\152\003\134\002s\005\203\006;\003\168\002\020\002\021\001e\000\196\002\134\003\180\000\200\000\201\002\131\002\255\004r\002!\003\179\007<\002\003\002X\007=\000\200\006@\006>\002\131\000\204\004\187\002Y\000\203\001\016\004\205\006A\006?\007@\002\255\001\023\001$\003\205\005\248\006B\002s\005e\004\029\004\031\001\r\006\247\007.\001\129\002w\000\200\004\016\000\212\001\198\003\165\001\239\001\130\006A\001\132\001l\007>\002u\001\230\006@\005\207\006B\001\234\005\250\001\023\002\131\000\225\001\198\002\024\001\199\002w\000\200\001\030\006\248\002\004\006D\001\230\0044\006\255\001\023\001\234\005\251\001\023\000\234\006E\006Q\005\253\000\203\000\196\006G\006\001\000\200\000\201\006A\005y\004\029\004\031\002u\004\193\006I\006R\006B\001\235\003\012\003\206\005\025\000\200\001\002\002\024\006E\002w\000\200\004\137\000\203\006G\000\200\001\236\007\000\006J\005\248\001\235\007C\000\236\000\242\006I\001\031\001;\002x\001 \002~\005\021\000\203\002\255\001\031\001\236\002\132\0055\001\132\002z\003\029\006R\007\001\004\016\006J\001\016\005\023\004_\005\250\000\203\006E\001\023\001\026\001\"\004\248\006G\006;\000\200\002\020\002\021\001e\001\"\002\134\007\002\005\168\006I\005\251\001\229\002x\005\024\002~\005\253\006\158\002X\006<\005\254\002\132\006>\001\132\002z\006\139\002Y\001\132\005I\006J\001B\006?\006U\000\203\000\203\005\129\004\029\004\031\001\031\002s\006n\001 \001*\001\031\004\002\004Z\001 \002\134\005\001\0012\004d\002\020\002\021\001e\000\245\002\131\005J\005\138\005K\004\137\001G\006@\000\200\005\002\006f\001\"\002X\005\b\002\255\0013\001\"\001\016\004\134\004.\002Y\001\016\001Q\001\023\001$\001\016\006y\001\023\001\026\004\197\004.\001\023\001$\002s\005L\003D\006$\001\031\000\200\001\002\001 \006A\001V\002\255\000\250\002u\001\016\001\159\004\002\006B\006\184\006&\001\023\001\026\002\255\001*\002\024\005\172\002w\000\200\001*\002\255\001E\001\016\001\"\000\203\002\255\005M\0011\001\023\001$\003U\006\151\006X\001\132\001%\005N\0018\005O\005\001\006'\006\162\005l\001%\001\016\002\255\006\216\000m\006R\001\016\001\023\001$\001\\\002u\005\002\001\023\001$\006E\005\"\002\255\005\006\005\139\006G\000\200\002\024\001.\002w\000\200\001*\000\203\004\226\006\143\006I\001.\001C\002x\002\255\002~\001\156\006\183\006\144\004`\006\197\002\132\005Q\001\132\002z\000\203\005\n\005S\005]\006J\001t\005\027\005I\001>\002{\001\016\001]\005\135\001>\001u\001%\001\023\001$\001\186\005\140\001%\002\255\002\134\001\016\001F\005#\002\020\002\021\001e\001\023\001$\005\136\001\188\005i\004.\005J\002x\005K\002~\004e\000\147\002X\001\202\001\215\002\132\001.\001\132\002z\001H\002Y\001.\001G\000\203\001H\001\195\003\151\006\227\005s\005t\001\016\001\031\001>\002s\001 \001~\001\023\001$\005L\001%\005\004\002\134\006\253\005u\005\133\005\004\002\015\000\203\005}\004.\000\203\001\163\001\031\000\196\000\203\001 \000\200\000\201\001\"\004j\001\246\004\016\004i\000\196\005\004\001\175\000\200\000\201\000\203\001.\001\031\005M\001H\001 \001\180\000\147\005l\005V\001\215\001\"\005N\002\018\005O\0046\005\248\004/\003\242\000m\001<\002\003\000\203\002 \000\200\002u\005\248\001G\000\147\001\"\005`\001\215\001\246\002/\001*\0022\002\024\005\137\002w\000\200\006\192\004\029\004\031\000\203\005\250\004\152\004\002\005l\005o\003\240\001\246\001\023\0028\002M\005\250\001*\001\031\002R\003\250\001 \005Q\002\003\005\251\001\016\000\200\005S\005]\005\253\002{\001\023\001$\006\b\005\251\001*\002\182\005\135\003\254\005\253\000\203\002\003\002\004\006\026\000\200\001\"\001\016\002\255\005\238\006\199\000\203\000\200\001\023\001$\001d\001e\005\136\002x\006\006\002~\000\203\000\200\000\203\005l\001\016\002\132\001\185\001\132\002z\002\255\001\023\001$\005s\005t\001f\002\196\001>\001h\001i\000\203\000\203\001\191\002\004\001%\000\203\003\169\006\254\005u\005\133\001*\001\237\002\134\005}\004.\002\020\002\021\001e\001>\001\208\004\156\002\004\000\203\001\210\006\213\001%\001\023\002\020\002\021\001e\002X\002\255\005s\005t\001.\004\130\001>\001H\002Y\001\016\001\246\002\255\002X\001%\007\r\001\023\001$\005u\005\133\003\241\002Y\002s\005}\004.\003\247\001.\006~\004\142\001D\001\246\002\020\002\021\001e\002s\004\006\001\198\004P\001\228\004\023\002\003\001m\000\203\000\200\001.\001\230\002X\001H\001\226\001\234\001\233\001\023\001n\003\231\002Y\000\200\004v\005s\005t\002\003\007\015\001>\000\200\003\227\006j\002\014\004\025\002s\001%\004\145\004\164\000\196\005u\005\133\000\200\000\201\001\023\005}\004.\004\153\006\027\0007\002u\006\137\004.\000\203\005\246\002\017\002\031\001\235\000\203\001\246\002.\002\024\002u\002w\000\200\0021\001.\002\004\000\203\001H\005\248\001\236\000\203\002\024\004+\002w\000\200\002\255\0027\001\129\0040\002\020\002\021\001e\004O\006s\002\004\001\157\002\003\001\132\001l\000\200\004U\002{\002C\002u\002X\004\\\005\250\000\203\002\020\002\021\001e\006\003\002Y\002{\002\024\004b\002w\000\200\004;\001\031\002\020\002\021\001e\002X\005\251\002s\004u\004z\002x\005\253\002~\002Y\004\133\006-\002\255\002X\002\132\0045\001\132\002z\002x\004\141\002~\002Y\002s\001\031\002{\000\203\002\132\003\239\001\132\002z\004\157\000\203\002@\002\004\002s\000\203\002H\004\144\002G\002L\002\134\002Q\005\255\000\203\001d\001e\004\151\004\155\000\203\004\160\004\172\002x\002\134\006m\002e\004\191\003\002\002\255\000\203\002\132\002\186\001\132\002z\002u\001f\002\196\004\196\001h\001i\000\203\000\203\001\031\002\213\002\255\002\024\000\203\002w\000\200\002\220\004\165\002\255\004\201\002u\002\249\000\203\002\134\002\020\002\021\001e\003h\003p\004\211\004\217\002\024\002u\002w\000\200\001\016\002\020\002\021\001e\002X\000\203\001\023\001$\002\024\002{\002w\000\200\002Y\005\230\000\203\000\203\002X\000\203\000\203\003\178\003\194\004\228\003\234\000\203\002Y\002s\001\016\004\182\002{\004\243\003\220\003\197\001\023\001$\000\203\005\005\002x\002s\002~\003\207\002{\003\229\001m\004\186\002\132\001\031\001\132\002z\001 \000\203\004\240\001I\003\246\001n\002\255\002x\000\200\002~\001%\000\203\000\203\003\248\004\247\002\132\005\012\001\132\002z\002x\004\005\002~\002\134\001K\001\"\004*\001\016\002\132\002\255\001\132\002z\005\029\001\023\001$\005'\005@\001%\002u\000\203\003v\001&\002\134\002\020\002\021\001e\002\255\000\203\0042\002\024\002u\002w\000\200\000\203\002\134\002\020\002\021\001e\002X\003y\002\255\002\024\002\255\002w\000\200\001\129\002Y\0010\002\255\001*\002X\005U\003\140\001\157\005\017\001\132\001l\002\255\002Y\002s\000\203\002{\000\203\005_\003\135\001%\0018\004[\002\020\002\021\001e\002s\005k\002{\005\127\004T\005\022\000\203\001\016\004V\000\203\000\203\005\143\002X\001\023\001$\005\149\005\153\002x\005\181\003\237\002Y\002\255\005>\002\255\003s\002\132\003|\001\132\002z\002x\004Y\002~\005\221\002s\002\255\002\255\005F\002\132\005R\001\132\002z\002\020\002\021\001e\005Z\000\203\006\025\005\226\002u\002\255\006\t\002\134\005\231\005q\006\005\002\255\002X\000\203\001>\002\024\002u\002w\000\200\002\134\002Y\001%\000\203\002\255\000\203\001F\003m\002\024\001\031\002w\000\200\001 \000\203\002s\002\255\005\237\000\203\000\203\005\245\000\203\006\030\002\020\002\021\001e\005\162\002\255\005\197\002{\002\255\002u\004h\001.\004^\000\203\001H\001\"\002X\005\223\005\234\002{\002\024\0063\002w\000\200\002Y\002\255\004\236\000\203\000\203\004g\003e\000\203\006\012\000\203\002x\000\203\002~\002s\006\024\002\255\006r\004\239\002\132\004c\001\132\002z\002x\004f\002~\004t\006\028\002\255\002{\002u\002\132\001\031\001\132\002z\001 \001*\000\203\006 \002\255\000\203\002\024\000\203\002w\000\200\002\134\004y\004\129\006\140\006%\006\152\002\255\0061\002\020\002\021\001e\002x\002\134\002~\001\"\004\128\004\132\004\143\000\203\002\132\001\016\001\132\002z\002X\0068\004\019\001\023\001$\002{\002u\006\166\002Y\006\168\002\020\002\021\001e\002\255\000\203\006F\006\165\002\024\003]\002w\000\200\002s\002\134\001\031\002\255\002X\002\255\006M\004\154\002\020\002\021\001e\002x\002Y\002~\001*\002\255\002\255\006V\002p\002\132\004\150\001\132\002z\002X\000\203\002s\000\203\001>\002{\006\157\004\159\002Y\004\179\001\198\001%\001\254\001\031\002}\004\241\002\020\002\021\001e\001\230\001\016\002s\002\134\001\234\004\167\001\023\001\023\001$\000\203\004\178\000\203\002X\002x\004\173\002~\004\177\006\201\002u\004\190\002Y\002\132\001.\001\132\002z\001H\002\140\004\195\006\215\002\024\0076\002w\000\200\002s\005&\004\200\004\203\004\207\004\215\004\222\007A\007F\004\233\002u\001\235\005%\005\030\002\134\002\020\002\021\001e\005\031\001>\005$\002\024\005(\002w\000\200\001\236\001%\001\016\002{\002u\002X\005)\005H\001\023\001$\005A\005B\005G\002Y\005\\\002\024\005X\002w\000\200\002\139\005Y\005[\005\134\005j\005n\005p\002s\005r\002{\005~\002x\001.\003\018\005\142\004\026\002u\001\016\005\144\002\132\005\145\001\132\002z\001\023\001$\005\150\005\154\002\024\002{\002w\000\200\005\158\005\176\002\020\002\021\001e\002x\005\183\002~\005\187\005\211\001%\005\232\006\000\002\132\002\134\001\132\002z\002X\006\n\006:\0064\0065\0069\006H\002x\002Y\002~\006q\002{\006|\006\135\002\191\002\132\006\155\001\132\002z\002u\006\156\002s\002\134\004\"\002\020\002\021\001e\001%\006\160\006\200\002\024\006\204\002w\000\200\006\214\006\218\007(\000\000\002x\002X\002~\002\134\000\000\000\000\000\000\000\000\002\132\002Y\001\132\002z\001\198\000\000\002$\002\194\000\000\000\000\000\000\004(\000\000\001\230\002s\000\000\002{\001\234\000\000\001\023\000\000\000\000\000\000\001\198\000\000\003\252\002\134\002\020\002\021\001e\000\000\000\000\001\230\000\000\000\000\002u\001\234\000\000\001\023\000\000\000\000\000\000\002X\002x\000\000\002~\002\024\000\000\002w\000\200\002Y\002\132\000\000\001\132\002z\000\000\002\217\001\235\000\000\000\000\002\020\002\021\001e\002s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\236\000\000\000\000\002u\002X\001\235\002\134\002{\000\000\000\000\000\000\000\000\002Y\000\000\002\024\000\000\002w\000\200\002\224\001\236\000\000\000\000\000\000\000\000\000\000\002s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002x\000\000\002~\000\000\002\020\002\021\001e\001\198\002\132\004C\001\132\002z\002{\000\000\000\000\001\198\001\230\004G\002u\002X\001\234\000\000\001\023\000\000\001\230\000\000\000\000\002Y\001\234\002\024\001\023\002w\000\200\002\227\002\134\000\000\000\000\000\000\000\000\002x\002s\002~\000\000\002\020\002\021\001e\000\000\002\132\000\000\001\132\002z\002u\000\000\000\000\000\000\002\020\002\021\001e\002X\000\000\001\235\002{\002\024\000\000\002w\000\200\002Y\000\000\001\235\000\000\002X\000\000\002\233\002\134\001\236\000\000\000\000\000\000\002Y\002s\000\000\000\000\001\236\000\000\002\236\000\000\000\000\000\000\002x\000\000\002~\002s\000\000\000\000\002{\000\000\002\132\000\000\001\132\002z\002u\000\000\000\000\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\000\000\000\000\000\000\000\000\002X\002x\002\134\002~\000\000\000\000\000\000\000\000\002Y\002\132\000\000\001\132\002z\000\000\003\005\000\000\000\000\000\000\000\000\002u\000\000\002s\000\000\002{\000\000\000\000\000\000\000\000\000\000\000\000\002\024\002u\002w\000\200\000\000\002\134\002\020\002\021\001e\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\000\000\000\000\000\000\002x\002X\002~\000\000\000\000\001\198\000\000\004J\002\132\002Y\001\132\002z\002{\000\000\001\230\000\000\000\000\000\000\001\234\003\015\001\023\000\000\002s\000\000\002{\000\000\000\000\001\031\000\000\000\000\0052\002u\000\000\000\000\002\134\000\000\000\000\001\031\000\000\002x\001 \002~\002\024\000\000\002w\000\200\000\000\002\132\000\000\001\132\002z\002x\000\000\002~\001\"\000\000\000\000\000\000\001\235\002\132\000\000\001\132\002z\000\000\001\"\000\000\000\000\000\000\000\000\002\020\002\021\001e\001\236\002\134\002{\004\236\000\000\000\000\000\000\000\000\000\000\000\000\002u\000\000\002X\002\134\000\000\000\000\000\000\000\000\005\192\000\000\002Y\002\024\000\000\002w\000\200\000\000\0054\000\000\000\000\002x\003\020\002~\000\000\002s\000\000\000\000\001*\002\132\000\000\001\132\002z\002\020\002\021\001e\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\002{\000\000\001\016\002X\000\000\000\000\000\000\002X\001\023\0057\002\134\002Y\001\016\000\000\000\000\002Y\000\000\000\000\001\023\001$\000\000\003\022\000\000\000\000\002s\003\026\000\000\002x\002s\003\018\000\000\000\000\002\020\002\021\001e\002\132\000\000\001\132\002z\000\000\002u\000\000\000\000\000\000\000\000\000\000\000\000\002X\000\000\000\000\000\000\002\024\000\000\002w\000\200\002Y\000\000\000\000\000\000\000\000\0058\002\134\000\000\001>\000\000\003\"\000\000\000\000\002s\000\000\001%\002\020\002\021\001e\004\241\005\002\001\198\005=\004X\005:\000\000\000\000\000\000\002{\002u\001\230\002X\000\000\002u\001\234\001.\001\023\000\000\000\000\002Y\002\024\000\000\002w\000\200\002\024\001.\002w\000\200\001H\003(\000\000\000\000\002s\000\000\000\000\002x\000\000\003\018\000\000\000\000\002\020\002\021\001e\002\132\000\000\001\132\002z\000\000\000\000\000\000\000\000\000\000\002{\002u\001\235\002X\002{\000\000\000\000\002\020\002\021\001e\000\000\002Y\002\024\000\000\002w\000\200\001\236\002\134\000\000\000\000\000\000\003.\002X\000\000\002s\000\000\000\000\002x\000\000\003\018\002Y\002x\000\000\003\018\000\000\002\132\0036\001\132\002z\002\132\002u\001\132\002z\002s\002{\000\000\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\000\000\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\002x\000\000\003\018\000\000\000\000\001\198\000\000\004\169\002\132\000\000\001\132\002z\002{\002u\001\230\002\020\002\021\001e\001\234\000\000\001\023\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\000\000\002X\000\000\002u\000\000\002\134\000\000\000\000\000\000\002Y\002x\000\000\003\018\000\000\002\024\003;\002w\000\200\002\132\000\000\001\132\002z\002s\000\000\001\198\000\000\004\175\002{\000\000\001\235\002\020\002\021\001e\001\230\002\020\002\021\001e\001\234\000\000\001\023\000\000\000\000\000\000\001\236\002\134\002X\002{\000\000\000\000\002X\000\000\000\000\000\000\002Y\002x\000\000\0032\002Y\000\000\000\000\000\000\000\000\002\132\003G\001\132\002z\002s\003L\000\000\000\000\002s\000\000\000\000\002x\000\000\002~\000\000\001\235\000\000\000\000\000\000\002\132\002u\001\132\002z\002\020\002\021\001e\002\134\000\000\000\000\001\236\000\000\002\024\000\000\002w\000\200\001\198\000\000\004\184\002X\000\000\000\000\000\000\000\000\000\000\001\230\002\134\002Y\000\000\001\234\000\000\001\023\002\020\002\021\001e\000\000\000\000\003Q\000\000\000\000\002s\000\000\000\000\000\000\002{\002u\000\000\002X\000\000\002u\000\000\002\020\002\021\001e\000\000\002Y\002\024\000\000\002w\000\200\002\024\000\000\002w\000\200\000\000\003`\002X\000\000\002s\001\235\000\000\002x\000\000\002~\002Y\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\001\236\003c\000\000\000\000\002s\002{\000\000\000\000\000\000\002{\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002u\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\002x\000\000\003\018\000\000\002x\000\000\003\018\000\000\002\132\000\000\001\132\002z\002\132\002u\001\132\002z\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\002\024\000\000\002w\000\200\002{\000\000\000\000\000\000\002u\002X\002\134\002\020\002\021\001e\002\134\000\000\000\000\002Y\000\000\002\024\000\000\002w\000\200\003i\000\000\000\000\002X\000\000\000\000\000\000\002s\002x\002{\003\018\002Y\000\000\000\000\000\000\000\000\002\132\003k\001\132\002z\000\000\000\000\000\000\000\000\002s\000\000\000\000\000\000\002{\000\000\000\000\000\000\000\000\002\020\002\021\001e\002x\000\000\003\018\000\000\000\000\000\000\002\134\000\000\002\132\000\000\001\132\002z\002X\000\000\000\000\000\000\000\000\000\000\000\000\002x\002Y\0032\000\000\000\000\000\000\000\000\003u\002\132\000\000\001\132\002z\002u\000\000\002s\002\134\000\000\000\000\002\020\002\021\001e\000\000\000\000\002\024\000\000\002w\000\200\000\000\000\000\002u\002\020\002\021\001e\002X\002\134\000\000\000\000\000\000\000\000\000\000\002\024\002Y\002w\000\200\000\000\002X\000\000\003~\000\000\000\000\000\000\000\000\000\000\002Y\002s\002{\000\000\000\000\000\000\003\129\000\000\000\000\001\198\000\000\004\192\000\000\002s\000\000\000\000\000\000\000\000\001\230\002{\000\000\002u\001\234\000\000\001\023\000\000\000\000\000\000\000\000\002x\000\000\002~\002\024\000\000\002w\000\200\001\198\002\132\006w\001\132\002z\000\000\000\000\000\000\000\000\001\230\002x\000\000\002~\001\234\000\000\001\023\000\000\000\000\002\132\000\000\001\132\002z\000\000\000\000\000\000\002u\001\235\002\134\002{\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\024\002u\002w\000\200\001\236\002\020\002\021\001e\002\134\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\001\235\000\000\002x\002X\002~\002\020\002\021\001e\000\000\000\000\002\132\002Y\001\132\002z\001\236\002{\000\000\003\143\000\000\000\000\002X\000\000\000\000\000\000\002s\000\000\000\000\002{\002Y\000\000\000\000\000\000\000\000\000\000\003\146\000\000\002\134\000\000\000\000\000\000\000\000\002s\002x\000\000\002~\000\000\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\002x\000\000\002~\000\000\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\002X\000\000\002u\000\000\000\000\000\000\002\134\000\000\002Y\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\003\156\002u\000\000\002s\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\000\000\000\000\000\000\000\000\002X\002\020\002\021\001e\000\000\000\000\002{\000\000\002Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002X\000\000\003\183\000\000\000\000\002s\000\000\002{\002Y\000\000\000\000\000\000\000\000\000\000\003\244\000\000\000\000\002x\000\000\002~\000\000\002s\000\000\000\000\000\000\002\132\002u\001\132\002z\000\000\000\000\002\020\002\021\001e\002x\000\000\002~\002\024\000\000\002w\000\200\000\000\002\132\000\000\001\132\002z\002X\000\000\002\020\002\021\001e\002\134\000\000\000\000\002Y\000\000\000\000\000\000\000\000\000\000\004\001\000\000\000\000\002X\000\000\002u\000\000\002s\002\134\002{\000\000\002Y\000\000\000\000\000\000\000\000\002\024\004-\002w\000\200\000\000\002u\000\000\000\000\002s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\002x\000\000\003\159\000\000\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\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\002{\000\000\000\000\002u\000\000\000\000\002\134\000\000\000\000\000\000\000\000\002x\000\000\003\186\002\024\000\000\002w\000\200\000\000\002\132\002u\001\132\002z\000\000\000\000\000\000\000\000\002x\000\000\002~\000\000\002\024\000\000\002w\000\200\002\132\000\000\001\132\002z\000\000\000\000\000\000\000\000\000\000\000\000\002\134\002{\001d\001e\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\134\000\000\002{\000\000\000\000\002X\001f\001v\000\000\001h\001i\000\000\002x\002Y\002~\000\000\000\000\000\000\000\000\004p\002\132\000\000\001\132\002z\000\000\000\000\002s\000\000\000\000\002x\004=\002~\002\020\002\021\001e\000\000\000\000\002\132\000\000\001\132\002z\000\000\000\000\000\000\000\000\000\000\002\134\002X\000\000\000\000\001w\000\000\001x\0024\000\000\002Y\000\000\000\000\000\000\000\000\000\000\005\157\000\000\002\134\000\000\000\000\000\000\000\000\002s\000\000\000\000\000\000\000\000\002\020\002\021\001e\000\000\000\000\002\020\002\021\001e\001\127\000\000\000\000\000\000\000\000\002u\000\000\002X\000\000\000\000\000\000\001n\002X\000\000\000\200\002Y\002\024\000\000\002w\000\200\002Y\005\160\003\134\000\000\000\000\000\000\005\175\000\000\002s\000\000\000\000\000\000\000\000\002s\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002u\002{\000\000\000\000\002X\000\000\000\000\000\000\000\000\000\000\000\000\002\024\002Y\002w\000\200\000\000\000\000\000\000\005\178\000\000\000\000\000\000\000\000\001\129\000\000\002s\000\000\000\000\002x\000\000\002~\001\130\000\000\001\132\001l\000\000\002\132\000\000\001\132\002z\000\000\002u\000\000\002{\000\000\000\000\002u\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\002\024\000\000\002w\000\200\000\000\002\134\000\000\002\020\002\021\001e\000\000\000\000\000\000\002x\000\000\002~\000\000\000\000\000\000\000\000\000\000\002\132\002X\001\132\002z\000\000\000\000\002{\002u\000\000\002Y\000\000\002{\000\000\000\000\000\000\005\191\000\000\000\000\002\024\000\000\002w\000\200\002s\000\000\000\000\000\000\002\134\000\000\000\000\000\000\002\020\002\021\001e\002x\000\000\002~\000\000\000\000\002x\000\000\002~\002\132\000\000\001\132\002z\002X\002\132\000\000\001\132\002z\002{\000\000\000\000\002Y\000\000\000\000\000\000\000\000\000\000\005\194\000\000\002\020\002\021\001e\000\000\000\000\002s\002\134\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\002X\002x\000\000\002~\000\000\000\000\002u\000\000\002Y\002\132\000\000\001\132\002z\000\000\005\215\000\000\000\000\002\024\000\000\002w\000\200\002s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002X\000\000\000\000\000\000\000\000\002{\002u\000\000\002Y\000\000\000\000\000\000\000\000\000\000\005\218\000\000\000\000\002\024\000\000\002w\000\200\002s\000\000\000\000\002\020\002\021\001e\000\000\000\000\002\020\002\021\001e\002x\000\000\002~\000\000\000\000\002u\000\000\002X\002\132\000\000\001\132\002z\002X\000\000\000\000\002Y\002\024\002{\002w\000\200\002Y\005\222\000\000\000\000\000\000\000\000\006\231\000\000\002s\000\000\000\000\000\000\000\000\002s\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002x\000\000\002~\000\000\002{\002u\001d\001e\002\132\000\000\001\132\002z\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\000\000\000\000\000\000\000\000\000\000\001f\001v\000\000\001h\001i\002x\000\000\002~\002\134\000\000\000\000\001\031\000\000\002\132\001 \001\132\002z\000\000\002u\000\000\000\000\000\000\002{\002u\006\129\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\002\024\000\000\002w\000\200\001\"\002\134\002\020\002\021\001e\000\000\001w\000\000\001x\0024\000\000\002x\000\000\002~\000\000\000\000\000\000\002X\000\000\002\132\000\000\001\132\002z\002{\000\000\002Y\000\000\000\000\002{\000\000\000\000\006\233\000\000\000\000\000\000\000\000\000\000\001\127\002s\000\000\000\000\000\000\000\000\000\000\001*\002\134\000\000\000\000\001n\000\000\002x\000\200\002~\000\000\000\000\002x\000\000\002~\002\132\003\134\001\132\002z\000\000\002\132\000\000\001\132\002z\000\000\000\000\000\000\000\000\001d\001e\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\000\000\000\000\000\000\002\134\002\020\002\021\001e\000\000\002\134\000\000\001f\001v\000\000\001h\001i\000\000\000\000\002u\000\000\002X\000\000\000\000\000\000\002\020\002\021\001e\001\129\002Y\002\024\000\000\002w\000\200\000\000\000\000\001\130\000\000\001\132\001l\002X\000\000\002s\001d\001e\001>\000\000\000\000\002Y\000\000\000\000\000\000\001%\000\000\000\000\000\000\001w\000\000\001x\002\203\000\000\002s\002{\001f\001v\000\000\001h\001i\000\000\000\000\000\000\000\000\000\000\001\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000m\001.\000\000\000\000\001?\000\000\001\127\000\000\002x\000\000\002~\000\000\000\000\000\000\000\000\006;\002\132\001n\001\132\002z\000\200\002u\000\000\000\000\000\000\000\000\001w\000\000\001x\001\153\000\000\000\000\002\024\006<\002w\000\200\006>\000\000\000\000\000\000\002u\000\000\002\134\000\000\000\000\006?\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\000\000\001\127\000\000\000\000\000\000\000\000\000\000\000\000\002{\000\000\000\000\000\000\001n\000\000\000\000\000\200\000\000\000\000\000\000\006@\001\129\000\000\000\000\000\000\000\000\000\000\000\000\002{\001\130\000\000\001\132\001l\002\020\002\021\001e\002x\000\000\004>\000\000\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\002X\000\000\000\000\000\000\000\000\000\000\006A\002x\002Y\004:\000\000\000\000\000\000\000\000\006B\002\132\000\000\001\132\002z\001d\001e\002s\002\134\000\000\001\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\130\000\000\001\132\001l\001d\001e\006C\001f\001v\002\134\001h\001i\000\000\000\000\000\000\000\000\000\000\001\150\000\000\001d\001e\006D\000\000\000\000\001f\001v\000\000\001h\001i\000\000\006E\000\000\000\000\000\000\001\155\006G\000\000\000\000\000\000\001f\001v\000\000\001h\001i\000\000\006I\000\000\000\000\000\000\002u\000\000\001w\000\000\001x\001\153\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\006J\000\000\000\000\000\000\001w\000\000\001x\001\153\000\000\000\000\000\000\000\000\000\000\001d\001e\000\000\000\000\000\000\001\127\001w\000\000\001x\0024\000\000\000\000\000\000\000\000\000\000\002{\001n\000\000\000\000\000\200\001f\001v\001\127\001h\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001n\001d\001e\000\200\001\127\000\000\000\000\000\000\000\000\002x\000\000\003\226\002\020\002\021\001e\001n\000\000\002\132\000\200\001\132\002z\001f\001g\000\000\001h\001i\003\130\002X\000\000\000\000\000\000\001w\000\000\001x\002<\002Y\000\000\000\000\000\000\000\000\000\000\000\000\001\129\002\134\000\000\002\020\002\021\001e\002s\000\000\001\130\000\000\001\132\001l\000\000\000\000\000\000\000\000\000\000\001\129\002X\000\000\001\127\002\020\002\021\001e\000\000\001\130\002Y\001\132\001l\000\000\000\000\001n\001\129\000\000\000\200\000\000\002X\000\000\000\000\002s\001\130\000\000\001\132\001l\002Y\000\000\000\000\000\000\000\000\002\020\002\021\001e\000\000\000\000\001m\000\000\000\000\002s\000\000\000\000\000\000\002?\000\000\000\000\002X\001n\002u\000\000\000\200\000\000\000\000\000\000\002Y\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\000\000\000\000\000\000\002s\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\130\002u\001\132\001l\000\000\002\020\002\021\001e\000\000\000\000\000\000\002{\002\024\000\000\002w\000\200\000\000\000\000\000\000\002u\002X\000\000\000\000\000\000\000\000\000\000\001\129\000\000\002Y\000\000\002\024\000\000\002w\000\200\001\157\000\000\001\132\001l\002x\000\000\003\\\002s\000\000\000\000\002{\000\000\002\132\002u\001\132\002z\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\002{\000\000\000\000\000\000\002X\000\000\000\000\000\000\000\000\002x\002\134\003\003\002Y\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\000\000\000\000\000\000\000\000\002s\000\000\002x\002{\002\128\000\000\002\020\002\021\001e\000\000\002\132\000\000\001\132\002z\002u\000\000\000\000\000\000\002\134\000\000\000\000\002X\000\000\000\000\000\000\002\024\000\000\002w\000\200\002Y\002x\000\000\002\130\000\000\000\000\000\000\002\134\000\000\002\132\000\000\001\132\002z\002s\000\000\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\002\020\002\021\001e\000\000\002{\000\000\000\000\002u\002X\000\000\000\000\002\134\000\000\000\000\000\000\002X\002Y\000\000\002\024\000\000\002w\000\200\000\000\002Y\000\000\000\000\000\000\000\000\000\000\002s\000\000\002x\000\000\002\135\000\000\000\000\002s\001\031\000\000\002\132\001 \001\132\002z\000\000\000\000\000\000\000\000\000\000\000\000\002u\002{\000\000\000\000\000\000\000\000\002\020\002\021\001e\000\000\000\000\002\024\000\000\002w\000\200\001\"\002\134\000\000\000\000\000\000\000\000\002X\000\000\000\000\000\000\000\000\000\000\000\000\002x\002Y\002\142\000\000\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\002u\000\000\002s\002{\000\000\000\000\000\000\002u\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\000\000\000\000\002\024\001*\002w\000\200\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002x\000\000\002\144\000\000\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\000\000\002{\000\000\000\000\000\000\000\000\001\016\000\000\002{\000\000\000\000\000\000\001\023\001$\000\000\000\000\000\000\000\000\000\000\000\000\002u\000\000\002\134\000\000\000\000\002\020\002\021\001e\002x\000\000\002\146\002\024\000\000\002w\000\200\002x\002\132\002\148\001\132\002z\002X\000\000\000\000\002\132\000\000\001\132\002z\000\000\002Y\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\001>\000\000\000\000\000\000\002s\002\134\002{\001%\002X\002\020\002\021\001e\002\134\002\020\002\021\001e\002Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002X\000\000\000\000\000\000\002X\002s\000\000\000\000\002Y\002x\000\000\002\150\002Y\001.\000\000\000\000\001\207\002\132\000\000\001\132\002z\002s\000\000\000\000\000\000\002s\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\002u\000\000\000\000\002\134\000\000\000\000\000\000\0073\000\000\000\000\006>\002\024\000\000\002w\000\200\000\000\000\000\000\000\000\000\006?\000\000\000\000\000\000\000\000\000\000\002u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\002u\000\000\002{\000\000\002u\002\020\002\021\001e\006@\000\000\000\000\002\024\000\000\002w\000\200\002\024\000\000\002w\000\200\000\000\002X\002\020\002\021\001e\000\000\000\000\000\000\002{\002Y\002x\000\000\002\152\000\000\000\000\000\000\000\000\002X\002\132\000\000\001\132\002z\002s\006A\002{\002Y\000\000\000\000\002{\000\000\000\000\006B\000\000\000\000\000\000\002x\000\000\002\154\002s\000\000\000\000\000\000\000\000\002\132\002\134\001\132\002z\000\000\000\000\000\000\000\000\002x\0074\002\156\000\000\002x\000\000\002\158\000\000\002\132\000\000\001\132\002z\002\132\000\000\001\132\002z\000\000\000\000\002\134\006D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006E\005I\000\000\002u\000\000\006G\002\134\000\000\000\000\000\000\002\134\000\000\000\000\000\000\002\024\006I\002w\000\200\000\000\002u\002\020\002\021\001e\000\000\002\020\002\021\001e\000\000\000\000\005J\002\024\005K\002w\000\200\006J\002X\002\020\002\021\001e\002X\002\020\002\021\001e\002Y\000\000\000\000\002{\002Y\000\000\000\000\000\000\002X\000\000\000\000\000\000\002X\002s\000\000\000\000\002Y\002s\005L\002{\002Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\031\002s\002x\001 \002\160\002s\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\000\000\000\000\000\000\000\000\002x\000\000\002\162\000\000\000\000\005M\000\000\000\000\002\132\001\"\001\132\002z\000\000\000\000\005N\000\000\005O\000\000\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002u\000\000\000\000\000\000\002u\000\000\000\000\002\134\000\000\000\000\000\000\002\024\005P\002w\000\200\002\024\002u\002w\000\200\000\000\002u\002\020\002\021\001e\000\000\000\000\001*\002\024\000\000\002w\000\200\002\024\000\000\002w\000\200\005Q\002X\002\020\002\021\001e\005S\005]\000\000\002{\002Y\000\000\000\000\002{\001\031\000\000\005\135\001 \002X\000\000\000\000\001\016\000\000\002s\000\000\002{\002Y\001\023\001$\002{\000\000\000\000\000\000\000\000\000\000\005\136\002x\000\000\002\164\002s\002x\001\"\002\166\006\180\002\132\000\000\001\132\002z\002\132\000\000\001\132\002z\002x\000\000\002\168\000\000\002x\000\000\002\170\000\000\002\132\000\000\001\132\002z\002\132\000\000\001\132\002z\000\000\000\000\002\134\000\000\001-\000\000\002\134\000\000\000\000\000\000\000\000\001%\000\000\000\000\000\000\002u\000\000\001*\002\134\000\000\000\000\000\000\002\134\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\002u\002\020\002\021\001e\000\000\002\020\002\021\001e\000\000\000\000\001.\002\024\000\000\002w\000\200\001\016\002X\002\020\002\021\001e\002X\001\023\001$\000\000\002Y\000\000\000\000\002{\002Y\000\000\000\000\000\000\002X\000\000\000\000\000\000\000\000\002s\000\000\000\000\002Y\002s\000\000\002{\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002s\002x\000\000\002\172\000\000\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\001>\000\000\000\000\000\000\002x\000\000\002\174\001%\000\000\000\000\000\000\006\187\002\132\000\000\001\132\002z\000\000\000\000\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\001\031\000\000\000\000\001 \000\000\002u\0012\000\000\000\000\002u\000\000\001.\002\134\000\000\001H\000\000\002\024\000\000\002w\000\200\002\024\002u\002w\000\200\000\000\000\000\0013\001\"\000\000\000\000\000\000\000\000\002\024\001O\002w\000\200\001d\001e\000\000\000\000\002\020\002\021\001e\000\000\000\000\002\192\000\000\000\000\002{\000\000\000\000\000\000\002{\002\195\000\000\002X\001f\002\196\000\000\001h\001i\000\000\000\000\002Y\002{\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\002x\002s\002\176\000\000\002x\000\000\002\178\000\000\002\132\000\000\001\132\002z\002\132\0018\001\132\002z\002x\000\000\002\180\001d\001e\000\000\000\000\000\000\002\132\001\016\001\132\002z\002\192\000\000\000\000\001\023\001$\000\000\002\134\000\000\002\195\000\000\002\134\001f\002\196\000\000\001h\001i\000\000\000\000\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\001m\000\000\000\000\000\000\000\000\002u\002\020\002\021\001e\000\000\000\000\001n\000\000\000\000\000\200\000\000\002\024\000\000\002w\000\200\001>\002X\000\000\002\020\002\021\001e\000\000\001%\000\000\002Y\000\000\001F\000\000\000\000\001\031\000\000\000\000\0052\002X\000\000\000\000\000\000\002s\000\000\000\000\002\197\002Y\000\000\002{\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\001.\001m\002s\001H\001\"\000\000\000\000\000\000\002\199\002X\000\000\000\000\001n\001\129\000\000\000\200\000\000\002Y\002x\000\000\003\t\001\157\000\000\001\132\001l\000\000\002\132\000\000\001\132\002z\002s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002u\002\197\000\000\0054\002\020\002\021\001e\002\134\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\000\000\002u\000\000\002X\000\000\002\198\000\000\000\000\000\000\000\000\001\129\002Y\002\024\000\000\002w\000\200\001\016\000\000\001\157\000\000\001\132\001l\001\023\0057\002s\000\000\000\000\002{\000\000\002u\002\020\002\021\001e\000\000\002\020\002\021\001e\000\000\000\000\000\000\002\024\000\000\002w\000\200\002{\002X\000\000\000\000\000\000\002X\000\000\000\000\000\000\002Y\002x\000\000\003&\002Y\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\002s\000\000\000\000\000\000\002s\002x\002{\003,\0058\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\000\000\002u\002\020\002\021\001e\002\134\005\002\000\000\005<\000\000\005:\000\000\002\024\000\000\002w\000\200\002x\002X\0031\000\000\000\000\001.\002\134\000\000\002\132\002Y\001\132\002z\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\001\031\000\000\002s\001 \000\000\000\000\000\000\002u\002{\002X\000\000\002u\000\000\000\000\002\134\000\000\000\000\002Y\002\024\000\000\002w\000\200\002\024\000\000\002w\000\200\000\000\001\"\000\000\000\000\002s\000\000\000\000\000\000\000\000\002x\000\000\0039\004\019\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\000\000\000\000\000\000\002{\000\000\004\022\000\000\002{\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002u\000\000\000\000\000\000\000\000\000\000\000\000\002\134\000\000\001*\000\000\002\024\000\000\002w\000\200\002x\000\000\003>\000\000\002x\000\000\003@\000\000\002\132\000\000\001\132\002z\002\132\002u\001\132\002z\002\020\002\021\001e\000\000\000\000\000\000\000\000\001\016\002\024\000\000\002w\000\200\002{\001\023\001$\002X\000\000\000\000\002\134\002\020\002\021\001e\002\134\002Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002X\000\000\002s\000\000\000\000\002x\002{\003C\002Y\000\000\000\000\001\031\000\000\002\132\0052\001\132\002z\000\000\000\000\000\000\000\000\002s\000\000\000\000\001>\000\000\000\000\000\000\000\000\000\000\000\000\001%\000\000\002x\000\000\003J\000\000\000\000\001\"\002\134\000\000\002\132\000\000\001\132\002z\000\000\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\002u\002X\004\026\000\000\000\000\002\134\002\020\002\021\001e\002Y\000\000\002\024\000\000\002w\000\200\000\000\000\000\000\000\000\000\002u\0054\002X\002s\000\000\000\000\002\020\002\021\001e\000\000\002Y\002\024\000\000\002w\000\200\000\000\000\000\000\000\000\000\000\000\000\000\002X\000\000\002s\002{\001d\001e\000\000\000\000\002Y\001\016\000\000\000\000\000\000\000\000\000\000\001\023\0057\000\000\000\000\000\000\000\000\002s\002{\000\000\001f\001v\000\000\001h\001i\000\000\002x\000\000\003O\000\000\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\002u\000\000\000\000\000\000\000\000\000\000\000\000\002x\000\000\003T\000\000\002\024\000\000\002w\000\200\002\132\000\000\001\132\002z\000\000\002u\000\000\002\134\000\000\000\000\0058\001w\000\000\001x\0024\000\000\002\024\000\000\002w\000\200\000\000\000\000\000\000\000\000\002u\005\002\002\134\005;\002{\005:\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\001.\000\000\001\127\000\000\000\000\002\020\002\021\001e\002{\000\000\002\183\001e\000\000\001n\000\000\002x\000\200\003W\000\000\000\000\002X\000\000\000\000\002\132\003\133\001\132\002z\002{\002Y\000\000\002\229\001v\000\000\001h\001i\002x\000\000\003\137\000\000\000\000\000\000\002s\000\000\002\132\000\000\001\132\002z\000\000\000\000\002\134\001\031\000\000\000\000\001 \002x\000\000\003\139\000\000\002\020\002\021\001e\000\000\002\132\000\000\001\132\002z\000\000\000\000\000\000\002\134\000\000\000\000\001\129\002\234\002\250\002\251\000\000\001\"\000\000\000\000\001\130\003X\001\132\001l\002\020\002\021\001e\000\000\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002X\000\000\002u\002\020\002\021\001e\001\127\003Y\002Y\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\001n\002X\000\000\000\200\002s\001*\000\000\000\000\000\000\002Y\000\000\000\000\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\002s\000\000\000\000\000\000\000\000\000\000\002{\002X\000\000\000\000\000\000\003\148\001\016\000\000\000\000\002Y\002\023\000\000\001\023\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\024\002s\002w\000\200\000\000\000\000\002x\000\000\003\163\000\000\001\129\000\000\000\000\000\000\002\132\002u\001\132\002z\001\130\000\000\001\132\001l\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\000\000\000\000\002u\000\000\003[\006\179\000\000\000\000\000\000\002\134\000\000\000\000\001%\002\024\000\000\002w\000\200\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002{\002x\000\000\002u\000\000\002X\000\000\000\000\000\000\002y\000\000\001\132\002z\002Y\002\024\001.\002w\000\200\002{\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002s\002x\000\000\003\172\000\000\000\000\000\000\000\000\000\000\002\132\000\000\001\132\002z\002\183\001e\000\000\000\000\000\000\000\000\002x\002{\003\174\002\183\001e\000\000\000\000\000\000\002\132\000\000\001\132\002z\000\000\000\000\002\229\001v\002\134\001h\001i\000\000\000\000\000\000\000\000\002\229\001v\000\000\001h\001i\002x\000\000\003\176\000\000\000\000\000\000\002\134\000\000\002\132\000\000\001\132\002z\000\000\002u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\002\234\002\250\002\251\000\000\000\000\002\134\000\000\000\000\000\000\002\234\002\250\002\251\000\000\000\000\002\183\001e\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\127\000\000\002\229\001v\000\000\001h\001i\000\000\000\000\001\127\000\000\001n\000\000\000\000\000\200\000\000\001d\001e\000\000\000\000\001n\000\000\002x\000\200\003\190\000\000\000\000\000\000\001d\001e\002\132\000\000\001\132\002z\001d\001e\001f\002\196\000\000\001h\001i\000\000\000\000\000\000\0043\002\234\002\250\002\251\001f\001v\000\000\001h\001i\005\233\001f\001v\002\134\001h\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\000\000\001\127\001\130\001\129\001\132\001l\000\000\000\000\000\000\000\000\000\000\001\130\001n\001\132\001l\000\200\001w\000\000\001x\007\029\000\000\007\031\001w\000\000\001x\006`\000\000\000\000\000\000\000\000\001\031\000\000\000\000\001 \000\000\001m\0012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\011\001n\001\127\000\000\000\200\000\000\000\000\000\000\001\127\000\000\000\000\0013\001\"\001n\000\000\000\000\000\200\000\000\0014\001n\000\000\000\000\000\200\000\000\001\031\000\000\001\129\001 \000\000\000\000\0012\000\000\000\000\000\000\001\130\003v\001\132\001l\000\000\000\000\000\000\000\000\000\000\001d\001e\000\000\000\000\000\000\000\000\000\000\0013\001\"\000\000\000\000\003x\000\000\001*\001M\000\000\000\000\001\129\000\000\000\000\001f\001v\000\000\001h\001i\001\157\000\000\001\132\001l\001\129\0018\000\000\000\000\000\000\000\000\001\129\000\000\001\130\000\000\001\132\001l\001\031\001\016\001\130\0052\001\132\001l\000\000\001\023\001$\001d\001e\001*\000\000\000\000\001d\001e\000\000\000\000\000\000\000\000\000\000\001d\001e\001w\000\000\001x\001\158\001\"\0018\001f\001v\000\000\001h\001i\001f\001v\000\000\001h\001i\000\000\001\016\001f\001v\000\000\001h\001i\001\023\001$\000\000\000\000\000\000\000\000\001>\000\000\001\127\000\000\000\000\000\000\000\000\001%\000\000\000\000\000\000\001F\000\000\001n\000\000\000\000\000\200\000\000\000\000\0054\000\000\001w\000\000\001x\001\136\000\000\001w\000\000\001x\001\133\000\000\000\000\000\000\001w\000\000\001x\001z\001.\000\000\001>\001H\000\000\000\000\000\000\000\000\000\000\001%\000\000\001\016\000\000\001F\000\000\001\127\000\000\001\023\0057\000\000\001\127\000\000\000\000\000\000\000\000\000\000\001n\001\127\000\000\000\200\000\000\001n\000\000\000\000\000\200\001\129\000\000\000\000\001n\001.\000\000\000\200\001H\001\130\000\000\001\132\001l\001d\001e\000\000\000\000\000\000\001d\001e\000\000\000\000\000\000\000\000\000\000\001d\001e\000\000\000\000\000\000\000\000\000\000\000\000\001f\001v\0058\001h\001i\001f\001v\000\000\001h\001i\000\000\000\000\001f\001v\000\000\001h\001i\005\002\001\129\0059\000\000\005:\000\000\001\129\000\000\000\000\001\130\000\000\001\132\001l\001\129\001\130\001.\001\132\001l\000\000\000\000\000\000\001\130\000\000\001\132\001l\001d\001e\001w\000\000\001x\001}\000\000\001w\000\000\001x\001\128\000\000\000\000\000\000\001w\000\000\001x\001\131\000\000\000\000\001f\001v\000\000\001h\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\127\001d\001e\000\000\000\000\001\127\000\000\000\000\000\000\000\000\000\000\001n\001\127\000\000\000\200\000\000\001n\000\000\000\000\000\200\000\000\001f\001v\001n\001h\001i\000\200\000\000\001d\001e\000\000\001w\000\000\001x\001\141\001d\001e\002\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\228\000\000\000\000\001f\002\196\000\000\001h\001i\000\000\000\000\001f\001v\000\000\001h\001i\000\000\000\000\001\127\000\000\000\000\001w\000\000\001x\001\144\000\000\001\129\000\000\000\000\001n\000\000\001\129\000\200\000\000\001\130\000\000\001\132\001l\001\129\001\130\000\000\001\132\001l\000\000\001d\001e\001\130\000\000\001\132\001l\000\000\000\000\001\127\000\000\000\000\001w\000\000\001x\002N\000\000\000\000\000\000\000\000\001n\001f\001v\000\200\001h\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001m\000\000\001d\001e\000\000\000\000\000\000\001\127\000\000\001\129\000\000\001n\000\000\000\000\000\200\000\000\000\000\001\130\001n\001\132\001l\000\200\001f\001v\000\000\001h\001i\000\000\000\000\001w\000\000\001x\002\239\000\000\000\000\000\000\000\000\000\000\001d\001e\000\000\000\000\000\000\001\129\000\000\002\197\000\000\000\000\000\000\000\000\000\000\001\130\000\000\001\132\001l\000\000\000\000\000\000\001f\001v\001\127\001h\001i\000\000\000\000\000\000\001w\000\000\001x\002\242\001\129\001n\000\000\000\000\000\200\000\000\000\000\001\129\001\157\000\000\001\132\001l\000\000\000\000\000\000\001\130\000\000\001\132\001l\001d\001e\000\000\000\000\000\000\000\000\001d\001e\001\127\000\000\000\000\000\000\000\000\001w\000\000\001x\002\245\000\000\000\000\001n\001f\001v\000\200\001h\001i\000\000\001f\001v\000\000\001h\001i\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\129\000\000\000\000\001\127\000\000\000\000\000\000\000\000\001\130\000\000\001\132\001l\000\000\003\201\001n\000\000\000\000\000\200\000\000\000\000\003\210\000\000\000\000\001w\000\000\001x\002\253\000\000\000\000\001w\000\000\001x\003\170\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\000\000\003\211\001\130\000\000\001\132\001l\000\000\000\000\000\000\000\000\000\000\001\127\000\000\001d\001e\000\000\000\000\001\127\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\200\000\000\000\000\001n\000\000\001\129\000\200\000\000\001f\001v\000\000\001h\001i\001\130\001\031\001\132\001l\001 \002\023\000\000\001I\000\000\001\031\000\000\000\000\001 \000\000\000\000\0012\003\214\000\000\002w\000\200\001\002\000\000\000\000\000\000\000\000\000\000\000\000\001K\001\"\000\000\000\000\000\000\000\000\004\251\000\000\0017\001\"\000\000\000\000\001w\000\000\001x\004n\001\129\000\000\000\000\000\000\000\000\000\000\001\129\000\000\001\130\003\204\001\132\001l\000\000\000\000\001\130\000\000\001\132\001l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\127\000\000\001*\001\031\000\000\002x\0052\000\000\000\000\000\000\001*\001n\000\000\002y\000\200\001\132\002z\000\000\000\000\0018\001d\001e\000\000\000\000\000\000\000\000\000\000\0018\000\000\000\000\001\"\001\016\000\000\001d\001e\000\000\000\000\001\023\001$\001\016\001f\002\196\000\000\001h\001i\001\023\001$\000\000\001d\001e\0049\000\000\000\000\001f\002\196\000\000\001h\001i\000\000\000\000\000\000\000\000\000\000\001d\001e\000\000\000\000\000\000\001f\002\196\001\129\001h\001i\000\000\0054\001d\001e\000\000\001\130\000\000\001\132\001l\001>\001f\002\196\000\000\001h\001i\000\000\001%\001>\000\000\005\195\0051\000\000\001f\002\196\001%\001h\001i\000\000\001F\000\000\001\016\000\000\000\000\000\000\000\000\000\000\001\023\0057\000\000\000\000\000\000\000\000\001m\000\000\000\000\000\000\001.\000\000\000\000\001H\000\000\001d\001e\001n\001.\001m\000\200\001H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001n\000\000\005\219\000\200\001m\001f\002\196\000\000\001h\001i\000\000\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\200\001m\000\000\003v\0058\000\000\000\000\000\000\000\000\001d\001e\000\000\001n\001m\000\000\000\200\002\197\000\000\000\000\005\002\000\000\005E\003w\005:\001n\000\000\000\000\000\200\001\129\001f\002\196\003v\001h\001i\001.\000\000\001\157\000\000\001\132\001l\000\000\001\129\000\000\000\000\000\000\000\000\006.\000\000\000\000\001\157\003{\001\132\001l\000\000\000\000\000\000\001\129\000\000\002\197\000\000\000\000\000\000\001m\000\000\001\157\000\000\001\132\001l\000\000\000\000\000\000\001\129\000\000\001n\000\000\000\000\000\200\001d\001e\001\157\000\000\001\132\001l\001\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\157\000\000\001\132\001l\000\000\0060\001f\002\196\000\000\001h\001i\000\000\000\000\001m\001d\001e\002\197\005I\000\000\000\000\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\001f\002\196\000\000\001h\001i\000\000\000\000\001\129\000\000\005I\000\000\005J\006\239\005K\000\000\001\157\000\000\001\132\001l\000\000\000\000\000\000\000\000\000\000\005\246\000\000\000\000\000\000\000\000\000\000\000\000\001d\001e\000\000\000\000\000\000\000\000\005J\006\221\005K\000\000\000\000\000\000\005L\000\000\000\000\000\000\001m\000\000\001\129\000\000\001f\002\196\000\000\001h\001i\000\000\001\157\001n\001\132\001l\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005L\000\000\000\000\000\000\006\002\000\000\001m\005M\000\000\001\031\000\000\000\000\001 \000\000\000\000\000\000\005N\001n\005O\000\000\000\200\000\000\001\031\006.\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\005M\000\000\000\000\001\"\000\000\000\000\000\000\000\000\005\139\005N\000\000\005O\000\000\000\000\004\236\001\129\001\"\000\000\006.\000\000\000\000\000\000\000\000\001\157\001m\001\132\001l\004\236\000\000\005\206\000\000\005Q\006\241\000\000\005\139\001n\005S\005]\000\200\000\000\006/\000\000\005\216\001\129\000\000\000\000\005\135\001*\000\000\000\000\000\000\001\157\000\000\001\132\001l\000\000\000\000\005Q\000\000\000\000\001*\000\000\005S\005]\000\000\005\136\000\000\000\000\0067\003z\000\000\000\000\005\135\000\000\000\000\000\000\001\016\002\020\002\021\001e\000\000\000\000\001\023\001$\000\000\000\000\000\000\000\000\000\000\001\016\000\000\005\136\000\000\000\000\001\129\001\023\001$\000\000\001d\001e\003X\000\000\001\157\000\000\001\132\001l\000\000\000\000\000\000\000\000\000\000\006;\000\000\000\000\000\000\006;\000\000\000\000\001f\002\189\000\000\001h\001i\000\000\000\000\005\252\007<\001>\001\031\007=\007<\001 \006>\007=\001%\000\000\006>\000\000\004\241\000\000\001>\006?\000\000\000\000\000\000\006?\000\000\001%\000\000\000\000\000\000\004\241\000\000\000\000\000\000\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\000\000\002\218\001H\002\020\002\021\001e\006@\000\000\002\023\000\000\006@\000\000\001.\000\000\000\000\001H\000\000\000\000\000\000\002\024\000\000\002w\000\200\000\000\000\000\000\000\003X\000\000\001m\000\000\000\000\000\000\001\031\000\000\001*\001 \000\000\000\000\000\000\001n\006A\000\000\000\200\000\000\006A\000\000\001\031\000\000\006B\001 \000\000\000\000\006B\000\000\003[\000\000\000\000\000\000\000\000\001\"\000\000\000\000\000\000\001\016\004\251\000\000\000\000\000\000\007B\001\023\001$\000\000\007G\001\"\000\000\000\000\000\000\000\000\002x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002y\006D\001\132\002z\000\000\006D\001\031\000\000\000\000\001 \006E\000\000\001\129\002\023\006E\006G\000\000\001*\000\000\006G\001\157\000\000\001\132\001l\002\024\006I\002w\000\200\001>\006I\000\000\001*\000\000\001\"\000\000\001%\000\000\000\000\005\241\002b\000\000\000\000\000\000\000\000\006J\000\000\001\016\000\000\006J\000\000\000\000\000\000\001\023\001$\000\000\001\031\000\000\000\000\001 \003Z\001\016\000\000\000\000\000\000\000\000\001.\001\023\001$\001H\006;\000\000\000\000\000\000\000\000\000\000\001\031\000\000\001*\001 \000\000\000\000\000\000\001\"\002x\000\000\000\000\000\000\006<\000\000\006;\006>\002y\000\000\001\132\002z\000\000\000\000\001>\000\000\006?\000\000\000\000\001\"\000\000\001%\000\000\001\016\006<\005\000\000\000\006>\001>\001\023\001$\000\000\000\000\000\000\000\000\001%\006?\000\000\000\000\005\r\000\000\000\000\005\016\001*\000\000\000\000\006@\000\000\000\000\000\000\000\000\001.\000\000\000\000\001H\000\000\000\000\000\000\000\000\007\t\000\000\000\000\000\000\001*\000\000\001.\006@\001\031\001H\000\000\001 \000\000\001\016\000\000\001>\000\000\000\000\000\000\001\023\001$\006A\001%\000\000\000\000\000\000\005\000\001\031\000\000\006B\001 \000\000\000\000\001\016\000\000\001\"\002\020\002\021\001e\001\023\001$\006A\001\031\000\000\000\000\001 \000\000\001\031\000\000\006B\001 \000\000\001.\006N\001\"\001H\000\000\000\000\000\000\006o\000\000\000\000\000\000\000\000\001>\000\000\000\000\000\000\006D\001\"\000\000\001%\000\000\006W\001\"\005\r\000\000\006E\006\031\001*\000\000\000\000\006G\000\000\001>\000\000\000\000\000\000\006D\000\000\000\000\001%\006I\000\000\000\000\007\n\000\000\006E\001*\000\000\000\000\001.\006G\000\000\001H\000\000\000\000\000\000\001\016\000\000\000\000\006J\006I\001*\001\023\001$\000\000\001\031\001*\000\000\001 \001.\000\000\000\000\001H\000\000\000\000\001\016\000\000\000\000\000\000\006J\002\023\001\023\001$\002\020\002\021\001e\000\000\000\000\000\000\000\000\001\016\002\024\001\"\002w\000\200\001\016\001\023\001$\002\020\002\021\001e\001\023\001$\000\000\000\000\000\000\003\218\001>\000\000\000\000\000\000\000\000\000\000\000\000\001%\000\000\000\000\000\000\006\226\000\000\000\000\002\022\000\000\000\000\000\000\000\000\001>\000\000\001\031\000\000\000\000\001 \000\000\001%\000\000\000\000\001*\001X\000\000\000\000\001\031\001>\000\000\001 \001.\000\000\001>\001H\001%\000\000\002x\000\000\001\174\001%\000\000\001\"\000\000\001\212\002y\000\000\001\132\002z\000\000\001.\000\000\001\016\001H\001\"\000\000\000\000\000\000\001\023\001$\002\020\002\021\001e\000\000\000\000\001.\002\023\000\000\001H\000\000\001.\000\000\000\000\001H\000\000\000\000\000\000\002\024\000\000\002w\000\200\002\023\000\000\002S\000\000\000\000\001*\000\000\002\020\002\021\001e\000\000\002\024\001\031\002w\000\200\001 \000\000\001*\000\000\000\000\001\031\000\000\001>\001 \000\000\000\000\000\000\000\000\000\000\001%\002U\000\000\000\000\001\214\001\016\000\000\000\000\000\000\000\000\001\"\001\023\001$\000\000\000\000\000\000\000\000\001\016\001\"\000\000\000\000\000\000\000\000\001\023\001$\000\000\002x\000\000\000\000\000\000\001.\000\000\000\000\001H\002y\000\000\001\132\002z\000\000\000\000\000\000\002x\000\000\000\000\000\000\000\000\002\023\000\000\000\000\002y\000\000\001\132\002z\000\000\001*\000\000\001>\002\024\000\000\002w\000\200\000\000\001*\001%\000\000\000\000\000\000\002+\001>\000\000\000\000\002\020\002\021\001e\002\023\001%\002\020\002\021\001e\002>\002\020\002\021\001e\001\016\000\000\002\024\000\000\002w\000\200\001\023\001$\001\016\000\000\001.\002k\000\000\001H\001\023\001$\002v\000\000\000\000\000\000\002\133\001\031\001.\000\000\001 \001H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002x\000\000\000\000\000\000\001\031\000\000\000\000\001 \002y\000\000\001\132\002z\000\000\001\031\000\000\001\"\001 \000\000\001>\000\000\000\000\000\000\000\000\000\000\000\000\001%\001>\000\000\002x\002_\000\000\001\"\000\000\001%\000\000\000\000\002y\002d\001\132\002z\001\"\000\000\000\000\000\000\000\000\001\031\000\000\000\000\001 \000\000\000\000\002\023\000\000\000\000\000\000\001.\002\023\000\000\001H\001*\002\023\000\000\002\024\001.\002w\000\200\001H\002\024\000\000\002w\000\200\002\024\001\"\002w\000\200\001*\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\001\031\001\016\000\000\001 \000\000\000\000\000\000\001\023\001$\000\000\000\000\000\000\003\031\000\000\000\000\000\000\000\000\001\016\000\000\001\031\000\000\000\000\001 \001\023\001$\000\000\001\016\001\"\000\000\001*\000\000\000\000\001\023\001$\002x\000\000\000\000\000\000\000\000\002x\000\000\000\000\002y\002x\001\132\002z\001\"\002y\000\000\001\132\002z\002y\001>\001\132\002z\000\000\000\000\000\000\001\016\001%\000\000\000\000\000\000\002\208\001\023\001$\000\000\001\031\001>\000\000\001 \001*\000\000\000\000\000\000\001%\000\000\001>\000\000\002\215\000\000\000\000\000\000\001\031\001%\002\023\001 \000\000\002\222\001.\001*\000\000\001H\000\000\001\"\000\000\002\024\000\000\002w\000\200\001\016\000\000\000\000\000\000\000\000\001.\001\023\001$\001H\001>\001\"\000\000\000\000\000\000\001.\001\031\001%\001H\001 \001\016\002\231\000\000\000\000\000\000\000\000\001\023\001$\000\000\000\000\000\000\001\031\000\000\001\031\001 \000\000\001 \000\000\000\000\001*\000\000\000\000\000\000\001\"\000\000\000\000\000\000\001.\000\000\000\000\001H\000\000\001>\000\000\001\031\001*\002x\001 \001\"\001%\001\"\000\000\000\000\004}\002y\000\000\001\132\002z\001\016\000\000\000\000\001>\000\000\000\000\001\023\001$\000\000\000\000\001%\000\000\001\031\001\"\004\213\0052\001\016\000\000\000\000\001*\000\000\001.\001\023\001$\001H\000\000\001\031\000\000\000\000\0052\000\000\000\000\000\000\000\000\001*\000\000\001*\000\000\000\000\001\"\001.\000\000\000\000\001H\000\000\000\000\000\000\000\000\001\016\000\000\000\000\001>\000\000\001\"\001\023\001$\000\000\001*\001%\000\000\000\000\000\000\004\225\001\016\000\000\001\016\000\000\001>\000\000\001\023\001$\001\023\001$\000\000\001%\000\000\001\031\000\000\004\238\001 \000\000\000\000\000\000\0054\000\000\000\000\001\016\000\000\001.\000\000\000\000\001H\001\023\001$\000\000\000\000\000\000\0054\000\000\001>\000\000\000\000\000\000\001\"\001.\000\000\001%\001H\000\000\000\000\004\255\000\000\001\016\000\000\001>\000\000\001>\000\000\001\023\0057\000\000\001%\000\000\001%\000\000\005\015\001\016\005\171\000\000\000\000\000\000\000\000\001\023\0057\000\000\001\031\001.\001>\001 \001H\001\031\000\000\000\000\001 \001%\000\000\000\000\001*\005\189\000\000\000\000\001.\001\031\001.\001H\001 \001H\000\000\000\000\000\000\000\000\000\000\001\"\000\000\000\000\000\000\001\031\001\"\000\000\001 \0058\000\000\000\000\000\000\001.\000\000\001\016\001H\001\031\001\"\000\000\001 \001\023\001$\0058\005\002\000\000\006\017\000\000\005:\000\000\000\000\000\000\001\"\000\000\000\000\000\000\000\000\000\000\005\002\001.\006+\000\000\005:\000\000\001\"\001*\000\000\000\000\000\000\000\000\001*\000\000\000\000\001.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\001>\000\000\000\000\000\000\000\000\000\000\000\000\001%\001\016\000\000\001*\005\213\000\000\001\016\001\023\001$\000\000\000\000\000\000\001\023\001$\000\000\001*\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\000\000\000\000\000\000\000\000\001.\000\000\001\016\001H\000\000\000\000\000\000\000\000\001\023\001$\000\000\000\000\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\001>\000\000\000\000\000\000\000\000\001>\000\000\001%\000\000\000\000\000\000\006c\001%\000\000\000\000\000\000\006\186\001>\000\000\000\000\000\000\000\000\000\000\000\000\001%\000\000\000\000\000\000\006\190\000\000\000\000\001>\000\000\000\000\000\000\000\000\000\000\001.\001%\000\000\001H\000\000\001.\001>\000\000\001H\000\000\000\000\000\000\000\000\001%\000\000\000\000\000\000\001.\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\001.\000\000\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\000\000\000\000\004\021")) + ((16, "\000%\001}\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\000\000\000\000\000\153\000\018\000\014\001C\0007\000\r\0009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\022\000\000\000\000\000\000\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000D\196\000\000\000\000\000\000\000p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n`\000\184\001Z\n\222\000\000\002.\021\160\0014\002\224\000\252\000\000\000\000\000\000\001R\000\000\000\000\000H\000\000\000\000\000\000\000\000\002\166\000\000\001\158\000\000\000\000\000\000\000\000\000\000\003\002\000\000\000\014\0038\b*\000\000\000\000\n4\n`\000\000\001\012\000\000\002\202\000\000\012\026\002J\000\000\000\000\002\164\003\200\000\174\001h\000\000\000\000\003\132\003d\003\146\003\190\000\146\0038\004\160\000\168\000\238\001\154\0040\004\128\011\234\000\000I\024\004\142\004\200\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\134\000\000\n\244I\024\0128\000\000\000\000\004\172\005\218\005\b:v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000x\000\000\005x\006\150\006 \000\000\000\000\000\000\000\000\011\242\000\000\000\000\006\152\003\168\006\156\006(\007\180\000\000\005\166\006\158\006\176\006\174\007\170\006\214#\222\000\000\000\000\006\186\006\246\012\150\012\236\000\000$\000\r6\005\028\0058\000\000\000\219\000\000\000\000\000\000\000\000\007\164D\224\b\"\000\000\024\134\bF\000\000$\006:\188\000\129\000\000\001r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000%\n\007\236\000\000\000\000\000\000\000>\005\204\000\000\004\254\006\194\000\000\000\000\002\174\000\000\000\000\000\164\001\018\000\000\000\000\000\164\t\000\000\164\000\000\000\000\b\234\0188\000\000\007\028\021\006\000\000\000\000\000\000\000\000\b\198\021\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000:\206\000\000\007\004\b\138\000\0000\246\007<\004>\000\000\000\000\000\000\b\018\000\000\000\000\000\000\000\000\004\192\000\000\000\000\000\000\000\000\000\000%\\\000\000\000\000\000\000\000\000\000\000\000\000\000N\b\150\000\000\000\000\000\000\004\192\b\188:\156\b\024\007@B\254\000\000\002\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0003\000\000\000\000\000\000\000\000\t\\;n\000\000\000\000\bJ\007j;\146\000\000\000\000\000\000;\184\b2;\250\000\000\b2\000\000<\134\b2\000\000<\188\b2\000\000\b2\000\000\000\000\b2\000\000\000\000<\252\000\000\b2=H\000\000\b2\0000\000\000\000\000\0058\000\000\000\000\000\000\000\000\b2%z\000\000\000\000\000\000\b2\000\000\000u\t\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\006\000\000\b\208\b\234\000\000D\228\004\192\000\000\000\000\000\000\000\000\000\000\000\000\b\244\t\n\t\158\rZ\b\248\t\030\t*\007\154\b|\007\180\000\140\t\198\000\000\000\000\017\224\018\018\007\186\000\192\t`\019\170\000\000\000\143\001\202\004j\001D\n\180\000\000\000\000I\020\000\000J\220\nJ\000\000E2\004\192E^\004\192\000\000\002\246\000\000\002~\000\000\000\000\003T\000\000\000\000\000\000\n\210\000\000\020\002\000\143\000\000\000\000\t\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\143\000\000\000\000\000\143\000\000\t`\t\158\000\000\001T\007\170\000\000\001T\000\000\000\000\023<\000\143\000\000\000\000\000\000\000\000\000\000\000\000\001T\r\214\014(\n\214\n\142%\1907\028\000\000\t\228\b\000\014\140\t\246\bVJ\224K\022\000\000\000\000\000\000\000\000\000\000\002\156\011&\000\000\000\000\000\000\n\020\b\154\n\132\001T\025\226\000\000\000\143\000\000\000\000\000\000\r6\000\000E\192\004\192\014\218\n\"\b\160\015Z\n.\b\220\000\\%\230\b2\015\202\n0\b\250B\148\011\014\000\000\002\004&\128\b2E\196\004\192\n\250\000\000\000\000\011\014\000\000\000\000\000\000\000\000\000x\011J\011L\000\000\000\000?\202\016\012\n\190\t*=\178\b2\016b\n\240\t0K(\000\000Kb\000\000\000\000\016\208&\208B\242\000\000\000\000\012rF:\000\000\004\192CB\000\000\004\192F\160\004\192\000\000\000\000\000\000\000\000\000\000K\200\000\000\000\000\000\000\001p\016j\000\000\000\000\000\000\000\000'.K\218\000\000\000\000\000\000\000\000\000\000\n\244\017\148\000\000\001K'p\001K'\148\001K\000\000K\250\000\000'\242\001K\017\214\001\158\018.\000\000\000\000(@\001K(`\001K(\220\001K)0\001K)\204\001K)\254\001K* \001K*\156\001K*\238\001K+\140\001K+\178\001K+\218\001K+\228\001K,\202\001K,\212\001K-\128\001K-\188\001K-\224\001K.\140\001K.\172\001K\tZ.\254\003><\152\000x\011\222\000\000/zFd\000x\000\000>\022\b2\000\000\000\000\000\000\b2\000\000\000\000F\188\000\000\004\192\000\000\000\000\000\000\018X\000\000\000\000\018\154\000\000\000\000\000\000\000\000/\186\000\000/\250\000\000\000\000CB\000\000\011r\000\000F\192\004\192\019^\000\000\000\000\019\160\000\000\000\000=\150\000x\011\238\000\0000r\019\202\000\000\000\000\020\"\000\000\000\0000\194\000\000\000\000C\130\012\012\000\000G\"\004\192\020d\000\000\000\000GR\004\192\021(\000\000\000\000\021H\000\000\000\000\000\000G\160\004\192\021j\000\000\011D\022.\000\000>R\000\000\b2>\178\000\000\b2>\192\000\000\b2\004b\000\000\000\000\000\000\000\000\000\000? \b2\003\216\005\006\000\000\000\000\000\000\001K\0228\000\000\000\000\000\0001&\001K\000\000\000\000\000\000\000\000\022\252\000\000\000\000\000\000\001K\023\030\000\000\023P\000\000\000\000\000\000\023Z\000\000\000\000\000\000\000\000L6\000\000\000\000\024@\000\000\000\000\000\0001t\001K\024|\000\000\000\000\000\0001\240\001K\024\222\000\000\000\0002\016\001K\001K\000\000\004J\0250\000\000\000\0002\224\001K\025~\000\000\000\0003\000\001K3\"\001K\000\0003|\001K\000\000\000\000\026\000\000\000\000\0003\230\001K\026`\000\000\000\0004~\001K\026n\000\000\000\0004\214\001K\000\0004\250\001K\000\000F\250\000\000\000\000\001K\000\000\000\000\027\012\000\000\000\000\027Z\000\000\000\000\011\132\000\000\000\000\027\220\000\000\028\014\000\000\000\000\000\000\000x\012$\000\000@t\t\178\000\164\028|\000\000@\176\000\000\000\000\000\000@\202\000\000\000\000\028\210\000\000\028\218\000\000\000\000\000\000\000\0005D\000\000\000\000\000\0005\192\001K5\252\001K\000\000\011D\029\158\000\000\000\000\029\190\000\0006\136\000\000\000\000K\022\000\000\000\000\000\000\030\130\000\000\000\000\000\000\000\000\001K\000\188\011z6\198\000\204\000\000\000\000\000\000\004\004\t\\?\\\b27r\001K7z\003\2127\200\001K\000\000\000\000\000\000\000\000\030\138\000\000\000\000\000\000\000\000\002\180\003R\011~8D\003\230\000\000\000\000\000\000\000\000\000\000\012\190\000\000\000\000\000\000?n\000\000\003\204\000\000\002Z\000\000\012f\000\000\005\208\000\000\000\000\000\000\000\000\000\000\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001K\000\000\012\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004L\000\000\000\000\t\180\011\006\001T\030\170\000\000\011\204\t\244\012`\000\250\012:\001T\027:\000\143\012\146\001T\000\000\030\180\000\000\004X\000\000\011\242\n\"\005\128\000\000\000\000\000\000\000\000\000\000\012\b\001\"\002\184\000\000\000\000\000\000\000\000\000\0002L\000\000J\248\000\000\n$\000\000\nJ\000\000\000\000\000\000\000\000\004\134\000\000\000\000\000\000\n\018\000\164\000\000\000\164\002\156\000\000\012D\000\164\000\164\nR\000\000\031z\000\000\000\000\nl\r\012\000\0008h\005*\000\000\000\000\000\000\000\000\012\218\000\000\000\000\000\000\000\000\001K\000\000\000\000\001\232\000\000\001K\000\000\000\000\0286\000\000\000\143\000\000\029P\000\000\000\143\000\000\031\\\000\143\000\000\004\012\000\000\nr\r4\006\128\000\000\012.\0120\n\150\012P\012\236 \014\000\143\005z\000\000\n\180\012\204\012\214\005\144\b\178\012\158\n\182\012\228\006\162\t\132\012\182\000\000\000\000\t\146\011\n\000\000\004\182\002\244?\188\b2\031\172\000\000\005\140\003&\012\138\n\190\r\148\bN\000\000\012\150\n\194\007,\000\000G\224\004\192\r2\r4\000\000\011\172\000\000\012\172\n\232\005\214\012\202\005`\000\000\000\000\000\000\000\000\n\248\011\216\000\000\011H\011\238\000\000\007\230\0262\012\194\012\200\011V\004\226\011\248\000\000\011h\006(\012\b\000\000\012\206\011l\r^\000\000\007,\000\000\0120\000\000\rd\000\000 \196\000\143\r0\011\184\rv\000\000!\252\000?\rn\000\000\000\000\002\186\005@\012\142\000\000#\180\000\143\012\174\000\000\006\250\000\000\r<\011\244$\234\002\028\000\000\rV\012\026\006r\012\202\r\140\r\142\0122\014\244\000\000\r\184\000\146\000\000\000\000\000\000\000\000\000\251\0126\r\146H\016\004\192\000\000\004\006\012B\014N\000\000\000\000\000\000\000\000\000\000\000\000HV\004\192\000\000\012p\014\168\000\000\000\000\000\000\000\000\000\000\000\000\006\130\000\000Hv\004\192\012\216\000\000\004\192\012\182\000\165\000\000\012\190\012\212\tl\000\000\003N\021\238\000\000\005T\000\000H\218\004\192\004\192\000\000\000\000\004\234\000\000\n\128\000\000\004V\004\234\004\234\000\000\012\216CT\004\192H\250\004\192\r\"\000\000\000\000\000\000\000\000\rl\000\000\000\000\005~\000\000\b8\014\018\012\222\0158\014\000\000\000\000\000\004\164\n\n\014R\000\000\000\000\012\250\015\138\014L\000\000\000\000\b\144\000\000\025\228\000\000\014L9(\004\192\000\000\015d\026\018\000\000\015\166\000\000\000\000\000\000\004\234\000\000\000\000\r~\014\150\r\024\015\182\014\146\000\000\000\000\025\002\r\162\014\218\000\000\000\000\000\000\031\134\000\000\000\000\000\000\000\000\000\000\000\000\r\198\000\000\014\244\rH\006\180\000\000\016\006\015\186\r\226\015\026\000\000\000\000\015 \rT\bX\000\000\000\000\b\152:\188\007n\000\000\000\000\000\000\007\018\014\230\r\140\000\000\014\236\007\018\000\000\015\208\014\b\015D\000\000\000\000\000\000\004\192\000\154\001\246\007\198\000\000\000\000\000\000\000\000\015\016\r\176\000\000\n\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\192\015\004\r\182\016z\0150\000\000A\020\000x\000\185\r\188\015\004\000\189\002\166\r\196\015\190\000\000\000\000\016\130 ,\000\000\000\000 ^\000\000\014T\000\000\007R\000\000\000\000\000\000\000\000\000\000\000\000I>\004\192\000\000\016\132 ~\000\000\000\000!*\000\000\001\216\r\198\016(\000\000\000\000Az\tN\015\240\000\000Ih\004\192!N\000\000\000\000!\238\000\000\000\000\014`\000\000\004 \000\000\000\000\000\000\000\000\000\000\000\000\028\130\000\000\000\000A\180#\228\015\246\000\000I\244\004\192\" \000\000\000\000\"@\000\000\000\000\r\200\"\188\014\130\000\000\r\246\014\022\000\212\005\252\014\"\007\192\014&\016J9R\014\150\000\000\014L\014V\n\142\000\000\t6C\220\000\000\002\154\000\000\014^A\248B\030\011\026\015,\r\156\000\000C\172F\250\000\000\002 \000\000\000\000\002 \000\000\000\000\002 \011\138\000\000\014\028\002 \016V9r\014\204\000\000\002 \000\000\000\000\030H\000\000\000\000\000\000\002 \000\000\000\000\014\210\000\000\016*\003^\014\250\000\000\014tD\004\014\254\000\000\000\000\000\000\000\000\015\022\000\000\000\000\003\230\000\000\002 3\194\000\000\018b\002 BT\000\000\015L\015\180\014~\016\208\015\128\000\000B^\015P\015\196\000\000\000\000\000\000\018\226\b\248\000\000\000\000\000\000\000\000\000\000\000\000\n\244\015Z\000\000\015\212\000\000\000\000\000\000\000\000\015\\#\150\000\000\000\000\000\000\000\000\n\244\000\000\000\000\015z+^\000\000\000\000\000\000\000\000\000\000\001T\000\143\000\000\000\000\b2\000\000I\254\004\192\000\000\007\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\212\000\000\000\000\015\138\014\208\r\200\001T\000\000$\250\000\000\000\143\000\000\016\206\000\000\000\000\000\000\000\000\000\000\003\144\000\000\000\000\000\000\000\000\000\000\000\000\016|\001@\b6\014\230\007\224\014\220\000\000\0026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\016\t.\014\254\000\000\0020\016\228\016\146\015\158\000\000\000\000\016\138\007\004\n\144\000\000\000\000\000\000\000\000\"<\027\024\000\000\000\000\000\000\000\000,L\030\018\000\000\000\000\000\000\015\b\000\000\015\020\005\208\000\000\000\000\000\164\b\202\000\000\000\000\000\000\000\000\000\000\000\000\005\132\006$\000\000\000\000J\026\004\192\004\192\000\000J\144\004\192\n\242\000\000\000\000\000\000\004\192\000\000\000\000\tt\016\162\015\184\000\000\000\000\016\154\0062\003\194\000\000\000\000\000\000\000\000\006Z\016\228\t\132\016\170\015\224\000\000\000\000\016\158\006\242\005\214\000\000\000\000\000\000\000\000\000\143\000\000\011\020\000\000\000\000\000\000#\016\000\000#\172\000\000\000\000\000\000\000\000\000\000\020\"\000\000\000\000\000\000\007P\0009\000\000\000\000\000\000\000\000\000\000\t*\0009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003.\000\000\000\000\000\000Dj\000\000\004\192\000\000\011N\000\000\000\000\000\000\004$\000\000\000\000\000\000\003H\000\000\000\000\000\000\003\018\000\000\000\000\000\0009\180\b2\000\000\000\000\000\029\000\000\000\000\000\000\000\000\002\156\004\156\015\222\006\236\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\210\000\000\015\248\000\000\000\000\000\000\000\000\004\206\006Z\007.\017R\000\000\000\000\015\254/@\000\000\000\000\000\000\016\0024\018\000\000\000\000\000\000\000\000"), (16, "\006\131\000=\0020\0021\001}\001\021\007s\0021\001}\003?\000\200\001\028\001\031\000\204\000\205\000s\001}\002x\006\132\007=\000\200\001\131\006\134\000\204\001\007\006\131\002y\0020\0021\001}\000A\006\135\006\148\0009\001\b\007\028\0009\000\200\003\244\002\147\000\204\000\205\002x\006\132\006\147\001\171\001}\006\134\001\021\003?\0009\002y\006i\002\163\001\028\001\031\006\135\006\148\001\011\001$\000\149\006\136\001G\000\154\002\147\005G\001\021\001|\001}\001H\006@\000\200\001\028\001\031\000\204\001\007\007u\0078\006l\004\240\005H\001|\001}\000o\005`\001\188\006\136\001,\001~\001\142\0076\001\128\001\129\006n\000\206\006\137\000\155\000\149\006B\002\149\000\154\006\205\001~\001\142\006\138\001\128\001\129\001l\005G\001\011\0013\0024\003\195\002\151\000\204\007v\006C\002\151\000\204\004\246\006\137\006E\006o\005H\002\149\006q\000B\005O\0009\006\138\006\153\0019\001\143\005\019\001\144\002P\0024\001\021\002\151\000\204\002\016\001 \000\207\001\028\001.\006\154\001\143\002\001\001\144\002\229\000\149\005\178\007$\001\243\006\141\006\153\001o\007?\003\225\006\143\0009\001\021\001$\001\151\003?\007\005\001\224\001\028\001.\006\145\006\154\000o\002\152\001$\002\158\001\134\001\132\001\151\000\204\006\141\002\164\000^\001\156\002\154\006\143\000b\003\198\002\001\006\146\001\134\001,\000\207\000\204\000\149\006\145\000\159\001\243\002\152\006\131\002\158\0020\0021\001}\001\021\004b\002\164\002\166\001\156\002\154\001\028\001.\000<\001\021\006\146\000;\002x\006\132\006\147\001\028\001.\006\134\001/\000f\006\131\002y\0020\0021\001}\000?\006\135\006\148\002\166\000{\006\213\006\204\000\200\001\153\002\147\000\204\000\205\002x\006\132\006\147\001\251\001\154\006\134\001\156\001\132\0009\002y\001\153\0014\002\n\004?\006\135\006\148\005\185\005\186\001\154\006\136\001\156\001\132\002\147\006\235\001\021\001|\001}\001\021\006@\002\029\001\028\001.\005\202\001\028\001\031\001\021\005\195\004p\002\n\001|\001}\001\028\001.\000\130\006\136\003\232\001~\001\142\006\202\001\128\001\129\000\200\001\252\006\137\000\204\001\007\006B\002\149\003\243\001x\001~\001\142\006\138\001\128\001\129\003\229\000\178\004B\006\230\0024\004\131\002\151\000\204\003L\006C\001\024\000\204\001\007\006\137\006E\002\163\001\028\002\149\006\\\001/\005\178\000\131\006\138\006\153\001\231\001\143\004\r\001\144\002P\0024\001/\002\151\000\204\000\190\006\217\006\218\004e\0012\006\154\001\143\000\136\001\144\002Y\006\219\006\220\003?\003]\006\141\006\153\0014\004\025\001}\006\143\005\233\006\221\004p\001\151\001$\003?\000\153\004f\001$\006\145\006\154\006\243\002\152\001$\002\158\001\134\006\012\001\151\000\204\006\141\002\164\006_\001\156\002\154\006\143\000\152\003\198\001$\006\146\001\134\002\030\006\014\000\204\000\207\006\145\004b\001,\002\152\006\131\002\158\0020\0021\001}\001\021\004\014\002\164\002\166\001\156\002\154\001\028\001.\000\149\001\021\006\146\000\158\002x\006\132\006\147\001\028\001.\006\134\002_\005\007\006\131\002y\0020\0021\001}\002\170\006\135\006\148\002\166\005\185\005\186\000\134\006\214\001\153\002\147\002\216\001}\002x\006\132\006\147\000\187\001\154\006\134\001\156\001\132\005\194\002y\001\153\001\247\005\195\004p\006\135\006\148\000\207\001\028\001\154\006\136\001\156\001\132\002\147\006\155\000\200\006\215\001\021\000\204\000\205\004R\001\021\000\173\001\028\001.\006\216\001\021\001\028\001.\004\255\001|\001}\001\028\001.\000\149\006\136\006\225\001\243\007k\006\151\001\021\002\001\003\252\006G\006\137\005\235\001\028\001.\002\149\007\003\000\207\001~\001\142\006\138\001\128\001\129\000\149\007W\000\185\001\243\0024\001\245\002\151\000\204\000\204\001$\007g\007l\006\237\006\137\004]\004_\004a\002\149\000\137\006\201\002\002\001/\006\138\006\153\002\006\001/\001\028\004h\005\001\0024\001/\002\151\000\204\004\207\004\011\006c\000\204\001,\006\154\001\143\006\019\001\144\002P\006;\001/\004\003\007h\006\141\006\153\000\204\001\021\004k\006\143\001\250\000\207\0014\001\028\001\031\003?\001\028\0010\002\163\006\145\006\154\002\018\002\152\002\007\002\158\001$\003?\001\151\001%\006\141\002\164\006\255\001\156\002\154\006\143\001J\0038\001}\006\146\001\134\000\207\000\183\000\204\000\149\006\145\001\230\001\243\002\152\006\164\002\158\003\198\002\031\003?\001,\000\204\002\164\002\166\001\156\002\154\007X\006\023\001\156\006\131\006\146\0020\0021\001}\005G\001\021\000\200\003\232\002\029\000\204\001\007\001\028\001.\007\130\007\131\007c\002x\007\133\002\166\005H\003\243\006\134\007 \005I\006\131\002y\0020\0021\001}\007\150\006\135\007\135\000\182\003A\0019\0009\006p\001\153\002\147\007\142\006G\002x\007\143\000\207\004\012\001\154\006\134\001\156\001\132\002 \002y\007d\007!\005X\000\188\006\135\007\151\001\028\001$\004\147\006\136\0017\006l\002\147\001\021\001/\001|\001}\0018\003\132\001\028\001.\000\204\001\007\003\239\004C\001\021\006n\005[\003?\001|\001}\001\028\001\031\006\182\006\136\001,\001~\001\142\004R\001\128\001\129\004\000\005]\006\137\0014\003\232\001\190\002\149\002\163\003?\001~\001\142\006\138\001\128\001\129\006o\003\149\002\163\003\241\0024\001\174\002\151\000\204\003?\001\021\005^\001V\000\192\006\137\000\193\001\028\001\031\002\149\001/\007\n\007\138\002\030\006\138\004B\0019\001\143\003?\001\144\001\177\0024\005G\002\151\000\204\004`\004_\004a\0009\004.\006\154\001\143\004\222\001\144\001\177\005(\007\155\005H\001\028\006\141\0014\005N\000\198\001W\006\143\002\163\001\021\001$\001\151\001$\001(\000\197\001\028\001.\006\145\006\154\005P\002\152\003?\002\158\001\134\005G\001\151\000\204\006\141\002\164\000\215\001\156\002\154\006\143\003@\000\207\004\017\006\146\001\134\001,\005H\000\204\004\251\006\145\005h\000\204\002\152\006\131\002\158\0020\0021\001}\004v\001\021\002\164\002\166\001\156\002\154\004\207\001\028\001\031\000\204\006\146\004\178\002x\006\132\006\161\001_\003?\006\134\001/\000\207\006\131\002y\0020\0021\001}\001\021\006\135\006\148\002\166\004\165\007*\001\028\001.\001\153\002\147\007\142\005J\002x\007\143\005_\004\160\001\154\006\134\001\156\001\132\006\173\002y\001\153\0014\000\208\001$\006\135\007\146\001%\007\031\001\154\006\136\001\156\001\132\002\147\001J\001\021\000\200\001\021\005[\000\204\001\007\001\028\001.\001\028\001.\000\149\006\254\005\156\001\243\004\210\005C\001\156\001,\005]\000\228\006\136\001$\004B\000\200\001+\007.\000\204\000\205\0052\006\137\000\216\004L\004p\002\149\007\127\0021\001}\000\232\006\138\004\012\003?\005^\004\148\0055\001\021\0024\004\226\002\151\000\204\001,\001\028\001\031\001\028\000\207\006\137\007!\006@\004\184\002\149\002\029\001/\0019\001/\006\138\006\153\006\131\001$\004\193\001}\001?\0024\001\021\002\151\000\204\004\204\004p\001@\001\028\001.\006\154\007\142\005\240\002\018\007\143\006B\007\149\007H\006\134\006\141\007-\0014\001\021\006\255\006\143\001,\000\207\006\135\001\028\001.\006\233\007\"\007#\006C\006\145\006\154\004\170\002\152\006E\002\158\004\146\004\151\006U\002\031\006\141\002\164\000\204\001\156\002\154\006\143\007\t\005\195\004p\006\146\001\021\000\229\000\238\006\136\000\240\006\145\001\028\001.\002\152\006\131\002\158\0020\0021\001}\000\246\0019\002\164\002\166\001\156\002\154\007\128\001V\002\151\000\204\006\146\005\002\002x\006\132\001/\005\011\004p\006\134\0057\000\249\005\143\002y\004B\006\137\0009\007I\006\135\006\157\002\166\000\245\001$\001\021\006\138\001%\002\147\000\254\002 \001\028\001.\004\234\001J\002\030\001]\000\253\0014\001\028\001/\001`\005\244\005\144\005\208\005\145\000\207\000\207\007\145\000\207\006\136\007J\001,\007\"\007#\004R\007Q\001\028\001$\000\207\005\001\001%\006\217\006\218\001[\002\018\001u\006\140\001J\001q\0014\006\219\006\220\005\195\004p\005\146\006\141\000\149\000\207\005\166\001\243\006\143\006\221\004p\006\137\001/\001,\001\141\002\149\005\175\004p\006\145\002\022\006\138\000\207\002\031\0019\007R\000\204\004R\0024\000\207\002\151\000\204\005\178\005\171\004_\004a\005\147\001$\006\146\001\214\005x\001$\006\174\0014\001%\003?\005\148\006\160\005\149\007S\004\207\001J\001\216\000\204\001\021\001\223\003?\000\207\0019\000\207\001\028\001.\006\154\001\015\001$\001,\001$\001E\006l\001,\007T\006\141\007\023\005\209\001F\002\029\006\143\005\191\004_\004a\000\207\001\018\001$\006n\002 \001A\006\145\005\178\001\021\002\152\002+\002\158\001,\001$\001\028\001.\005\151\002\164\002\018\001\156\002\154\005\153\005\163\001#\000\207\006\146\003?\001V\007O\005z\001,\005\205\006o\0019\001/\005a\001S\000\207\005\210\006\211\000\207\001\156\001Z\002\166\006.\002!\004\189\005\181\002\031\001n\005\206\000\204\001$\002.\001\183\001%\0019\005\185\005\186\001\021\001t\001V\001J\001\021\0014\001\028\005}\001`\001/\001\028\001.\001$\005\187\005\203\001%\000\207\001\180\005\195\004p\001$\001,\001J\001%\006\209\004p\001\140\001\021\002<\001\021\001J\002K\0052\001\028\001.\001\028\001.\004\166\007\001\0014\001,\001\150\001`\001$\005J\001\021\001\187\006\b\001,\006\131\002 \001\028\001.\005\185\005\186\002\030\001\021\001V\005\178\000\207\005~\002N\001\028\001.\001/\0019\005\178\007\133\005\187\005\203\001\202\006\134\003?\005\195\004p\005H\002T\005\131\004\207\005\128\006\135\000\204\000\200\001\200\0019\000\204\000\205\001/\004z\001/\0014\001$\0019\000\207\0014\001\021\000\207\001`\007\025\001\208\002m\001\028\001.\002r\002\018\001/\007'\004x\001$\005>\006\136\001%\000\204\004q\001\021\006@\001/\0014\001J\006\255\001\028\001.\001\021\007P\002\214\003\233\000\207\004\175\001\028\001.\001$\002\019\0040\001%\002\031\0014\001,\000\204\001\213\003?\001J\000\207\004\171\006B\006\137\001\021\0016\006\223\001V\001\156\001\219\001\028\001.\006\138\005\178\001/\002\t\001\236\001,\0057\007\006\006C\001\238\005\185\005\186\000\207\006E\001V\000\207\0041\006L\005\185\005\186\001\254\001/\001V\007\134\004R\005\187\005\203\0019\004B\001/\005\195\004p\0014\005\187\005\203\001`\000\207\000\207\005\195\004p\001\021\006\140\002 \0020\0021\001}\001\028\001.\0047\0019\006\141\0014\001/\003?\001`\006\143\005i\001\021\002x\0014\002\005\004'\001`\001\028\001.\006\145\002\018\002y\0020\0021\001}\004F\004Y\006\193\005\199\004_\004a\004#\002*\001\021\002\147\000\207\003\179\002x\006\146\001\028\001.\002-\0020\0021\001}\004[\002y\002=\005L\004m\002\031\000\204\003\215\000\204\001/\0066\002;\002x\000\204\002\147\005\185\005\186\004r\002J\001V\004\149\002y\000\207\003?\002M\002S\001/\007_\003?\002c\007\021\007\022\006\234\005J\002\147\005\195\004p\002]\004\155\004d\002\018\001V\001\226\000o\0072\000\207\000\207\002`\001/\002\149\004R\002\002\007\r\004\162\004\168\002\006\0014\001\028\004\187\001`\004\192\0024\006\215\002\151\000\204\000\207\002 \0042\000o\000\207\002\031\006\216\007a\000\204\002\149\0020\0021\001}\0014\004\203\000\200\001`\000\207\000\204\000\205\000\207\0024\004\211\002\151\000\204\002x\002h\002g\004\176\002\149\002\155\002l\002\007\0075\002y\007\018\004_\004a\000\207\003?\006\198\0024\001$\002\151\000\204\001%\002\b\002\147\006@\0020\0021\001}\001J\000\207\000\207\002\155\002q\002\152\000\207\002\158\000\207\003?\004\214\001$\002x\002\164\002 \001\156\002\154\004\221\001,\006N\003?\002y\000\204\002\155\006B\003?\004\225\000\207\004\230\004U\002\152\006\178\002\158\003?\002\147\000\207\002\133\003B\002\164\002\166\001\156\002\154\006C\006\249\0020\0021\001}\006E\002\219\001_\002\152\006I\002\158\003?\002\254\002\149\003\n\004\200\002\164\002x\001\156\002\154\0019\001\226\002\166\006\165\004\242\0024\002y\002\151\000\204\003\023\002\002\0039\004\129\000\207\002\006\002\018\001\028\004\212\003\168\002\147\000\207\003\176\002\166\003\242\004\002\0020\0021\001}\004\215\000\207\001\021\000\207\002\149\004\223\005\005\004\005\001\028\001.\003?\002\155\002x\004\227\004:\004\015\0024\002\031\002\151\000\204\000\204\002y\004%\001\021\0046\005\n\003?\004\128\002\007\001\028\001.\002\018\0048\004\235\002\147\001\193\001}\005\015\002\152\005\025\002\158\000\207\002\b\004E\004l\005\031\002\164\003?\001\156\002\154\002\155\002\149\0020\0021\001}\001V\001~\002E\004>\001\128\001\129\002\031\001/\0024\000\204\002\151\000\204\002x\005*\004t\004{\000\207\002\166\004\161\004\154\004\156\002y\002\152\002 \006\181\004\252\004\159\004w\001/\003?\002\164\004\174\001\156\002\154\002\147\000\207\004\164\0014\004\173\002\149\004\\\005\000\002\155\004\169\003\205\003:\003;\000\207\0059\000\207\004\172\0024\005K\002\151\000\204\000\207\002\166\002\018\004j\0020\0021\001}\0056\005=\004\186\005R\003?\002 \005c\002\152\004\191\002\158\004\199\004\198\002x\003?\001\151\002\164\000\207\001\156\002\154\004\202\005m\002y\004\150\002\155\004\213\002\031\001\134\004/\000\204\000\204\004\224\003?\002\149\004\220\002\147\005\134\004\229\005W\0020\0021\001}\002\166\004\249\002\018\0024\004\237\002\151\000\204\004\248\003?\002\152\000\207\002\158\002x\004\243\000\207\003\208\003\213\002\164\005\155\001\156\002\154\002y\003?\001$\005\165\000\207\005x\000\207\002\018\004\188\000\207\004*\002\031\005\\\002\147\000\204\000\200\002\155\004\247\000\204\000\205\003?\005\132\002\166\000\207\002 \001\153\0020\0021\001}\005\004\001,\005\177\002\149\001\154\006\187\001\156\001\132\002\031\000\207\005\140\000\204\002x\005\t\002\152\0024\002\158\002\151\000\204\006@\005\197\002y\002\164\005\213\001\156\002\154\005\220\004\028\005\152\003?\005\224\005\253\006%\000\207\002\147\003?\0020\0021\001}\000\207\005l\005\014\005\160\002 \002\149\005z\005\017\006B\002\166\002\155\000\200\002x\003?\000\204\000\205\006a\0024\005\021\002\151\000\204\002y\005\183\003?\005\029\005$\006C\003\204\000\207\005/\002 \006E\006*\005k\002\147\006F\001\021\002\152\006Q\002\158\006/\005d\001\028\005}\006@\002\164\000\207\001\156\002\154\000\207\003?\002\155\000\207\003?\005e\002\149\000\207\000\207\000\207\006M\005\234\0020\0021\001}\0065\005j\006\r\0024\006=\002\151\000\204\002\166\006B\003?\001$\003?\002x\005x\002\152\006f\004-\000\207\005n\006'\006{\002y\002\164\003?\001\156\002\154\006C\003\199\005o\0062\002\149\006E\005~\000\207\002\147\006P\005\142\002\155\001,\000\207\005\135\000\207\0024\001$\002\151\000\204\005x\005H\002\166\005\130\003?\005\128\003?\0020\0021\001}\006T\003?\003?\006`\000\207\006\186\0014\005\136\002\152\000\207\002\158\006\212\002x\000\207\005\141\001,\002\164\003?\001\156\002\154\002\155\002y\005\162\006d\000\207\006h\005z\003\188\006\224\000\207\0020\0021\001}\006\250\002\147\003?\005\158\006m\002\149\006\252\005\159\005\161\002\166\005\204\005\176\002x\005\180\002\152\003?\002\158\0024\005\182\002\151\000\204\002y\002\164\001\021\001\156\002\154\005z\003\173\005\184\001\028\005}\006y\005\196\006\128\002\147\003?\005\212\000\207\006\142\006\149\0020\0021\001}\000\207\0020\0021\001}\003?\002\166\005\214\003?\002\155\003?\005\215\006\158\002x\001\021\005\221\005\226\002x\000\207\002\149\001\028\005}\002y\000\207\005\230\005\248\002y\005\255\003\165\000\207\006\229\0024\002\144\002\151\000\204\002\147\002\152\006\003\002\158\002\147\006\027\005~\0060\007\027\002\164\006H\001\156\002\154\006R\006\130\006|\006}\002\149\0020\0021\001}\005H\006\129\005\129\006\144\005\128\006\185\006\196\007)\0024\002\155\002\151\000\204\002x\006\207\002\166\0014\006\227\006\228\005~\007\136\006\232\002y\007\147\000\200\007\152\007\026\000\204\000\205\007\030\007(\007,\003\157\007z\005H\002\147\005\127\002\152\005\128\002\158\002\149\000\000\000\000\002\155\002\149\002\164\000\000\001\156\002\154\0014\000\000\000\000\0024\000\000\002\151\000\204\0024\006@\002\151\000\204\000\000\006\131\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\152\002\166\002\158\000\000\000\000\000\000\007\142\000\000\002\164\007\143\001\156\002\154\000\000\006\134\000\000\006B\002\155\000\000\000\000\000\000\002\155\000\000\006\135\000\000\000\000\002\149\0020\0021\001}\000\000\000\000\000\000\000\000\006C\002\166\000\000\000\000\0024\006E\002\151\000\204\002x\006b\002\152\000\000\002\158\000\000\002\152\000\000\002\158\002y\002\164\006\136\001\156\002\154\002\164\002\157\001\156\002\154\0020\0021\001}\000\000\002\147\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\155\000\000\000\000\002x\000\000\000\000\002\166\000\000\000\000\000\000\002\166\000\000\002y\000\000\000\000\006\137\000\000\000\000\002\172\000\000\000\000\000\000\000\000\000\000\006\138\002\147\000\000\002\152\000\000\003R\000\000\000\000\0020\0021\001}\002\164\000\000\001\156\002\154\000\000\000\000\000\000\000\000\000\000\000\000\001$\007\144\002x\001;\000\000\000\000\000\000\002\149\0020\0021\001}\002y\000\000\000\000\000\000\000\000\002\166\002\171\000\000\0024\006\140\002\151\000\204\002x\002\147\000\000\000\000\000\000\001,\006\141\000\000\000\000\002y\000\000\006\143\000\000\000\000\000\000\002\239\000\000\002\149\0020\0021\001}\006\145\002\147\000\000\000\000\000\000\001\226\000\000\002\014\0024\002\155\002\151\000\204\002x\000\000\002\002\000\000\000\000\000\000\002\006\006\146\001\028\002y\000\000\000\000\000\000\000\000\000\000\002\242\000\000\000\000\001\226\006\131\002\011\000\000\002\147\000\000\002\152\000\000\002\158\002\002\002\149\000\000\002\155\002\006\002\164\001\028\001\156\002\154\000\000\006\132\000\000\000\000\0024\006\134\002\151\000\204\000\000\000\000\001\021\000\000\002\007\002\149\006\135\000\000\001\028\001.\000\000\000\000\000\000\002\152\002\166\002\158\000\000\0024\002\b\002\151\000\204\002\164\000\200\001\156\002\154\000\204\000\205\000\000\000\000\002\007\002\155\000\000\000\000\000\000\000\000\000\000\006\136\000\000\002\149\0020\0021\001}\000\000\002\b\000\000\000\000\000\000\002\166\000\000\000\000\0024\002\155\002\151\000\204\002x\006@\000\000\002\152\000\000\002\158\000\000\000\000\001/\002y\000\000\002\164\000\000\001\156\002\154\003\002\006\137\000\000\0020\0021\001}\000\000\002\147\000\000\002\152\006\138\002\158\000\000\000\000\006B\002\155\000\000\002\164\002x\001\156\002\154\000\000\002\166\0014\0020\0021\001}\002y\000\000\000\000\000\000\000\000\006C\003\005\000\000\000\000\006\139\006E\000\000\002x\002\147\006u\002\152\002\166\002\158\000\000\000\000\000\000\002y\000\000\002\164\006\140\001\156\002\154\003\r\000\000\000\000\000\000\000\000\000\000\006\141\002\147\000\000\000\000\000\000\006\143\005\143\002\149\0020\0021\001}\000\000\000\000\000\000\000\000\006\145\002\166\000\000\000\000\0024\000\000\002\151\000\204\002x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002y\000\000\006\146\005\144\007A\005\145\003\016\000\000\002\149\0020\0021\001}\000\000\002\147\000\000\000\000\000\000\001\226\000\000\001\227\0024\002\155\002\151\000\204\002x\000\000\002\002\000\000\000\000\002\149\002\006\000\000\001\028\002y\000\000\005\146\000\000\000\000\000\000\003\027\000\000\0024\000\000\002\151\000\204\000\000\002\147\000\000\002\152\000\000\002\158\000\000\000\000\000\000\002\155\000\000\002\164\000\000\001\156\002\154\000\000\001\226\000\000\002\000\000\000\000\000\000\000\000\000\005\147\000\000\002\002\000\000\002\007\002\149\002\006\002\155\001\028\000\000\005\148\000\000\005\149\002\152\002\166\002\158\000\000\0024\002\b\002\151\000\204\002\164\000\000\001\156\002\154\000\000\000\000\000\000\000\000\000\000\001$\000\000\000\000\001>\002\152\000\000\002\158\005\209\002\149\0020\0021\001}\002\164\000\000\001\156\002\154\000\000\002\166\002\007\000\000\0024\002\155\002\151\000\204\002x\0020\0021\001}\001,\000\000\005\151\007C\002\b\002y\000\000\005\153\005\163\000\000\002\166\003 \002x\000\000\0020\0021\001}\005\205\002\147\000\000\002\152\002y\002\158\000\000\000\000\000\000\002\155\003#\002\164\002x\001\156\002\154\000\000\000\000\002\147\000\000\005\206\000\000\002y\005\143\000\000\000\000\000\000\000\000\003)\000\000\000\000\000\000\000\000\000\000\000\000\002\147\000\000\002\152\002\166\002\158\000\000\000\000\000\000\000\000\000\000\002\164\000\000\001\156\002\154\000\000\000\000\000\000\005\144\007/\005\145\000\000\000\000\000\000\001\021\000\000\000\000\000\000\002\149\001$\001\028\001.\001D\000\000\000\000\000\000\000\000\002\166\001$\000\000\0024\001%\002\151\000\204\002\149\000\000\000\000\000\000\001J\000\000\005\146\000\000\000\000\000\000\000\000\000\000\0024\001,\002\151\000\204\000\000\002\149\0020\0021\001}\000\000\001,\0020\0021\001}\000\000\005A\000\000\0024\002\155\002\151\000\204\002x\000\000\000\000\000\000\000\000\002x\005\147\001/\000\000\002y\000\000\000\000\000\000\002\155\002y\003,\005\148\000\000\005\149\000\000\003E\000\000\002\147\000\000\002\152\000\000\002\158\002\147\000\000\000\000\002\155\000\000\002\164\0019\001\156\002\154\000\000\0014\000\000\000\000\002\152\000\000\002\158\005\209\000\000\000\000\000\000\000\000\002\164\000\000\001\156\002\154\000\000\000\000\001\021\000\000\000\000\002\152\002\166\002\158\001\028\001.\000\000\001\021\000\000\002\164\005\151\001\156\002\154\001\028\001.\005\153\005\163\000\000\002\166\000\000\000\000\000\000\000\000\000\000\000\000\005\205\002\149\000\000\000\000\000\000\000\000\002\149\0020\0021\001}\002\166\000\000\000\000\0024\000\000\002\151\000\204\000\000\0024\005\206\002\151\000\204\002x\000\000\0020\0021\001}\000\000\000\000\000\000\000\000\002y\000\000\001/\000\000\001V\000\000\000\000\000\000\002x\000\000\003O\001/\000\000\002\147\000\000\005F\002\155\002y\0020\0021\001}\002\155\000\000\0020\0021\001}\000\000\003T\000\000\000\000\002\147\000\000\0014\002x\000\000\000\000\000\000\000\000\002x\000\000\000\000\0014\002y\002\152\001`\002\158\000\000\002y\002\152\000\000\002\158\002\164\003V\001\156\002\154\002\147\002\164\003Z\001\156\002\154\002\147\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\149\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\002\166\000\000\000\000\0024\000\000\002\151\000\204\000\000\002\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\000\000\000\000\000\000\001\226\000\000\002\026\000\000\000\000\000\000\002\149\000\000\000\000\002\002\002\155\002\149\000\000\002\006\000\000\001\028\000\000\000\000\0024\000\000\002\151\000\204\000\000\0024\000\000\002\151\000\204\002\155\000\000\0020\0021\001}\000\000\000\000\000\000\000\000\000\000\002\152\000\000\003R\000\000\000\000\000\000\000\000\002x\002\164\000\000\001\156\002\154\000\000\000\000\000\000\002\155\002y\002\152\002\007\003R\002\155\000\000\0020\0021\001}\002\164\003b\001\156\002\154\002\147\000\000\000\000\002\b\000\000\002\166\001$\000\000\002x\001%\000\000\000\000\001I\002\152\000\000\003R\001J\002y\002\152\000\000\003R\002\164\002\166\001\156\002\154\000\000\002\164\003h\001\156\002\154\002\147\000\000\000\000\001K\001,\000\000\000\000\000\000\000\000\000\000\001i\000\000\0020\0021\001}\000\000\000\000\002\166\000\000\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\002x\000\000\000\000\002\149\000\000\000\000\000\000\000\000\000\000\002y\000\000\001$\000\000\000\000\005x\0024\000\000\002\151\000\204\003n\000\000\0019\002\147\000\000\000\000\000\000\0020\0021\001}\000\000\000\000\000\000\000\000\002\149\000\000\000\000\000\000\000\000\001P\001,\000\000\002x\000\000\000\000\000\000\0024\000\000\002\151\000\204\002\155\002y\001\021\000\000\000\000\000\000\000\000\003v\001\028\001.\000\000\000\000\000\000\000\000\002\147\000\000\0020\0021\001}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\152\000\000\003R\002\155\002x\000\000\002\149\005z\002\164\000\000\001\156\002\154\000\000\002y\000\000\000\000\000\000\000\000\0024\003{\002\151\000\204\000\000\000\000\000\000\000\000\002\147\000\000\001V\000\000\002\152\000\000\003R\000\000\002\166\001/\000\000\001\021\002\164\001^\001\156\002\154\000\000\001\028\005}\000\000\000\000\002\149\001$\000\000\000\000\005t\002\155\000\000\0020\0021\001}\000\000\000\000\0024\000\000\002\151\000\204\000\000\002\166\0014\000\000\000\000\001`\002x\000\000\001$\000\000\000\000\005{\000\000\001,\005\143\002y\002\152\000\000\003r\000\000\000\000\000\000\000\000\002\149\002\164\003\135\001\156\002\154\002\147\000\000\002\155\000\000\000\000\000\000\005~\0024\001,\002\151\000\204\0020\0021\001}\000\000\005\144\000\000\005\145\0020\0021\001}\005H\002\166\005\139\000\000\005\128\002x\000\000\000\000\002\152\000\000\002\158\000\000\002x\000\000\002y\0014\002\164\000\000\001\156\002\154\002\155\002y\000\000\000\000\003\140\000\000\005\146\002\147\001\226\000\000\002@\003\145\000\000\000\000\002\147\000\000\000\000\002\002\001\021\002\149\000\000\002\006\002\166\001\028\001\028\001.\000\000\002\152\000\000\002\158\000\000\0024\000\000\002\151\000\204\002\164\000\000\001\156\002\154\005\147\000\000\001\021\000\000\000\000\000\000\000\000\000\000\001\028\001.\005\148\000\000\005\149\000\000\000\000\000\000\000\000\0020\0021\001}\000\000\000\000\002\166\000\000\002\007\000\000\002\155\000\000\002\149\000\000\000\000\001$\002x\000\000\006\240\002\149\000\000\005\207\002\b\001/\0024\002y\002\151\000\204\000\000\000\000\000\000\0024\000\000\002\151\000\204\003\160\000\000\002\152\002\147\003R\0020\0021\001}\001,\005\151\002\164\001/\001\156\002\154\005\153\005\163\000\000\000\000\0014\000\000\002x\000\000\000\000\002\155\005\205\000\000\000\000\000\000\000\000\002y\002\155\000\000\000\000\000\000\000\000\000\000\002\166\000\000\000\000\003\163\000\000\0014\002\147\005\206\000\000\000\000\000\000\000\000\000\000\000\000\002\152\000\000\003R\000\000\000\000\000\000\000\000\002\152\002\164\003R\001\156\002\154\000\000\002\149\000\000\002\164\000\000\001\156\002\154\000\000\0020\0021\001}\000\000\000\000\0024\000\000\002\151\000\204\000\000\000\000\000\000\001\021\000\000\002\166\002x\000\000\000\000\001\028\001.\001\226\002\166\004<\000\000\002y\0020\0021\001}\000\000\002\002\003\169\000\000\002\149\002\006\000\000\001\028\000\000\002\147\000\000\002\155\002x\000\000\000\000\000\000\0024\000\000\002\151\000\204\000\000\002y\000\000\000\000\000\000\000\000\000\000\003\171\000\000\000\000\000\000\000\000\000\000\000\000\002\147\000\000\000\000\000\000\002\152\000\000\003R\000\000\000\000\000\000\001/\000\000\002\164\002\007\001\156\002\154\002\155\000\000\0020\0021\001}\000\000\000\000\000\000\000\000\000\000\000\000\002\b\000\000\001$\000\000\000\000\001%\002x\000\000\002\149\000\000\000\000\002\166\001J\0014\000\000\002y\002\152\000\000\003r\000\000\0024\003\181\002\151\000\204\002\164\000\000\001\156\002\154\002\147\000\000\001,\000\000\000\000\002\149\0020\0021\001}\000\000\0020\0021\001}\0052\000\000\000\000\000\000\0024\000\000\002\151\000\204\002x\002\166\000\000\000\000\002x\002\155\000\000\006\022\001\226\002y\004\137\000\000\000\000\002y\000\000\003\190\000\000\002\002\000\000\003\193\000\000\002\006\002\147\001\028\000\000\0019\002\147\000\000\000\000\000\000\002\155\000\000\002\152\000\000\002\158\000\000\000\000\000\000\000\000\002\149\002\164\000\000\001\156\002\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\001\021\000\000\002\152\000\000\002\158\000\000\001\028\001.\002\007\000\000\002\164\002\166\001\156\002\154\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\002\149\000\000\000\000\002\155\002\149\0020\0021\001}\000\000\002\166\000\000\000\000\0024\000\000\002\151\000\204\0024\000\000\002\151\000\204\002x\0020\0021\001}\000\000\000\000\001V\000\000\000\000\002y\002\152\000\000\002\158\001/\000\000\003\207\002x\0057\002\164\000\000\001\156\002\154\002\147\000\000\000\000\002y\002\155\000\000\000\000\000\000\002\155\003\210\000\000\000\000\000\000\000\000\000\000\000\000\002\147\000\000\000\000\000\000\000\000\0014\002\166\000\000\001`\001\226\000\000\004\141\000\000\001$\000\000\002\152\006\246\002\158\002\002\002\152\000\000\002\158\002\006\002\164\001\028\001\156\002\154\002\164\000\000\001\156\002\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001$\001,\000\000\005x\002\149\000\000\000\000\000\000\000\000\002\166\000\000\000\000\000\000\002\166\000\000\000\000\0024\000\000\002\151\000\204\002\149\0020\0021\001}\002\007\0020\0021\001}\001,\000\000\000\000\000\000\0024\000\000\002\151\000\204\002x\000\000\002\b\000\000\002x\0020\0021\001}\000\000\002y\0020\0021\001}\002y\002\155\000\000\000\000\000\000\000\000\003\220\002x\000\000\002\147\003\247\000\000\002x\002\147\000\000\000\000\002y\002\155\000\000\000\000\000\000\002y\0044\005z\000\000\000\000\001\021\004A\002\152\002\147\002\158\000\000\001\028\001.\002\147\000\000\002\164\000\000\001\156\002\154\000\000\000\000\000\000\000\000\002\152\000\000\002\158\000\000\000\000\000\000\000\000\000\000\002\164\001\021\001\156\002\154\000\000\000\000\000\000\001\028\005}\000\000\002\166\000\000\000\000\000\000\000\000\000\000\000\000\002\149\000\000\000\000\000\000\002\149\000\000\000\000\000\000\000\000\002\166\000\000\000\000\0024\000\000\002\151\000\204\0024\001/\002\151\000\204\002\149\000\000\000\000\000\000\000\000\002\149\000\000\0020\0021\001}\000\000\005\143\0024\000\000\002\151\000\204\000\000\0024\000\000\002\151\000\204\000\000\002x\000\000\005~\000\000\002\155\0014\000\000\000\000\002\155\002y\0020\0021\001}\000\000\000\000\004o\000\000\005H\005\144\006Y\005\145\005\128\002\147\000\000\002\155\002x\000\000\000\000\000\000\002\155\000\000\002\152\0014\003\223\002y\002\152\000\000\003\250\000\000\002\164\004\182\001\156\002\154\002\164\000\000\001\156\002\154\002\147\000\000\000\000\005\146\002\152\000\000\002\158\000\000\000\000\002\152\000\000\002\158\002\164\000\000\001\156\002\154\000\000\002\164\002\166\001\156\002\154\000\000\002\166\000\000\001\226\000\000\004\144\0020\0021\001}\000\000\000\000\000\000\002\002\000\000\002\149\005\147\002\006\002\166\001\028\000\000\000\000\002x\002\166\000\000\000\000\005\148\0024\005\149\002\151\000\204\002y\0020\0021\001}\000\000\000\000\005\229\000\000\000\000\002\149\000\000\000\000\000\000\002\147\000\000\000\000\002x\0020\0021\001}\000\000\0024\005\150\002\151\000\204\002y\000\000\000\000\002\007\000\000\002\155\005\232\002x\000\000\000\000\000\000\000\000\000\000\002\147\000\000\000\000\002y\002\b\000\000\000\000\005\151\000\000\005\247\000\000\000\000\005\153\005\163\000\000\000\000\002\147\002\155\000\000\002\152\000\000\002\158\005\205\000\000\001\226\000\000\004\158\002\164\000\000\001\156\002\154\000\000\000\000\002\002\000\000\002\149\000\000\002\006\000\000\001\028\000\000\005\206\000\000\000\000\002\152\000\000\002\158\0024\000\000\002\151\000\204\000\000\002\164\002\166\001\156\002\154\000\000\000\000\000\000\000\000\002\149\000\000\000\000\000\000\000\000\0020\0021\001}\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\002\149\000\000\002\166\002\007\002x\002\155\000\000\0020\0021\001}\000\000\000\000\0024\002y\002\151\000\204\000\000\002\b\000\000\005\250\000\000\000\000\002x\000\000\000\000\000\000\002\147\000\000\000\000\000\000\002\155\002y\002\152\000\000\002\158\000\000\000\000\006\007\000\000\001\226\002\164\004\239\001\156\002\154\002\147\000\000\002\155\000\000\002\002\000\000\000\000\000\000\002\006\000\000\001\028\000\000\000\000\002\152\000\000\002\158\000\000\000\000\000\000\000\000\000\000\002\164\002\166\001\156\002\154\000\000\000\000\000\000\000\000\002\152\000\000\002\158\000\000\000\000\000\000\000\000\000\000\002\164\000\000\001\156\002\154\000\000\002\149\0020\0021\001}\000\000\002\166\000\000\000\000\002\007\000\000\000\000\000\000\0024\000\000\002\151\000\204\002x\000\000\002\149\000\000\000\000\002\166\002\b\000\000\000\000\002y\0020\0021\001}\000\000\0024\006\n\002\151\000\204\000\000\000\000\000\000\000\000\002\147\000\000\000\000\002x\0020\0021\001}\000\000\002\155\000\000\001$\000\000\002y\006\241\000\000\000\000\000\000\000\000\006\031\002x\006\242\000\000\000\000\000\000\000\000\002\147\002\155\000\000\002y\000\000\000\000\000\000\000\000\000\000\006\"\002\152\000\000\002\158\001,\000\000\000\000\002\147\000\000\002\164\000\000\001\156\002\154\000\000\000\000\000\000\000\000\000\000\000\000\002\152\000\000\002\158\000\000\000\000\000\000\000\000\002\149\002\164\000\000\001\156\002\154\000\000\0020\0021\001}\002\166\000\000\001\226\0024\004\245\002\151\000\204\000\000\000\000\000\000\000\000\002\002\002x\0019\000\000\002\006\002\149\001\028\002\166\000\000\000\000\002y\000\000\000\000\000\000\000\000\000\000\006&\0024\000\000\002\151\000\204\002\149\000\000\002\147\000\000\000\000\002\155\000\000\0020\0021\001}\000\000\001\021\0024\000\000\002\151\000\204\000\000\001\028\001.\000\000\000\000\000\000\002x\000\000\000\000\002\007\000\000\000\000\000\000\000\000\002\155\002y\002\152\000\000\002\158\000\000\000\000\0079\000\000\002\b\002\164\000\000\001\156\002\154\002\147\000\000\002\155\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\152\000\000\002\158\000\000\000\000\002\149\000\000\000\000\002\164\002\166\001\156\002\154\000\000\000\000\001/\006\131\002\152\0024\002\158\002\151\000\204\000\000\000\000\000\000\002\164\000\000\001\156\002\154\0020\0021\001}\000\000\000\000\006\132\002\166\000\000\000\000\006\134\000\000\000\000\000\000\000\000\000\000\002x\0014\000\000\006\135\002\149\000\000\000\000\002\166\002\155\002y\0020\0021\001}\000\000\000\000\007;\0024\000\000\002\151\000\204\000\000\001$\002\147\000\000\001%\002x\000\000\0020\0021\001}\000\000\001J\000\000\006\136\002y\002\152\000\000\002\158\001$\000\000\000\000\001%\002x\002\164\001I\001\156\002\154\002\147\001J\001,\002\155\002y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0052\000\000\000\000\000\000\002\147\001K\001,\006\137\000\000\002\166\000\000\000\000\001g\000\000\000\000\006 \006\138\002\152\000\000\002\158\000\000\000\000\002\149\000\000\000\000\002\164\000\000\001\156\002\154\000\000\001\226\000\000\004\254\0019\0024\000\000\002\151\000\204\000\000\002\002\000\000\000\000\006\150\002\006\000\000\001\028\000\000\002\149\000\000\000\000\0019\002\166\000\000\000\000\000\000\000\000\000\000\006\140\000\000\0024\000\000\002\151\000\204\001\021\002\149\000\000\006\141\001P\002\155\001\028\001.\006\143\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\001\021\006\145\000\000\000\000\000\000\002\007\001\028\001.\000\000\000\000\000\000\000\000\000\000\002\155\000\000\002\152\000\000\002\158\000\000\002\b\006\146\000\000\000\000\002\164\000\000\001\156\002\154\000\000\001$\000\000\002\155\001%\000\000\000\000\001I\000\000\001V\000\000\001J\000\000\002\152\000\000\004\132\001/\000\000\000\000\000\000\0057\002\164\002\166\001\156\002\154\000\000\001V\000\000\001K\001,\002\152\000\000\004\127\001/\000\000\001L\000\000\001^\002\164\000\000\001\156\002\154\001$\000\000\000\000\001%\0014\002\166\001I\001`\001|\001}\001J\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0014\002\166\000\000\001`\000\000\000\000\001K\001,\001~\001\142\0019\001\128\001\129\001e\000\000\001\226\000\000\005\006\001\179\000\000\0020\0021\001}\001\226\002\002\006\191\000\000\001P\002\006\000\000\001\028\000\000\002\002\000\000\000\000\002x\002\006\000\000\001\028\000\000\001\021\001|\001}\000\000\002y\000\000\001\028\001.\000\000\000\000\000\000\0019\001\143\000\000\001\144\001\177\000\000\002\147\000\000\000\000\000\000\000\000\001~\001\142\000\000\001\128\001\129\000\000\001P\000\000\002\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\007\000\000\000\000\001\021\000\000\001\151\002\b\000\000\000\000\001\028\001.\000\000\000\000\000\000\002\b\001V\000\000\001\134\000\000\000\000\000\204\000\000\001/\000\000\000\000\000\000\001^\000\000\001\143\000\000\001\144\002P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\149\001|\001}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0024\0014\002\151\000\204\001`\001V\000\000\000\000\001\151\000\000\001~\001\142\001/\001\128\001\129\000\000\001^\000\000\000\000\000\000\001\134\000\000\000\000\000\204\000\000\000\000\000\000\001\153\0020\0021\001}\003\194\000\000\000\000\002\155\001\154\000\000\001\156\001\132\000\000\000\000\000\000\0014\002x\000\000\001`\000\000\000\000\000\000\000\000\000\000\000\000\002y\000\000\001\143\000\000\001\144\002Y\000\000\000\000\000\000\002\152\000\000\004\"\000\000\002\147\000\000\000\000\000\000\002\164\000\000\001\156\002\154\000\000\000\000\0020\0021\001}\000\000\000\000\000\000\001\153\000\000\000\000\000\000\001\151\000\000\000\000\000\000\001\154\002x\001\156\001\132\000\000\000\000\002\166\000\000\001\134\000\000\002y\000\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0020\0021\001}\000\000\002\147\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002x\000\000\002\149\0020\0021\001}\002\\\000\000\000\000\002y\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\002x\000\000\000\000\000\000\002\147\000\000\000\000\000\000\000\000\002y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\153\000\000\000\000\000\000\000\000\002\147\000\000\000\000\001\154\000\000\001\156\001\132\000\000\002\155\002\149\0020\0021\001}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\002x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002y\002\152\000\000\003\156\000\000\000\000\000\000\000\000\002\149\002\164\000\000\001\156\002\154\002\147\000\000\0020\0021\001}\000\000\000\000\0024\002\155\002\151\000\204\000\000\000\000\002\149\000\000\000\000\000\000\002x\0020\0021\001}\000\000\002\166\000\000\000\000\0024\002y\002\151\000\204\000\000\000\000\000\000\000\000\002x\000\000\002\152\000\000\003C\000\000\002\147\000\000\002\155\002y\002\164\000\000\001\156\002\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\147\000\000\000\000\000\000\002\155\002\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\152\002\166\002\160\000\000\0024\000\000\002\151\000\204\002\164\000\000\001\156\002\154\0020\0021\001}\000\000\000\000\000\000\002\152\000\000\002\162\000\000\000\000\000\000\000\000\000\000\002\164\002x\001\156\002\154\000\000\002\149\000\000\000\000\002\166\000\000\002y\000\000\002\155\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\002\149\000\000\002\147\000\000\000\000\002\166\000\000\0020\0021\001}\000\000\000\000\0024\000\000\002\151\000\204\000\000\000\000\002\152\000\000\002\167\000\000\002x\000\000\000\000\000\000\002\164\000\000\001\156\002\154\002\155\002y\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\147\000\000\002\155\000\000\000\000\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\002\152\000\000\002\174\000\000\000\000\002\149\000\000\000\000\002\164\000\000\001\156\002\154\000\000\000\000\000\000\000\000\002\152\0024\002\176\002\151\000\204\000\000\000\000\000\000\002\164\000\000\001\156\002\154\0020\0021\001}\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002x\000\000\000\000\000\000\002\149\000\000\000\000\002\166\002\155\002y\0020\0021\001}\000\000\000\000\000\000\0024\000\000\002\151\000\204\000\000\000\000\002\147\000\000\000\000\002x\000\000\0020\0021\001}\000\000\000\000\000\000\000\000\002y\002\152\000\000\002\178\000\000\000\000\000\000\000\000\002x\002\164\000\000\001\156\002\154\002\147\000\000\000\000\002\155\002y\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\147\000\000\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\152\000\000\002\180\000\000\000\000\002\149\000\000\000\000\002\164\000\000\001\156\002\154\0020\0021\001}\000\000\000\000\0024\000\000\002\151\000\204\000\000\000\000\000\000\000\000\000\000\000\000\002x\000\000\000\000\002\149\000\000\000\000\000\000\002\166\000\000\002y\000\000\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\000\000\002\149\000\000\002\147\000\000\002\155\000\000\0020\0021\001}\000\000\000\000\000\000\0024\000\000\002\151\000\204\000\000\000\000\000\000\000\000\000\000\002x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\155\002y\002\152\000\000\002\182\000\000\000\000\000\000\000\000\000\000\002\164\000\000\001\156\002\154\002\147\000\000\000\000\002\155\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\152\000\000\002\184\000\000\006\131\000\000\002\149\000\000\002\164\002\166\001\156\002\154\000\000\000\000\000\000\000\000\000\000\002\152\0024\002\186\002\151\000\204\006\132\000\000\000\000\002\164\006\134\001\156\002\154\0020\0021\001}\000\000\000\000\002\166\006\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002x\000\000\000\000\002\149\0020\0021\001}\002\166\002\155\002y\000\000\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\002x\000\000\006\136\002\147\000\000\0020\0021\001}\000\000\002y\0020\0021\001}\000\000\000\000\000\000\002\152\000\000\002\188\000\000\002x\000\000\002\147\000\000\002\164\002x\001\156\002\154\000\000\002y\002\155\000\000\000\000\000\000\002y\000\000\006\137\000\000\000\000\000\000\000\000\000\000\002\147\000\000\000\000\006\138\000\000\002\147\000\000\000\000\002\166\000\000\000\000\000\000\000\000\000\000\000\000\002\152\000\000\002\190\000\000\000\000\000\000\002\149\000\000\002\164\000\000\001\156\002\154\000\000\001$\006\159\000\000\006\247\000\000\0024\000\000\002\151\000\204\000\000\006\248\000\000\002\149\000\000\000\000\000\000\006\140\000\000\000\000\000\000\000\000\002\166\000\000\000\000\0024\006\141\002\151\000\204\001,\000\000\006\143\000\000\002\149\000\000\000\000\000\000\000\000\002\149\000\000\002\155\006\145\000\000\000\000\000\000\0024\000\000\002\151\000\204\000\000\0024\000\000\002\151\000\204\000\000\000\000\0020\0021\001}\002\155\006\146\0020\0021\001}\000\000\000\000\000\000\002\152\000\000\002\192\000\000\002x\000\000\0019\000\000\002\164\002x\001\156\002\154\002\155\002y\000\000\000\000\000\000\002\155\002y\002\152\000\000\002\194\000\000\000\000\000\000\000\000\002\147\002\164\000\000\001\156\002\154\002\147\000\000\000\000\002\166\000\000\001\021\000\000\000\000\002\152\000\000\002\196\001\028\001.\002\152\000\000\002\198\002\164\000\000\001\156\002\154\000\000\002\164\002\166\001\156\002\154\000\000\000\000\000\000\000\000\000\000\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\166\000\000\000\000\000\000\000\000\002\166\000\000\0020\0021\001}\000\000\000\000\000\000\002\149\000\000\000\000\000\000\000\000\002\149\000\000\000\000\000\000\002x\001/\000\000\0024\000\000\002\151\000\204\000\000\0024\002y\002\151\000\204\000\000\000\000\000\000\0020\0021\001}\000\000\000\000\000\000\000\000\002\147\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002x\0014\000\000\0020\0021\001}\000\000\002\155\000\000\002y\000\000\000\000\002\155\000\000\000\000\000\000\000\000\000\000\002x\000\000\000\000\000\000\002\147\000\000\000\000\000\000\000\000\002y\000\000\000\000\000\000\000\000\000\000\000\000\002\152\000\000\002\200\000\000\000\000\002\152\002\147\002\202\002\164\000\000\001\156\002\154\000\000\002\164\000\000\001\156\002\154\000\000\002\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\002\166\000\000\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\149\000\000\000\000\000\000\000\000\000\000\000\000\0020\0021\001}\000\000\000\000\0024\000\000\002\151\000\204\002\155\000\000\002\149\000\000\000\000\000\000\002x\0020\0021\001}\000\000\000\000\000\000\000\000\0024\002y\002\151\000\204\000\000\000\000\000\000\000\000\002x\000\000\000\000\000\000\000\000\002\152\002\147\002\204\002\155\002y\000\000\000\000\000\000\002\164\000\000\001\156\002\154\000\000\000\000\000\000\000\000\000\000\002\147\000\000\000\000\000\000\002\155\003\007\001}\000\000\000\000\000\000\000\000\000\000\000\000\002\152\000\000\002\206\000\000\002\166\000\000\000\000\000\000\002\164\000\000\001\156\002\154\000\000\003%\001\142\000\000\001\128\001\129\002\152\000\000\002\208\000\000\006\131\000\000\000\000\000\000\002\164\000\000\001\156\002\154\000\000\002\149\000\000\000\000\002\166\000\000\000\000\007\142\000\000\000\000\007\143\000\000\000\000\0024\006\134\002\151\000\204\002\149\000\000\000\000\000\000\000\000\002\166\006\135\001|\001}\003*\003:\003;\0024\000\000\002\151\000\204\002\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001~\002\243\002\155\001\128\001\129\000\000\000\000\000\000\006\136\000\000\000\000\001|\001}\001\151\000\000\000\000\000\000\000\000\002\155\000\000\002\240\000\000\000\000\000\000\000\000\001\134\000\000\000\000\000\204\002\152\000\000\002\210\001~\002\243\000\000\001\128\001\129\002\164\000\000\001\156\002\154\000\000\006\137\001|\001}\002\152\000\000\002\212\000\000\000\000\000\000\006\138\000\000\002\164\000\000\001\156\002\154\000\000\000\000\000\000\003>\000\000\000\000\002\166\001~\001\142\000\000\001\128\001\129\000\000\000\000\000\000\000\000\007\148\000\000\001\133\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\000\000\000\000\001\153\001\134\000\000\000\000\000\204\000\000\006\140\000\000\001\154\000\000\001\156\001\132\000\000\002\244\002\245\006\141\000\000\001|\001}\000\000\006\143\001\133\001\143\000\000\001\144\002Y\003\014\000\000\000\000\000\000\006\145\000\000\000\000\001\134\000\000\003\017\000\204\002\246\001~\002\243\000\000\001\128\001\129\000\000\000\000\002\244\002\247\000\000\000\000\006\146\000\000\000\000\000\000\001\151\000\000\000\000\000\000\001|\001}\000\000\000\000\000\000\001\153\000\000\000\000\001\134\003\014\000\000\000\204\002\246\001\181\000\000\001\156\001\132\000\000\003\017\000\000\000\000\001~\002\243\000\000\001\128\001\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001$\000\000\000\000\001%\001\153\000\000\000\000\002\249\000\000\000\000\001J\000\000\001\181\000\000\001\156\001\132\0020\0021\001}\000\000\000\000\000\000\000\000\001\133\000\000\000\000\000\000\000\000\001,\000\000\000\000\002x\000\000\000\000\000\000\001\134\001\153\001T\000\204\000\000\002y\000\000\000\000\000\000\001\154\000\000\001\156\001\132\000\000\000\000\000\000\000\000\000\000\002\147\000\000\0020\0021\001}\000\000\000\000\000\000\000\000\000\000\001\133\000\000\000\000\000\000\000\000\000\000\000\000\002x\003\018\0019\000\000\000\000\001\134\000\000\000\000\000\204\002y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\020\002\147\000\000\000\000\000\000\001\153\000\000\000\000\000\000\000\000\000\000\001\021\000\000\001\181\000\000\001\156\001\132\001\028\001.\000\000\003\018\000\000\002\149\000\000\000\000\000\000\0020\0021\001}\000\000\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\000\000\000\000\003\019\002x\0020\0021\001}\001\153\000\000\000\000\000\000\000\000\002y\000\000\000\000\001\181\000\000\001\156\001\132\002x\000\000\000\000\000\000\002\149\000\000\002\147\001V\000\000\002y\000\000\002\155\000\000\000\000\001/\000\000\0024\000\000\002\151\000\204\000\000\000\000\002\147\001$\000\000\000\000\001%\000\000\000\000\000\000\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\002\152\000\000\003I\000\000\000\000\000\000\0014\000\000\002\164\001\\\001\156\002\154\002\155\001,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004U\000\000\000\000\000\000\002\149\000\000\000\000\000\000\000\000\000\000\002\166\000\000\000\000\000\000\004X\002\152\0024\003f\002\151\000\204\002\149\000\000\000\000\002\164\000\000\001\156\002\154\0020\0021\001}\000\000\000\000\0024\0019\002\151\000\204\000\000\000\000\000\000\000\000\000\000\000\000\002x\0020\0021\001}\000\000\000\000\000\000\002\166\002\155\002y\000\000\000\000\000\000\000\000\000\000\000\000\002x\000\000\0020\0021\001}\001\021\002\147\000\000\002\155\002y\000\000\001\028\001.\000\000\000\000\000\000\000\000\002x\000\000\002\152\000\000\003l\002\147\000\000\000\000\000\000\002y\002\164\000\000\001\156\002\154\000\000\000\000\000\000\000\000\002\152\000\000\003q\000\000\002\147\000\000\000\000\000\000\002\164\000\000\001\156\002\154\0020\0021\001}\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\001V\000\000\000\000\000\000\002x\000\000\000\000\001/\002\149\000\000\000\000\002\166\000\000\002y\000\000\000\000\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\002\149\000\000\002\147\000\000\000\000\000\000\000\000\000\000\001$\000\000\000\000\005x\0024\0014\002\151\000\204\004\\\002\149\0020\0021\001}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0024\002\155\002\151\000\204\002x\000\000\000\000\001,\000\000\006\131\000\000\000\000\000\000\002y\000\000\000\000\000\000\002\155\000\000\000\000\000\000\000\000\000\000\000\000\007\142\000\000\002\147\007\143\002\152\000\000\003y\006\134\000\000\002\149\002\155\000\000\002\164\000\000\001\156\002\154\006\135\000\000\000\000\000\000\002\152\0024\003~\002\151\000\204\000\000\000\000\005z\002\164\000\000\001\156\002\154\000\000\000\000\000\000\000\000\000\000\002\152\002\166\003\128\000\000\0020\0021\001}\000\000\002\164\006\136\001\156\002\154\000\000\000\000\000\000\000\000\000\000\002\166\002\155\002x\001\021\000\000\000\000\000\000\000\000\002\149\001\028\005}\002y\000\000\000\000\000\000\000\000\000\000\002\166\000\000\000\000\0024\000\000\002\151\000\204\002\147\000\000\006\137\000\000\002\152\000\000\003\131\0020\0021\001}\000\000\006\138\002\164\000\000\001\156\002\154\000\000\000\000\000\000\000\000\000\000\000\000\002x\000\000\000\000\0020\0021\001}\000\000\000\000\002\155\002y\000\000\007\153\000\000\000\000\000\000\000\000\002\166\005~\002x\000\000\000\000\000\000\002\147\000\000\000\000\000\000\000\000\002y\000\000\000\000\006\140\000\000\005H\000\000\006s\002\152\005\128\003\138\002\149\006\141\002\147\001|\001}\002\164\006\143\001\156\002\154\0014\000\000\000\000\0024\000\000\002\151\000\204\006\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001~\001\142\000\000\001\128\001\129\000\000\000\000\002\166\000\000\000\000\000\000\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\149\000\000\002\155\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\000\000\000\000\002\149\000\000\0020\0021\001}\000\000\001\143\000\000\001\144\002P\000\000\002\152\0024\003\143\002\151\000\204\000\000\002x\000\000\002\164\000\000\001\156\002\154\000\000\000\000\000\000\002y\000\000\002\155\000\000\000\000\000\000\0020\0021\001}\000\000\000\000\001\151\000\000\002\147\000\000\000\000\000\000\000\000\000\000\002\166\002\155\002x\000\000\001\134\000\000\000\000\000\204\000\000\000\000\002\152\002y\003\148\000\000\000\000\003\197\000\000\000\000\002\164\000\000\001\156\002\154\000\000\000\000\002\147\000\000\000\000\000\000\002\152\000\000\003\151\000\000\000\000\000\000\000\000\000\000\002\164\000\000\001\156\002\154\000\000\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\149\000\000\000\000\000\000\003\007\001}\000\000\000\000\002\166\000\000\000\000\001\153\0024\000\000\002\151\000\204\000\000\000\000\000\000\001\154\000\000\001\156\001\132\000\000\000\000\003%\001\142\000\000\001\128\001\129\002\149\000\000\000\000\000\000\0020\0021\001}\000\000\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\002\155\000\000\000\000\002x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003*\003:\003;\002\147\000\000\002\152\000\000\003\201\002\155\0020\0021\001}\000\000\002\164\000\000\001\156\002\154\000\000\000\000\000\000\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\151\004\t\000\000\002\152\000\000\003\203\000\000\002\166\004\018\000\000\000\000\002\164\001\134\001\156\002\154\000\204\000\000\000\000\000\000\000\000\0020\0021\001}\000\000\0020\0021\001}\000\000\000\000\000\000\000\000\002\149\004\031\000\000\000\000\002x\000\000\002\166\000\000\002x\000\000\000\000\000\000\0024\002y\002\151\000\204\003\212\002y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\147\000\000\000\000\000\000\002\147\000\000\0020\0021\001}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\153\0023\000\000\000\000\002\155\002x\000\000\000\000\001\154\000\000\001\156\001\132\000\000\004\022\002y\002\151\000\204\001\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\147\000\000\000\000\000\000\002\152\000\000\003\227\000\000\000\000\000\000\000\000\000\000\002\164\000\000\001\156\002\154\000\000\002\149\000\000\000\000\000\000\002\149\000\000\000\000\004\012\0020\0021\001}\000\000\0024\000\000\002\151\000\204\0024\000\000\002\151\000\204\000\000\002\166\000\000\002x\000\000\000\000\000\000\003\007\001}\000\000\002\152\000\000\002y\000\000\000\000\000\000\000\000\000\000\002\153\000\000\001\156\002\154\000\000\002\149\000\000\002\147\002\155\000\000\003%\001\142\002\155\001\128\001\129\000\000\000\000\0024\000\000\002\151\000\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\002\152\000\000\003\236\000\000\002\152\000\000\003\238\000\000\002\164\000\000\001\156\002\154\002\164\000\000\001\156\002\154\002\155\000\000\003*\003:\003;\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\149\000\000\002\166\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\002\152\0024\003\240\002\151\000\204\000\000\000\000\001\151\002\164\000\000\001\156\002\154\000\000\000\000\001$\000\000\000\000\001%\000\000\001\134\001a\000\000\000\204\000\000\001J\000\000\000\000\000\000\003\007\001}\000\000\000\000\000\000\000\000\002\166\002\155\000\000\000\000\000\000\000\000\000\000\001c\001,\000\000\003\007\001}\000\000\005A\000\000\003%\001\142\000\000\001\128\001\129\004u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\152\000\000\003\254\003%\001\142\000\000\001\128\001\129\002\164\000\000\001\156\002\154\000\000\000\000\000\000\001|\001}\000\000\001\153\000\000\000\000\000\000\000\000\000\000\0019\000\000\001\154\000\000\001\156\001\132\003*\003:\003;\000\000\002\166\000\000\001~\001\142\000\000\001\128\001\129\001P\000\000\000\000\000\000\000\000\003*\003:\003;\000\000\000\000\000\000\000\000\000\000\001\021\000\000\000\000\000\000\000\000\000\000\001\028\001.\001\151\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\134\000\000\000\000\000\204\001\151\000\000\001\143\000\000\001\144\007o\000\000\007q\000\000\000\000\000\000\000\000\001\134\000\000\000\000\000\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\001V\000\000\0061\000\000\001\151\001|\001}\001/\000\000\000\000\000\000\005w\000\000\000\000\000\000\000\000\001\134\000\000\006S\000\204\000\000\000\000\000\000\000\000\001|\001}\001~\001\142\001\153\001\128\001\129\000\000\000\000\000\000\000\000\000\000\001\154\0014\001\156\001\132\001`\000\000\000\000\000\000\001\153\001~\001\142\001$\001\128\001\129\001%\000\000\001\154\001a\001\156\001\132\001$\001J\000\000\001%\000\000\000\000\001I\000\000\000\000\000\000\001J\000\000\000\000\000\000\001\143\000\000\001\144\006\168\001c\001,\000\000\001\153\000\000\000\000\000\000\000\000\000\000\001O\001,\001\154\000\000\001\156\001\132\001\143\000\000\001\144\001\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\151\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\134\000\000\000\000\000\204\000\000\000\000\0019\001\151\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0019\001|\001}\000\000\001\134\000\000\000\000\000\204\001P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001P\000\000\001|\001}\001\021\001~\001\142\000\000\001\128\001\129\001\028\001.\000\000\001\021\000\000\000\000\000\000\000\000\000\000\001\028\001.\001|\001}\001~\001\142\000\000\001\128\001\129\000\000\001\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\001\156\001\132\000\000\001~\001\142\000\000\001\128\001\129\000\000\001\153\001\143\000\000\001\144\001\160\000\000\001|\001}\001\154\001V\001\156\001\132\000\000\000\000\000\000\000\000\001/\000\000\001V\001\143\001^\001\144\001\157\000\000\000\000\001/\000\000\001~\001\142\001^\001\128\001\129\001\151\000\000\000\000\000\000\000\000\000\000\001\143\000\000\001\144\001\146\000\000\000\000\001\134\000\000\0014\000\204\000\000\001`\001\151\000\000\000\000\000\000\000\000\0014\000\000\000\000\001`\000\000\000\000\000\000\001\134\000\000\000\000\000\204\000\000\000\000\000\000\001\151\000\000\001\143\000\000\001\144\001\149\000\000\001|\001}\000\000\000\000\000\000\001\134\000\000\000\000\000\204\001|\001}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\003\000\000\000\000\001~\001\142\000\000\001\128\001\129\001\151\001|\001}\001\153\001~\002\243\000\000\001\128\001\129\000\000\000\000\001\154\001\134\001\156\001\132\000\204\000\000\000\000\000\000\000\000\000\000\001\153\001~\001\142\000\000\001\128\001\129\000\000\000\000\001\154\000\000\001\156\001\132\001|\001}\000\000\000\000\000\000\000\000\001\143\001\153\001\144\001\152\000\000\000\000\000\000\000\000\000\000\001\154\000\000\001\156\001\132\000\000\000\000\001~\001\142\000\000\001\128\001\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\143\000\000\001\144\001\155\001\151\001|\001}\001\153\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\154\001\134\001\156\001\132\000\204\000\000\000\000\000\000\000\000\000\000\001\134\001~\001\142\000\204\001\128\001\129\001\151\001\143\000\000\001\144\001\165\000\000\003\006\000\000\000\000\000\000\000\000\000\000\001\134\001|\001}\000\204\000\000\000\000\000\000\000\000\000\000\000\000\003!\000\000\000\000\000\000\000\000\001|\001}\000\000\002\246\003$\001\151\000\000\001~\002\243\000\000\001\128\001\129\001\143\000\000\001\144\001\168\000\000\001\134\000\000\001\153\000\204\001~\001\142\000\000\001\128\001\129\000\000\001\154\001\153\001\156\001\132\000\000\000\000\000\000\000\000\000\000\001\181\000\000\001\156\001\132\000\000\000\000\000\000\001\151\000\000\000\000\001\153\000\000\000\000\000\000\001|\001}\000\000\000\000\001\154\001\134\001\156\001\132\000\204\000\000\000\000\000\000\000\000\000\000\000\000\001\143\000\000\001\144\002n\000\000\000\000\001~\001\142\000\000\001\128\001\129\000\000\000\000\001\153\000\000\001|\001}\001\133\000\000\000\000\000\000\001\154\000\000\001\156\001\132\000\000\000\000\000\000\000\000\001\134\000\000\001\151\000\204\000\000\000\000\000\000\001~\001\142\000\000\001\128\001\129\000\000\000\000\001\134\000\000\000\000\000\204\000\000\000\000\000\000\001\143\001\153\001\144\002\225\000\000\000\000\000\000\000\000\000\000\001\154\000\000\001\156\001\132\001|\001}\003\018\000\000\000\000\000\000\000\000\001|\001}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\143\001\151\001\144\003/\001~\001\142\000\000\001\128\001\129\000\000\001\153\001~\001\142\001\134\001\128\001\129\000\204\000\000\001\181\000\000\001\156\001\132\000\000\000\000\001\153\000\000\000\000\000\000\000\000\000\000\000\000\001\151\001\154\000\000\001\156\001\132\000\000\000\000\001|\001}\000\000\000\000\000\000\001\134\000\000\000\000\000\204\000\000\001\143\000\000\001\144\0032\000\000\000\000\000\000\001\143\000\000\001\144\0035\001~\001\142\000\000\001\128\001\129\000\000\000\000\000\000\000\000\001|\001}\000\000\000\000\000\000\000\000\001\153\000\000\0020\0021\001}\001\151\000\000\000\000\001\154\000\000\001\156\001\132\001\151\000\000\000\000\001~\001\142\001\134\001\128\001\129\000\204\000\000\000\000\000\000\001\134\000\000\004\t\000\204\000\000\001\143\001\153\001\144\003=\004\018\000\000\000\000\000\000\000\000\001\154\000\000\001\156\001\132\001|\001}\000\000\000\000\000\000\000\000\000\000\001|\001}\000\000\000\000\000\000\000\000\000\000\000\000\004\019\000\000\001\143\001\151\001\144\003\234\001~\001\142\000\000\001\128\001\129\000\000\000\000\001~\002\243\001\134\001\128\001\129\000\204\000\000\000\000\001\153\001|\001}\000\000\000\000\000\000\000\000\001\153\001\154\000\000\001\156\001\132\001\151\000\000\000\000\001\154\000\000\001\156\001\132\004~\000\000\0023\001~\002\243\001\134\001\128\001\129\000\204\000\000\001\143\000\000\001\144\004\180\004\022\000\000\002\151\000\204\001\007\000\000\000\000\000\000\000\000\000\000\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\153\001|\001}\000\000\000\000\001\151\000\000\000\000\001\154\000\000\001\156\001\132\001\133\000\000\000\000\000\000\004\012\001\134\000\000\000\000\000\204\000\000\001~\002\243\001\134\001\128\001\129\000\204\000\000\000\000\001\153\001|\001}\000\000\000\000\000\000\000\000\000\000\001\154\002\152\001\156\001\132\001\133\000\000\001|\001}\000\000\002\153\000\000\001\156\002\154\000\000\001~\002\243\001\134\001\128\001\129\000\204\000\000\000\000\003\182\000\000\000\000\000\000\000\000\001~\002\243\000\000\001\128\001\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\153\003\185\000\000\001|\001}\000\000\000\000\001\153\001\154\000\000\001\156\001\132\003\018\000\000\000\000\001\181\000\000\001\156\001\132\001\133\000\000\000\000\000\000\000\000\001~\002\243\000\000\001\128\001\129\000\000\000\000\001\134\000\000\000\000\000\204\000\000\000\000\001\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\181\000\000\001\156\001\132\001\133\000\000\000\000\000\000\000\000\001|\001}\000\000\000\000\000\000\000\000\000\000\001\134\001\133\000\000\000\204\000\000\000\000\003\182\000\000\000\000\000\000\000\000\006\011\000\000\001\134\001~\002\243\000\204\001\128\001\129\000\000\000\000\000\000\001|\001}\000\000\003\184\000\000\000\000\000\000\000\000\000\000\001\153\000\000\000\000\000\000\000\000\003\182\000\000\001\133\001\181\006#\001\156\001\132\001~\002\243\000\000\001\128\001\129\000\000\003\182\001\134\000\000\000\000\000\204\000\000\003\183\001|\001}\000\000\000\000\000\000\001\153\000\000\000\000\000\000\000\000\000\000\000\000\003\187\001\181\000\000\001\156\001\132\000\000\001\153\001|\001}\001~\002\243\000\000\001\128\001\129\001\181\000\000\001\156\001\132\006v\000\000\000\000\001\133\000\000\000\000\000\000\000\000\000\000\000\000\001~\002\243\000\000\001\128\001\129\001\134\001|\001}\000\204\000\000\000\000\001|\001}\000\000\000\000\001\153\000\000\000\000\000\000\000\000\000\000\000\000\001\133\001\181\000\000\001\156\001\132\001~\002\243\000\000\001\128\001\129\001~\002\243\001\134\001\128\001\129\000\204\001|\001}\006x\003\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\001\133\000\000\000\000\001~\002\243\000\000\001\128\001\129\000\000\000\000\001\153\000\000\001\134\000\000\003\018\000\204\000\000\000\000\001\181\001\133\001\156\001\132\000\000\000\000\000\000\000\000\000\000\000\000\0020\0021\001}\001\134\000\000\000\000\000\204\001|\001}\000\000\000\000\001\153\000\000\000\000\000\000\000\000\000\000\000\000\001\133\001\181\006>\001\156\001\132\001\133\003\152\000\000\000\000\000\000\001~\001\127\001\134\001\128\001\129\000\204\000\000\001\134\000\000\000\000\000\204\006>\000\000\000\000\000\000\000\000\000\000\001\153\000\000\000\000\001$\003\153\001\133\001%\000\000\001\181\000\000\001\156\001\132\001$\001J\000\000\001%\000\000\001\134\000\000\001\153\000\204\006v\001J\000\000\006K\000\000\006v\001\181\000\000\001\156\001\132\001,\000\000\000\000\000\000\001$\000\000\000\000\001%\000\000\001,\000\000\002\252\006J\000\000\001J\001\153\000\000\0020\0021\001}\001\153\0023\003\186\001\181\000\000\001\156\001\132\001\133\001\181\000\000\001\156\001\132\001,\0024\000\000\002\151\000\204\000\000\000\000\001\134\006w\003\152\000\204\003\028\0019\006\127\000\000\001\153\000\000\001$\000\000\000\000\001%\0019\000\000\001\181\000\000\001\156\001\132\001J\000\000\000\000\000\000\000\000\000\000\000\000\006D\000\000\000\000\001$\003\155\000\000\001%\000\000\001\021\000\000\0019\001,\000\000\001J\001\028\001.\0069\001\021\000\000\000\000\000\000\000\000\000\000\001\028\001.\000\000\000\000\000\000\002\152\000\000\000\000\001,\000\000\000\000\001\153\000\000\002\153\000\000\001\156\002\154\001\021\000\000\001\181\000\000\001\156\001\132\001\028\001.\0023\000\000\000\000\000\000\000\000\000\000\001$\0019\000\000\001%\000\000\000\000\0024\001V\002\151\000\204\001J\000\000\000\000\000\000\001/\000\000\001V\000\000\002\130\000\000\000\000\0019\000\000\001/\000\000\000\000\000\000\005S\001,\000\000\005V\001\021\000\000\000\000\000\000\000\000\000\000\001\028\001.\001V\000\000\000\000\000\000\003\155\0014\001$\001/\001`\001%\000\000\002\130\001\021\000\000\0014\000\000\001J\001`\001\028\001.\001$\000\000\001$\001%\000\000\001%\000\000\000\000\002\152\007[\001J\000\000\001J\0019\001,\000\000\002\153\0014\001\156\002\154\001`\000\000\000\000\000\000\000\000\001V\000\000\000\000\001,\000\000\001,\000\000\001/\000\000\000\000\000\000\005F\000\000\000\000\000\000\000\000\001$\000\000\001\021\001%\001V\000\000\000\000\000\000\001\028\001.\001J\001/\000\000\000\000\000\000\005S\000\000\0019\006g\000\000\000\000\0014\001$\000\000\001`\001%\000\000\000\000\001,\000\000\000\000\0019\001J\0019\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0014\000\000\000\000\001`\000\000\000\000\001\021\000\000\000\000\001,\000\000\000\000\001\028\001.\001V\000\000\000\000\000\000\000\000\000\000\001\021\001/\001\021\000\000\000\000\007\\\001\028\001.\001\028\001.\001$\0019\001$\001%\000\000\001%\000\000\000\000\000\000\000\000\001J\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0014\000\000\0019\001`\000\000\000\000\000\000\001,\001V\001,\001\021\000\000\000\000\000\000\000\000\001/\001\028\001.\000\000\0074\000\000\000\000\001V\000\000\001V\000\000\000\000\000\000\000\000\001/\000\000\001/\001\021\001p\000\000\001\199\000\000\000\000\001\028\001.\001$\000\000\000\000\001%\000\000\0014\000\000\000\000\001`\000\000\001J\0019\000\000\0019\001|\001}\000\000\000\000\000\000\0014\000\000\0014\001`\001V\001`\000\000\000\000\000\000\001,\000\000\001/\000\000\000\000\000\000\001\240\001~\002\237\000\000\001\128\001\129\000\000\001\021\000\000\001\021\000\000\001V\000\000\001\028\001.\001\028\001.\001$\001/\000\000\001%\000\000\001\242\000\000\000\000\000\000\0014\001J\000\000\001`\000\000\001$\000\000\001$\001%\000\000\001%\000\000\0019\000\000\000\000\001J\000\000\001J\000\000\001,\000\000\000\000\0014\000\000\000\000\001`\000\000\000\000\0020\0021\001}\000\000\000\000\001,\001V\001,\001V\000\000\000\000\000\000\000\000\001/\001\021\001/\000\000\002G\000\000\002[\001\028\001.\001\133\000\000\003\152\000\000\000\000\000\000\001$\000\000\000\000\001%\000\000\000\000\001\134\0019\000\000\000\204\001J\000\000\000\000\000\000\000\000\0014\000\000\0014\001`\000\000\001`\0019\000\000\0019\001$\000\000\000\000\001%\001,\000\000\000\000\000\000\000\000\000\000\001J\000\000\000\000\001\021\000\000\001V\000\000\000\000\000\000\001\028\001.\000\000\001/\000\000\000\000\000\000\002\127\001\021\001,\001\021\000\000\000\000\000\000\001\028\001.\001\028\001.\000\000\000\000\001$\000\000\000\000\001%\001\153\000\000\0023\000\000\000\000\0019\001J\000\000\001\181\0014\001\156\001\132\001`\000\000\0024\000\000\002\151\000\204\000\000\000\000\000\000\000\000\000\000\001V\001,\000\000\000\000\000\000\001$\0019\001/\001%\000\000\000\000\002\132\001\021\000\000\001V\001J\001V\000\000\001\028\001.\000\000\001/\000\000\001/\000\000\002\234\000\000\003\000\003\154\001$\000\000\000\000\001%\001,\000\000\000\000\001\021\0014\000\000\001J\001`\000\000\001\028\001.\000\000\0019\000\000\000\000\000\000\000\000\000\000\0014\002\152\0014\001`\000\000\001`\001,\000\000\000\000\002\153\000\000\001\156\002\154\001$\001V\000\000\001%\000\000\000\000\000\000\000\000\001/\000\000\001J\001\021\003\025\0019\000\000\000\000\001$\001\028\001.\001%\000\000\000\000\000\000\000\000\000\000\001V\001J\000\000\001,\000\000\000\000\000\000\001/\000\000\000\000\000\000\003\030\0019\0014\000\000\000\000\001`\000\000\001\021\001,\000\000\000\000\000\000\000\000\001\028\001.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0014\000\000\001V\001`\001$\001\021\000\000\001%\000\000\001/\0019\001\028\001.\003'\001J\000\000\000\000\000\000\000\000\000\000\001$\000\000\000\000\001%\000\000\000\000\0019\0020\0021\001}\001J\000\000\001,\001$\001V\000\000\001%\000\000\000\000\0014\001\021\001/\001`\001J\000\000\004\195\001\028\001.\001,\000\000\000\000\006\183\000\000\000\000\001$\000\000\001\021\001%\001V\000\000\000\000\001,\001\028\001.\001J\001/\000\000\000\000\000\000\005\027\000\000\0014\000\000\000\000\001`\001$\0019\000\000\001%\000\000\000\000\000\000\001,\000\000\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\0019\001V\000\000\0014\000\000\000\000\001`\000\000\001/\000\000\000\000\001,\005'\0019\001\021\000\000\000\000\001V\000\000\000\000\001\028\001.\000\000\000\000\001/\000\000\000\000\000\000\0054\000\000\001\021\000\000\0023\000\000\0019\000\000\001\028\001.\0014\000\000\000\000\001`\000\000\001\021\0024\000\000\002\151\000\204\000\000\001\028\001.\000\000\000\000\001$\0014\0019\001%\001`\001$\000\000\000\000\001%\000\000\001J\001\021\000\000\000\000\001V\001J\000\000\001\028\001.\001$\000\000\001/\001%\000\000\000\000\005E\000\000\000\000\001,\001J\001V\000\000\001\021\001,\000\000\000\000\000\000\001/\001\028\001.\000\000\005U\000\000\001V\000\000\000\000\000\000\001,\000\000\000\000\001/\0014\002\152\000\000\001`\000\000\000\000\000\000\000\000\000\000\002\153\000\000\001\156\002\154\001V\000\000\000\000\0014\000\000\000\000\001`\001/\0019\000\000\000\000\005\243\000\000\0019\001$\000\000\0014\001%\000\000\001\235\000\000\001V\000\000\000\000\001J\000\000\000\000\0019\001/\000\000\000\000\000\000\006\005\000\000\000\000\000\000\000\000\0014\001\021\000\000\001`\000\000\001,\001\021\001\028\001.\0020\0021\001}\001\028\001.\000\000\001$\000\000\000\000\001%\000\000\001\021\0014\000\000\000\000\001`\001J\001\028\001.\000\000\001$\000\000\000\000\001%\004\026\000\000\000\000\0020\0021\001}\001J\000\000\000\000\000\000\001,\000\000\0020\0021\001}\000\000\0019\000\000\000\000\000\000\000\000\001V\000\000\000\000\001,\000\000\001V\0022\001/\000\000\000\000\000\000\006\029\001/\000\000\000\000\002s\006\171\000\000\000\000\001V\0020\0021\001}\000\000\000\000\001\021\001/\000\000\000\000\000\000\007\012\001\028\001.\0019\000\000\000\000\000\000\0014\000\000\000\000\001`\000\000\0014\000\000\002u\001`\000\000\0019\000\000\000\000\000\000\000\000\0023\000\000\000\000\000\000\0014\000\000\000\000\001`\000\000\000\000\000\000\001\021\0024\000\000\002\151\000\204\000\000\001\028\001.\0020\0021\001}\000\000\000\000\000\000\001\021\001V\0023\0020\0021\001}\001\028\001.\001/\000\000\000\000\0023\007\016\000\000\0024\000\000\002\151\000\204\002\139\0020\0021\001}\000\000\0024\000\000\002\151\000\204\002\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0014\001V\0023\001`\000\000\002\165\000\000\000\000\001/\000\000\002\152\0020\0021\001}\0024\001V\002\151\000\204\002\153\000\000\001\156\002\154\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\003_\000\000\002\152\0014\000\000\000\000\001\237\000\000\000\000\000\000\002\153\002\152\001\156\002\154\000\000\000\000\000\000\0014\0023\002\153\004W\001\156\002\154\000\000\000\000\000\000\000\000\0023\000\000\000\000\0024\000\000\002\151\000\204\000\000\000\000\000\000\000\000\000\000\0024\002\152\002\151\000\204\0023\000\000\000\000\000\000\000\000\002\153\000\000\001\156\002\154\000\000\000\000\000\000\0024\000\000\002\151\000\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\0023\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0024\000\000\002\151\000\204\000\000\000\000\002\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\153\002\152\001\156\002\154\000\000\000\000\000\000\000\000\000\000\002\153\000\000\001\156\002\154\000\000\000\000\000\000\000\000\002\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\153\000\000\001\156\002\154\000\000\000\000\000\000\000\000\000\000\000\000\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\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\153\000\000\001\156\002\154")) and semantic_action = [| @@ -1336,9 +1428,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3692 "parsing/parser.mly" +# 3840 "parsing/parser.mly" ( "+" ) -# 1342 "parsing/parser.ml" +# 1434 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1361,9 +1453,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3693 "parsing/parser.mly" +# 3841 "parsing/parser.mly" ( "+." ) -# 1367 "parsing/parser.ml" +# 1459 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1386,9 +1478,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 3249 "parsing/parser.mly" +# 3366 "parsing/parser.mly" ( _1 ) -# 1392 "parsing/parser.ml" +# 1484 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1433,24 +1525,24 @@ module Tables = struct let _endpos = _endpos_tyvar_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3252 "parsing/parser.mly" +# 3369 "parsing/parser.mly" ( Ptyp_alias(ty, tyvar) ) -# 1439 "parsing/parser.ml" +# 1531 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_tyvar_, _startpos_ty_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1448 "parsing/parser.ml" +# 1540 "parsing/parser.ml" in -# 3254 "parsing/parser.mly" +# 3371 "parsing/parser.mly" ( _1 ) -# 1454 "parsing/parser.ml" +# 1546 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1496,30 +1588,30 @@ module Tables = struct let _v : (let_binding) = let attrs2 = let _1 = _1_inlined2 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 1502 "parsing/parser.ml" +# 1594 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 1511 "parsing/parser.ml" +# 1603 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2515 "parsing/parser.mly" +# 2613 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in mklb ~loc:_sloc false body attrs ) -# 1523 "parsing/parser.ml" +# 1615 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1542,9 +1634,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3579 "parsing/parser.mly" +# 3721 "parsing/parser.mly" ( _1 ) -# 1548 "parsing/parser.ml" +# 1640 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1567,9 +1659,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3580 "parsing/parser.mly" +# 3722 "parsing/parser.mly" ( Lident _1 ) -# 1573 "parsing/parser.ml" +# 1665 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1606,9 +1698,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = -# 3310 "parsing/parser.mly" +# 3452 "parsing/parser.mly" ( _2 ) -# 1612 "parsing/parser.ml" +# 1704 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1671,11 +1763,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3370 "parsing/parser.mly" +# 3512 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 1679 "parsing/parser.ml" +# 1771 "parsing/parser.ml" in let _3 = @@ -1683,24 +1775,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 1689 "parsing/parser.ml" +# 1781 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 1695 "parsing/parser.ml" +# 1787 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3312 "parsing/parser.mly" +# 3454 "parsing/parser.mly" ( wrap_typ_attrs ~loc:_sloc (reloc_typ ~loc:_sloc _4) _3 ) -# 1704 "parsing/parser.ml" +# 1796 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1731,24 +1823,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3315 "parsing/parser.mly" +# 3457 "parsing/parser.mly" ( Ptyp_var _2 ) -# 1737 "parsing/parser.ml" +# 1829 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1746 "parsing/parser.ml" +# 1838 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 1752 "parsing/parser.ml" +# 1844 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1772,23 +1864,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3317 "parsing/parser.mly" +# 3459 "parsing/parser.mly" ( Ptyp_any ) -# 1778 "parsing/parser.ml" +# 1870 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1786 "parsing/parser.ml" +# 1878 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 1792 "parsing/parser.ml" +# 1884 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1817,35 +1909,35 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 1823 "parsing/parser.ml" +# 1915 "parsing/parser.ml" in let tys = -# 3362 "parsing/parser.mly" +# 3504 "parsing/parser.mly" ( [] ) -# 1829 "parsing/parser.ml" +# 1921 "parsing/parser.ml" in -# 3320 "parsing/parser.mly" +# 3462 "parsing/parser.mly" ( Ptyp_constr(tid, tys) ) -# 1834 "parsing/parser.ml" +# 1926 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1843 "parsing/parser.ml" +# 1935 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 1849 "parsing/parser.ml" +# 1941 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1881,20 +1973,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 1887 "parsing/parser.ml" +# 1979 "parsing/parser.ml" in let tys = -# 3364 "parsing/parser.mly" +# 3506 "parsing/parser.mly" ( [ty] ) -# 1893 "parsing/parser.ml" +# 1985 "parsing/parser.ml" in -# 3320 "parsing/parser.mly" +# 3462 "parsing/parser.mly" ( Ptyp_constr(tid, tys) ) -# 1898 "parsing/parser.ml" +# 1990 "parsing/parser.ml" in let _startpos__1_ = _startpos_ty_ in @@ -1902,15 +1994,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1908 "parsing/parser.ml" +# 2000 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 1914 "parsing/parser.ml" +# 2006 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1961,9 +2053,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 1967 "parsing/parser.ml" +# 2059 "parsing/parser.ml" in let tys = @@ -1971,24 +2063,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 1975 "parsing/parser.ml" +# 2067 "parsing/parser.ml" in -# 979 "parsing/parser.mly" +# 1059 "parsing/parser.mly" ( xs ) -# 1980 "parsing/parser.ml" +# 2072 "parsing/parser.ml" in -# 3366 "parsing/parser.mly" +# 3508 "parsing/parser.mly" ( tys ) -# 1986 "parsing/parser.ml" +# 2078 "parsing/parser.ml" in -# 3320 "parsing/parser.mly" +# 3462 "parsing/parser.mly" ( Ptyp_constr(tid, tys) ) -# 1992 "parsing/parser.ml" +# 2084 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -1996,15 +2088,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2002 "parsing/parser.ml" +# 2094 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2008 "parsing/parser.ml" +# 2100 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2042,24 +2134,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3322 "parsing/parser.mly" +# 3464 "parsing/parser.mly" ( let (f, c) = _2 in Ptyp_object (f, c) ) -# 2048 "parsing/parser.ml" +# 2140 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2057 "parsing/parser.ml" +# 2149 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2063 "parsing/parser.ml" +# 2155 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2090,24 +2182,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3324 "parsing/parser.mly" +# 3466 "parsing/parser.mly" ( Ptyp_object ([], Closed) ) -# 2096 "parsing/parser.ml" +# 2188 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2105 "parsing/parser.ml" +# 2197 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2111 "parsing/parser.ml" +# 2203 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2143,20 +2235,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2149 "parsing/parser.ml" +# 2241 "parsing/parser.ml" in let tys = -# 3362 "parsing/parser.mly" +# 3504 "parsing/parser.mly" ( [] ) -# 2155 "parsing/parser.ml" +# 2247 "parsing/parser.ml" in -# 3328 "parsing/parser.mly" +# 3470 "parsing/parser.mly" ( Ptyp_class(cid, tys) ) -# 2160 "parsing/parser.ml" +# 2252 "parsing/parser.ml" in let _startpos__1_ = _startpos__2_ in @@ -2164,15 +2256,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2170 "parsing/parser.ml" +# 2262 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2176 "parsing/parser.ml" +# 2268 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2215,20 +2307,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2221 "parsing/parser.ml" +# 2313 "parsing/parser.ml" in let tys = -# 3364 "parsing/parser.mly" +# 3506 "parsing/parser.mly" ( [ty] ) -# 2227 "parsing/parser.ml" +# 2319 "parsing/parser.ml" in -# 3328 "parsing/parser.mly" +# 3470 "parsing/parser.mly" ( Ptyp_class(cid, tys) ) -# 2232 "parsing/parser.ml" +# 2324 "parsing/parser.ml" in let _startpos__1_ = _startpos_ty_ in @@ -2236,15 +2328,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2242 "parsing/parser.ml" +# 2334 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2248 "parsing/parser.ml" +# 2340 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2302,9 +2394,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2308 "parsing/parser.ml" +# 2400 "parsing/parser.ml" in let tys = @@ -2312,24 +2404,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2316 "parsing/parser.ml" +# 2408 "parsing/parser.ml" in -# 979 "parsing/parser.mly" +# 1059 "parsing/parser.mly" ( xs ) -# 2321 "parsing/parser.ml" +# 2413 "parsing/parser.ml" in -# 3366 "parsing/parser.mly" +# 3508 "parsing/parser.mly" ( tys ) -# 2327 "parsing/parser.ml" +# 2419 "parsing/parser.ml" in -# 3328 "parsing/parser.mly" +# 3470 "parsing/parser.mly" ( Ptyp_class(cid, tys) ) -# 2333 "parsing/parser.ml" +# 2425 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -2337,15 +2429,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2343 "parsing/parser.ml" +# 2435 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2349 "parsing/parser.ml" +# 2441 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2383,24 +2475,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3331 "parsing/parser.mly" +# 3473 "parsing/parser.mly" ( Ptyp_variant([_2], Closed, None) ) -# 2389 "parsing/parser.ml" +# 2481 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2398 "parsing/parser.ml" +# 2490 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2404 "parsing/parser.ml" +# 2496 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2450,24 +2542,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2454 "parsing/parser.ml" +# 2546 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 2459 "parsing/parser.ml" +# 2551 "parsing/parser.ml" in -# 3376 "parsing/parser.mly" +# 3518 "parsing/parser.mly" ( _1 ) -# 2465 "parsing/parser.ml" +# 2557 "parsing/parser.ml" in -# 3333 "parsing/parser.mly" +# 3475 "parsing/parser.mly" ( Ptyp_variant(_3, Closed, None) ) -# 2471 "parsing/parser.ml" +# 2563 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -2475,15 +2567,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2481 "parsing/parser.ml" +# 2573 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2487 "parsing/parser.ml" +# 2579 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2540,24 +2632,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2544 "parsing/parser.ml" +# 2636 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 2549 "parsing/parser.ml" +# 2641 "parsing/parser.ml" in -# 3376 "parsing/parser.mly" +# 3518 "parsing/parser.mly" ( _1 ) -# 2555 "parsing/parser.ml" +# 2647 "parsing/parser.ml" in -# 3335 "parsing/parser.mly" +# 3477 "parsing/parser.mly" ( Ptyp_variant(_2 :: _4, Closed, None) ) -# 2561 "parsing/parser.ml" +# 2653 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -2565,15 +2657,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2571 "parsing/parser.ml" +# 2663 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2577 "parsing/parser.ml" +# 2669 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2623,24 +2715,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2627 "parsing/parser.ml" +# 2719 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 2632 "parsing/parser.ml" +# 2724 "parsing/parser.ml" in -# 3376 "parsing/parser.mly" +# 3518 "parsing/parser.mly" ( _1 ) -# 2638 "parsing/parser.ml" +# 2730 "parsing/parser.ml" in -# 3337 "parsing/parser.mly" +# 3479 "parsing/parser.mly" ( Ptyp_variant(_3, Open, None) ) -# 2644 "parsing/parser.ml" +# 2736 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -2648,15 +2740,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2654 "parsing/parser.ml" +# 2746 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2660 "parsing/parser.ml" +# 2752 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2687,24 +2779,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3339 "parsing/parser.mly" +# 3481 "parsing/parser.mly" ( Ptyp_variant([], Open, None) ) -# 2693 "parsing/parser.ml" +# 2785 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2702 "parsing/parser.ml" +# 2794 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2708 "parsing/parser.ml" +# 2800 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2754,24 +2846,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2758 "parsing/parser.ml" +# 2850 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 2763 "parsing/parser.ml" +# 2855 "parsing/parser.ml" in -# 3376 "parsing/parser.mly" +# 3518 "parsing/parser.mly" ( _1 ) -# 2769 "parsing/parser.ml" +# 2861 "parsing/parser.ml" in -# 3341 "parsing/parser.mly" +# 3483 "parsing/parser.mly" ( Ptyp_variant(_3, Closed, Some []) ) -# 2775 "parsing/parser.ml" +# 2867 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -2779,15 +2871,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2785 "parsing/parser.ml" +# 2877 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2791 "parsing/parser.ml" +# 2883 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2852,18 +2944,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2856 "parsing/parser.ml" +# 2948 "parsing/parser.ml" in -# 919 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( xs ) -# 2861 "parsing/parser.ml" +# 2953 "parsing/parser.ml" in -# 3404 "parsing/parser.mly" +# 3546 "parsing/parser.mly" ( _1 ) -# 2867 "parsing/parser.ml" +# 2959 "parsing/parser.ml" in let _3 = @@ -2871,24 +2963,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2875 "parsing/parser.ml" +# 2967 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 2880 "parsing/parser.ml" +# 2972 "parsing/parser.ml" in -# 3376 "parsing/parser.mly" +# 3518 "parsing/parser.mly" ( _1 ) -# 2886 "parsing/parser.ml" +# 2978 "parsing/parser.ml" in -# 3343 "parsing/parser.mly" +# 3485 "parsing/parser.mly" ( Ptyp_variant(_3, Closed, Some _5) ) -# 2892 "parsing/parser.ml" +# 2984 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -2896,15 +2988,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2902 "parsing/parser.ml" +# 2994 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2908 "parsing/parser.ml" +# 3000 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2928,23 +3020,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3345 "parsing/parser.mly" +# 3487 "parsing/parser.mly" ( Ptyp_extension _1 ) -# 2934 "parsing/parser.ml" +# 3026 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2942 "parsing/parser.ml" +# 3034 "parsing/parser.ml" in -# 3347 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( _1 ) -# 2948 "parsing/parser.ml" +# 3040 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2968,23 +3060,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (string Asttypes.loc) = let _1 = let _1 = -# 3759 "parsing/parser.mly" +# 3909 "parsing/parser.mly" ( _1 ) -# 2974 "parsing/parser.ml" +# 3066 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 847 "parsing/parser.mly" +# 927 "parsing/parser.mly" ( mkloc _1 (make_loc _sloc) ) -# 2982 "parsing/parser.ml" +# 3074 "parsing/parser.ml" in -# 3761 "parsing/parser.mly" +# 3911 "parsing/parser.mly" ( _1 ) -# 2988 "parsing/parser.ml" +# 3080 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3022,24 +3114,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (string Asttypes.loc) = let _1 = let _1 = -# 3760 "parsing/parser.mly" +# 3910 "parsing/parser.mly" ( _1 ^ "." ^ _3.txt ) -# 3028 "parsing/parser.ml" +# 3120 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 847 "parsing/parser.mly" +# 927 "parsing/parser.mly" ( mkloc _1 (make_loc _sloc) ) -# 3037 "parsing/parser.ml" +# 3129 "parsing/parser.ml" in -# 3761 "parsing/parser.mly" +# 3911 "parsing/parser.mly" ( _1 ) -# 3043 "parsing/parser.ml" +# 3135 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3086,9 +3178,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3765 "parsing/parser.mly" +# 3915 "parsing/parser.mly" ( Attr.mk ~loc:(make_loc _sloc) _2 _3 ) -# 3092 "parsing/parser.ml" +# 3184 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3111,9 +3203,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.class_expr) = -# 1768 "parsing/parser.mly" +# 1848 "parsing/parser.mly" ( _1 ) -# 3117 "parsing/parser.ml" +# 3209 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3152,18 +3244,18 @@ module Tables = struct let _v : (Parsetree.class_expr) = let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 3158 "parsing/parser.ml" +# 3250 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1770 "parsing/parser.mly" +# 1850 "parsing/parser.mly" ( wrap_class_attrs ~loc:_sloc _3 _2 ) -# 3167 "parsing/parser.ml" +# 3259 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3203,9 +3295,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1772 "parsing/parser.mly" +# 1852 "parsing/parser.mly" ( class_of_let_bindings ~loc:_sloc _1 _3 ) -# 3209 "parsing/parser.ml" +# 3301 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3268,34 +3360,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 3274 "parsing/parser.ml" +# 3366 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in let _4 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 3283 "parsing/parser.ml" +# 3375 "parsing/parser.ml" in let _3 = -# 3684 "parsing/parser.mly" +# 3832 "parsing/parser.mly" ( Fresh ) -# 3289 "parsing/parser.ml" +# 3381 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1774 "parsing/parser.mly" +# 1854 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkclass ~loc:_sloc ~attrs:_4 (Pcl_open(od, _7)) ) -# 3299 "parsing/parser.ml" +# 3391 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3365,34 +3457,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 3371 "parsing/parser.ml" +# 3463 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 3380 "parsing/parser.ml" +# 3472 "parsing/parser.ml" in let _3 = -# 3685 "parsing/parser.mly" +# 3833 "parsing/parser.mly" ( Override ) -# 3386 "parsing/parser.ml" +# 3478 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1774 "parsing/parser.mly" +# 1854 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkclass ~loc:_sloc ~attrs:_4 (Pcl_open(od, _7)) ) -# 3396 "parsing/parser.ml" +# 3488 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3422,9 +3514,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = -# 1778 "parsing/parser.mly" +# 1858 "parsing/parser.mly" ( Cl.attr _1 _2 ) -# 3428 "parsing/parser.ml" +# 3520 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3459,18 +3551,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 3463 "parsing/parser.ml" +# 3555 "parsing/parser.ml" in -# 919 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( xs ) -# 3468 "parsing/parser.ml" +# 3560 "parsing/parser.ml" in -# 1781 "parsing/parser.mly" +# 1861 "parsing/parser.mly" ( Pcl_apply(_1, _2) ) -# 3474 "parsing/parser.ml" +# 3566 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -3478,15 +3570,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 950 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 3484 "parsing/parser.ml" +# 3576 "parsing/parser.ml" in -# 1784 "parsing/parser.mly" +# 1864 "parsing/parser.mly" ( _1 ) -# 3490 "parsing/parser.ml" +# 3582 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3510,23 +3602,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1783 "parsing/parser.mly" +# 1863 "parsing/parser.mly" ( Pcl_extension _1 ) -# 3516 "parsing/parser.ml" +# 3608 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 950 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 3524 "parsing/parser.ml" +# 3616 "parsing/parser.ml" in -# 1784 "parsing/parser.mly" +# 1864 "parsing/parser.mly" ( _1 ) -# 3530 "parsing/parser.ml" +# 3622 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3579,33 +3671,33 @@ module Tables = struct let _v : (Parsetree.class_field) = let _6 = let _1 = _1_inlined2 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 3585 "parsing/parser.ml" +# 3677 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 3594 "parsing/parser.ml" +# 3686 "parsing/parser.ml" in let _2 = -# 3684 "parsing/parser.mly" +# 3832 "parsing/parser.mly" ( Fresh ) -# 3600 "parsing/parser.ml" +# 3692 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1833 "parsing/parser.mly" +# 1913 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_inherit (_2, _4, self)) ~attrs:(_3@_6) ~docs ) -# 3609 "parsing/parser.ml" +# 3701 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3665,33 +3757,33 @@ module Tables = struct let _v : (Parsetree.class_field) = let _6 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 3671 "parsing/parser.ml" +# 3763 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined3_ in let _3 = let _1 = _1_inlined2 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 3680 "parsing/parser.ml" +# 3772 "parsing/parser.ml" in let _2 = -# 3685 "parsing/parser.mly" +# 3833 "parsing/parser.mly" ( Override ) -# 3686 "parsing/parser.ml" +# 3778 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1833 "parsing/parser.mly" +# 1913 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_inherit (_2, _4, self)) ~attrs:(_3@_6) ~docs ) -# 3695 "parsing/parser.ml" +# 3787 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3732,9 +3824,9 @@ module Tables = struct let _v : (Parsetree.class_field) = let _3 = let _1 = _1_inlined1 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 3738 "parsing/parser.ml" +# 3830 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -3742,11 +3834,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1836 "parsing/parser.mly" +# 1916 "parsing/parser.mly" ( let v, attrs = _2 in let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_val v) ~attrs:(attrs@_3) ~docs ) -# 3750 "parsing/parser.ml" +# 3842 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3787,9 +3879,9 @@ module Tables = struct let _v : (Parsetree.class_field) = let _3 = let _1 = _1_inlined1 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 3793 "parsing/parser.ml" +# 3885 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -3797,11 +3889,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1840 "parsing/parser.mly" +# 1920 "parsing/parser.mly" ( let meth, attrs = _2 in let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_method meth) ~attrs:(attrs@_3) ~docs ) -# 3805 "parsing/parser.ml" +# 3897 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3847,28 +3939,28 @@ module Tables = struct let _v : (Parsetree.class_field) = let _4 = let _1 = _1_inlined2 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 3853 "parsing/parser.ml" +# 3945 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 3862 "parsing/parser.ml" +# 3954 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1844 "parsing/parser.mly" +# 1924 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_constraint _3) ~attrs:(_2@_4) ~docs ) -# 3872 "parsing/parser.ml" +# 3964 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3914,28 +4006,28 @@ module Tables = struct let _v : (Parsetree.class_field) = let _4 = let _1 = _1_inlined2 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 3920 "parsing/parser.ml" +# 4012 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 3929 "parsing/parser.ml" +# 4021 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1847 "parsing/parser.mly" +# 1927 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_initializer _3) ~attrs:(_2@_4) ~docs ) -# 3939 "parsing/parser.ml" +# 4031 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3967,9 +4059,9 @@ module Tables = struct let _v : (Parsetree.class_field) = let _2 = let _1 = _1_inlined1 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 3973 "parsing/parser.ml" +# 4065 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -3977,10 +4069,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1850 "parsing/parser.mly" +# 1930 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_extension _1) ~attrs:_2 ~docs ) -# 3984 "parsing/parser.ml" +# 4076 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4004,23 +4096,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_field) = let _1 = let _1 = -# 1853 "parsing/parser.mly" +# 1933 "parsing/parser.mly" ( Pcf_attribute _1 ) -# 4010 "parsing/parser.ml" +# 4102 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 868 "parsing/parser.mly" +# 948 "parsing/parser.mly" ( mkcf ~loc:_sloc _1 ) -# 4018 "parsing/parser.ml" +# 4110 "parsing/parser.ml" in -# 1854 "parsing/parser.mly" +# 1934 "parsing/parser.mly" ( _1 ) -# 4024 "parsing/parser.ml" +# 4116 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4050,9 +4142,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = -# 1748 "parsing/parser.mly" +# 1828 "parsing/parser.mly" ( _2 ) -# 4056 "parsing/parser.ml" +# 4148 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4097,24 +4189,24 @@ module Tables = struct let _endpos = _endpos__4_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1751 "parsing/parser.mly" +# 1831 "parsing/parser.mly" ( Pcl_constraint(_4, _2) ) -# 4103 "parsing/parser.ml" +# 4195 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 950 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 4112 "parsing/parser.ml" +# 4204 "parsing/parser.ml" in -# 1754 "parsing/parser.mly" +# 1834 "parsing/parser.mly" ( _1 ) -# 4118 "parsing/parser.ml" +# 4210 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4145,24 +4237,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1753 "parsing/parser.mly" +# 1833 "parsing/parser.mly" ( let (l,o,p) = _1 in Pcl_fun(l, o, p, _2) ) -# 4151 "parsing/parser.ml" +# 4243 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 950 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 4160 "parsing/parser.ml" +# 4252 "parsing/parser.ml" in -# 1754 "parsing/parser.mly" +# 1834 "parsing/parser.mly" ( _1 ) -# 4166 "parsing/parser.ml" +# 4258 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4200,24 +4292,24 @@ module Tables = struct let _endpos = _endpos_e_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1809 "parsing/parser.mly" +# 1889 "parsing/parser.mly" ( let (l,o,p) = _1 in Pcl_fun(l, o, p, e) ) -# 4206 "parsing/parser.ml" +# 4298 "parsing/parser.ml" in let _endpos__1_ = _endpos_e_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 950 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 4215 "parsing/parser.ml" +# 4307 "parsing/parser.ml" in -# 1810 "parsing/parser.mly" +# 1890 "parsing/parser.mly" ( _1 ) -# 4221 "parsing/parser.ml" +# 4313 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4248,24 +4340,24 @@ module Tables = struct let _endpos = _endpos_e_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1809 "parsing/parser.mly" +# 1889 "parsing/parser.mly" ( let (l,o,p) = _1 in Pcl_fun(l, o, p, e) ) -# 4254 "parsing/parser.ml" +# 4346 "parsing/parser.ml" in let _endpos__1_ = _endpos_e_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 950 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 4263 "parsing/parser.ml" +# 4355 "parsing/parser.ml" in -# 1810 "parsing/parser.mly" +# 1890 "parsing/parser.mly" ( _1 ) -# 4269 "parsing/parser.ml" +# 4361 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4288,9 +4380,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3570 "parsing/parser.mly" +# 3712 "parsing/parser.mly" ( _1 ) -# 4294 "parsing/parser.ml" +# 4386 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4330,9 +4422,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1818 "parsing/parser.mly" +# 1898 "parsing/parser.mly" ( reloc_pat ~loc:_sloc _2 ) -# 4336 "parsing/parser.ml" +# 4428 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4384,24 +4476,24 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 1820 "parsing/parser.mly" +# 1900 "parsing/parser.mly" ( Ppat_constraint(_2, _4) ) -# 4390 "parsing/parser.ml" +# 4482 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 4399 "parsing/parser.ml" +# 4491 "parsing/parser.ml" in -# 1821 "parsing/parser.mly" +# 1901 "parsing/parser.mly" ( _1 ) -# 4405 "parsing/parser.ml" +# 4497 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4420,9 +4512,9 @@ module Tables = struct let _symbolstartpos = _endpos in let _sloc = (_symbolstartpos, _endpos) in -# 1823 "parsing/parser.mly" +# 1903 "parsing/parser.mly" ( ghpat ~loc:_sloc Ppat_any ) -# 4426 "parsing/parser.ml" +# 4518 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4459,9 +4551,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = -# 1948 "parsing/parser.mly" +# 2028 "parsing/parser.mly" ( _2 ) -# 4465 "parsing/parser.ml" +# 4557 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4478,24 +4570,24 @@ module Tables = struct let _endpos = _startpos in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 1949 "parsing/parser.mly" +# 2029 "parsing/parser.mly" ( Ptyp_any ) -# 4484 "parsing/parser.ml" +# 4576 "parsing/parser.ml" in let _endpos__1_ = _endpos__0_ in let _endpos = _endpos__1_ in let _symbolstartpos = _endpos in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 4493 "parsing/parser.ml" +# 4585 "parsing/parser.ml" in -# 1950 "parsing/parser.mly" +# 2030 "parsing/parser.mly" ( _1 ) -# 4499 "parsing/parser.ml" +# 4591 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4541,28 +4633,28 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _4 = let _1 = _1_inlined2 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 4547 "parsing/parser.ml" +# 4639 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 4556 "parsing/parser.ml" +# 4648 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1958 "parsing/parser.mly" +# 2038 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_inherit _3) ~attrs:(_2@_4) ~docs ) -# 4566 "parsing/parser.ml" +# 4658 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4620,9 +4712,9 @@ module Tables = struct let ty : (Parsetree.core_type) = Obj.magic ty in let _3 : unit = Obj.magic _3 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 4626 "parsing/parser.ml" +# 4718 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let flags : (Asttypes.mutable_flag * Asttypes.virtual_flag) = Obj.magic flags in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -4633,9 +4725,9 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _4 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 4639 "parsing/parser.ml" +# 4731 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined3_ in @@ -4643,44 +4735,44 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let label = let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 4649 "parsing/parser.ml" +# 4741 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4657 "parsing/parser.ml" +# 4749 "parsing/parser.ml" in -# 1983 "parsing/parser.mly" +# 2063 "parsing/parser.mly" ( let mut, virt = flags in label, mut, virt, ty ) -# 4666 "parsing/parser.ml" +# 4758 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 4674 "parsing/parser.ml" +# 4766 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1961 "parsing/parser.mly" +# 2041 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_val _3) ~attrs:(_2@_4) ~docs ) -# 4684 "parsing/parser.ml" +# 4776 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4738,9 +4830,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.core_type) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 4744 "parsing/parser.ml" +# 4836 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag * Asttypes.virtual_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -4751,53 +4843,53 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _7 = let _1 = _1_inlined4 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 4757 "parsing/parser.ml" +# 4849 "parsing/parser.ml" in let _endpos__7_ = _endpos__1_inlined4_ in let _6 = let _1 = _1_inlined3 in -# 3215 "parsing/parser.mly" +# 3332 "parsing/parser.mly" ( _1 ) -# 4766 "parsing/parser.ml" +# 4858 "parsing/parser.ml" in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 4774 "parsing/parser.ml" +# 4866 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4782 "parsing/parser.ml" +# 4874 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 4790 "parsing/parser.ml" +# 4882 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1965 "parsing/parser.mly" +# 2045 "parsing/parser.mly" ( let (p, v) = _3 in let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_method (_4, p, v, _6)) ~attrs:(_2@_7) ~docs ) -# 4801 "parsing/parser.ml" +# 4893 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4843,28 +4935,28 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _4 = let _1 = _1_inlined2 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 4849 "parsing/parser.ml" +# 4941 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 4858 "parsing/parser.ml" +# 4950 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1969 "parsing/parser.mly" +# 2049 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_constraint _3) ~attrs:(_2@_4) ~docs ) -# 4868 "parsing/parser.ml" +# 4960 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4896,9 +4988,9 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _2 = let _1 = _1_inlined1 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 4902 "parsing/parser.ml" +# 4994 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -4906,10 +4998,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1972 "parsing/parser.mly" +# 2052 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_extension _1) ~attrs:_2 ~docs ) -# 4913 "parsing/parser.ml" +# 5005 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4933,23 +5025,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_type_field) = let _1 = let _1 = -# 1975 "parsing/parser.mly" +# 2055 "parsing/parser.mly" ( Pctf_attribute _1 ) -# 4939 "parsing/parser.ml" +# 5031 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 866 "parsing/parser.mly" +# 946 "parsing/parser.mly" ( mkctf ~loc:_sloc _1 ) -# 4947 "parsing/parser.ml" +# 5039 "parsing/parser.ml" in -# 1976 "parsing/parser.mly" +# 2056 "parsing/parser.mly" ( _1 ) -# 4953 "parsing/parser.ml" +# 5045 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4978,42 +5070,42 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4984 "parsing/parser.ml" +# 5076 "parsing/parser.ml" in let tys = let tys = -# 1934 "parsing/parser.mly" +# 2014 "parsing/parser.mly" ( [] ) -# 4991 "parsing/parser.ml" +# 5083 "parsing/parser.ml" in -# 1940 "parsing/parser.mly" +# 2020 "parsing/parser.mly" ( tys ) -# 4996 "parsing/parser.ml" +# 5088 "parsing/parser.ml" in -# 1917 "parsing/parser.mly" +# 1997 "parsing/parser.mly" ( Pcty_constr (cid, tys) ) -# 5002 "parsing/parser.ml" +# 5094 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 864 "parsing/parser.mly" +# 944 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 5011 "parsing/parser.ml" +# 5103 "parsing/parser.ml" in -# 1920 "parsing/parser.mly" +# 2000 "parsing/parser.mly" ( _1 ) -# 5017 "parsing/parser.ml" +# 5109 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5064,9 +5156,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5070 "parsing/parser.ml" +# 5162 "parsing/parser.ml" in let tys = @@ -5075,30 +5167,30 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 5079 "parsing/parser.ml" +# 5171 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 5084 "parsing/parser.ml" +# 5176 "parsing/parser.ml" in -# 1936 "parsing/parser.mly" +# 2016 "parsing/parser.mly" ( params ) -# 5090 "parsing/parser.ml" +# 5182 "parsing/parser.ml" in -# 1940 "parsing/parser.mly" +# 2020 "parsing/parser.mly" ( tys ) -# 5096 "parsing/parser.ml" +# 5188 "parsing/parser.ml" in -# 1917 "parsing/parser.mly" +# 1997 "parsing/parser.mly" ( Pcty_constr (cid, tys) ) -# 5102 "parsing/parser.ml" +# 5194 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -5106,15 +5198,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 864 "parsing/parser.mly" +# 944 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 5112 "parsing/parser.ml" +# 5204 "parsing/parser.ml" in -# 1920 "parsing/parser.mly" +# 2000 "parsing/parser.mly" ( _1 ) -# 5118 "parsing/parser.ml" +# 5210 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5138,23 +5230,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_type) = let _1 = let _1 = -# 1919 "parsing/parser.mly" +# 1999 "parsing/parser.mly" ( Pcty_extension _1 ) -# 5144 "parsing/parser.ml" +# 5236 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 864 "parsing/parser.mly" +# 944 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 5152 "parsing/parser.ml" +# 5244 "parsing/parser.ml" in -# 1920 "parsing/parser.mly" +# 2000 "parsing/parser.mly" ( _1 ) -# 5158 "parsing/parser.ml" +# 5250 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5211,44 +5303,44 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 5215 "parsing/parser.ml" +# 5307 "parsing/parser.ml" in -# 1954 "parsing/parser.mly" +# 2034 "parsing/parser.mly" ( _1 ) -# 5220 "parsing/parser.ml" +# 5312 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 812 "parsing/parser.mly" +# 892 "parsing/parser.mly" ( extra_csig _startpos _endpos _1 ) -# 5229 "parsing/parser.ml" +# 5321 "parsing/parser.ml" in -# 1944 "parsing/parser.mly" +# 2024 "parsing/parser.mly" ( Csig.mk _1 _2 ) -# 5235 "parsing/parser.ml" +# 5327 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 5243 "parsing/parser.ml" +# 5335 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1922 "parsing/parser.mly" +# 2002 "parsing/parser.mly" ( mkcty ~loc:_sloc ~attrs:_2 (Pcty_signature _3) ) -# 5252 "parsing/parser.ml" +# 5344 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5305,43 +5397,43 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 5309 "parsing/parser.ml" +# 5401 "parsing/parser.ml" in -# 1954 "parsing/parser.mly" +# 2034 "parsing/parser.mly" ( _1 ) -# 5314 "parsing/parser.ml" +# 5406 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 812 "parsing/parser.mly" +# 892 "parsing/parser.mly" ( extra_csig _startpos _endpos _1 ) -# 5323 "parsing/parser.ml" +# 5415 "parsing/parser.ml" in -# 1944 "parsing/parser.mly" +# 2024 "parsing/parser.mly" ( Csig.mk _1 _2 ) -# 5329 "parsing/parser.ml" +# 5421 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 5337 "parsing/parser.ml" +# 5429 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1924 "parsing/parser.mly" +# 2004 "parsing/parser.mly" ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 5345 "parsing/parser.ml" +# 5437 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5371,9 +5463,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_type) = -# 1926 "parsing/parser.mly" +# 2006 "parsing/parser.mly" ( Cty.attr _1 _2 ) -# 5377 "parsing/parser.ml" +# 5469 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5436,34 +5528,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5442 "parsing/parser.ml" +# 5534 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in let _4 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 5451 "parsing/parser.ml" +# 5543 "parsing/parser.ml" in let _3 = -# 3684 "parsing/parser.mly" +# 3832 "parsing/parser.mly" ( Fresh ) -# 5457 "parsing/parser.ml" +# 5549 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1928 "parsing/parser.mly" +# 2008 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkcty ~loc:_sloc ~attrs:_4 (Pcty_open(od, _7)) ) -# 5467 "parsing/parser.ml" +# 5559 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5533,34 +5625,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5539 "parsing/parser.ml" +# 5631 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 5548 "parsing/parser.ml" +# 5640 "parsing/parser.ml" in let _3 = -# 3685 "parsing/parser.mly" +# 3833 "parsing/parser.mly" ( Override ) -# 5554 "parsing/parser.ml" +# 5646 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1928 "parsing/parser.mly" +# 2008 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkcty ~loc:_sloc ~attrs:_4 (Pcty_open(od, _7)) ) -# 5564 "parsing/parser.ml" +# 5656 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5597,9 +5689,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.class_expr) = -# 1788 "parsing/parser.mly" +# 1868 "parsing/parser.mly" ( _2 ) -# 5603 "parsing/parser.ml" +# 5695 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5638,9 +5730,9 @@ module Tables = struct let _v : (Parsetree.class_expr) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1790 "parsing/parser.mly" +# 1870 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 5644 "parsing/parser.ml" +# 5736 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5669,42 +5761,42 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5675 "parsing/parser.ml" +# 5767 "parsing/parser.ml" in let tys = let tys = -# 1934 "parsing/parser.mly" +# 2014 "parsing/parser.mly" ( [] ) -# 5682 "parsing/parser.ml" +# 5774 "parsing/parser.ml" in -# 1940 "parsing/parser.mly" +# 2020 "parsing/parser.mly" ( tys ) -# 5687 "parsing/parser.ml" +# 5779 "parsing/parser.ml" in -# 1793 "parsing/parser.mly" +# 1873 "parsing/parser.mly" ( Pcl_constr(cid, tys) ) -# 5693 "parsing/parser.ml" +# 5785 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 950 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5702 "parsing/parser.ml" +# 5794 "parsing/parser.ml" in -# 1800 "parsing/parser.mly" +# 1880 "parsing/parser.mly" ( _1 ) -# 5708 "parsing/parser.ml" +# 5800 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5755,9 +5847,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5761 "parsing/parser.ml" +# 5853 "parsing/parser.ml" in let tys = @@ -5766,30 +5858,30 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 5770 "parsing/parser.ml" +# 5862 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 5775 "parsing/parser.ml" +# 5867 "parsing/parser.ml" in -# 1936 "parsing/parser.mly" +# 2016 "parsing/parser.mly" ( params ) -# 5781 "parsing/parser.ml" +# 5873 "parsing/parser.ml" in -# 1940 "parsing/parser.mly" +# 2020 "parsing/parser.mly" ( tys ) -# 5787 "parsing/parser.ml" +# 5879 "parsing/parser.ml" in -# 1793 "parsing/parser.mly" +# 1873 "parsing/parser.mly" ( Pcl_constr(cid, tys) ) -# 5793 "parsing/parser.ml" +# 5885 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -5797,15 +5889,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 950 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5803 "parsing/parser.ml" +# 5895 "parsing/parser.ml" in -# 1800 "parsing/parser.mly" +# 1880 "parsing/parser.mly" ( _1 ) -# 5809 "parsing/parser.ml" +# 5901 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5864,43 +5956,43 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 5868 "parsing/parser.ml" +# 5960 "parsing/parser.ml" in -# 1827 "parsing/parser.mly" +# 1907 "parsing/parser.mly" ( _1 ) -# 5873 "parsing/parser.ml" +# 5965 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 811 "parsing/parser.mly" +# 891 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 5882 "parsing/parser.ml" +# 5974 "parsing/parser.ml" in -# 1814 "parsing/parser.mly" +# 1894 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 5888 "parsing/parser.ml" +# 5980 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 5896 "parsing/parser.ml" +# 5988 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1795 "parsing/parser.mly" +# 1875 "parsing/parser.mly" ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 5904 "parsing/parser.ml" +# 5996 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -5908,15 +6000,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 950 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5914 "parsing/parser.ml" +# 6006 "parsing/parser.ml" in -# 1800 "parsing/parser.mly" +# 1880 "parsing/parser.mly" ( _1 ) -# 5920 "parsing/parser.ml" +# 6012 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5968,24 +6060,24 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1797 "parsing/parser.mly" +# 1877 "parsing/parser.mly" ( Pcl_constraint(_2, _4) ) -# 5974 "parsing/parser.ml" +# 6066 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 950 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5983 "parsing/parser.ml" +# 6075 "parsing/parser.ml" in -# 1800 "parsing/parser.mly" +# 1880 "parsing/parser.mly" ( _1 ) -# 5989 "parsing/parser.ml" +# 6081 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6040,9 +6132,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1799 "parsing/parser.mly" +# 1879 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 6046 "parsing/parser.ml" +# 6138 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -6050,15 +6142,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 950 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 6056 "parsing/parser.ml" +# 6148 "parsing/parser.ml" in -# 1800 "parsing/parser.mly" +# 1880 "parsing/parser.mly" ( _1 ) -# 6062 "parsing/parser.ml" +# 6154 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6115,44 +6207,44 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 6119 "parsing/parser.ml" +# 6211 "parsing/parser.ml" in -# 1827 "parsing/parser.mly" +# 1907 "parsing/parser.mly" ( _1 ) -# 6124 "parsing/parser.ml" +# 6216 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 811 "parsing/parser.mly" +# 891 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 6133 "parsing/parser.ml" +# 6225 "parsing/parser.ml" in -# 1814 "parsing/parser.mly" +# 1894 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 6139 "parsing/parser.ml" +# 6231 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 6147 "parsing/parser.ml" +# 6239 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1802 "parsing/parser.mly" +# 1882 "parsing/parser.mly" ( mkclass ~loc:_sloc ~attrs:_2 (Pcl_structure _3) ) -# 6156 "parsing/parser.ml" +# 6248 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6175,9 +6267,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.class_type) = -# 1905 "parsing/parser.mly" +# 1985 "parsing/parser.mly" ( _1 ) -# 6181 "parsing/parser.ml" +# 6273 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6223,14 +6315,14 @@ module Tables = struct let _v : (Parsetree.class_type) = let _1 = let _1 = let label = -# 3278 "parsing/parser.mly" +# 3414 "parsing/parser.mly" ( Optional label ) -# 6229 "parsing/parser.ml" +# 6321 "parsing/parser.ml" in -# 1911 "parsing/parser.mly" +# 1991 "parsing/parser.mly" ( Pcty_arrow(label, domain, codomain) ) -# 6234 "parsing/parser.ml" +# 6326 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -6238,15 +6330,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 864 "parsing/parser.mly" +# 944 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 6244 "parsing/parser.ml" +# 6336 "parsing/parser.ml" in -# 1912 "parsing/parser.mly" +# 1992 "parsing/parser.mly" ( _1 ) -# 6250 "parsing/parser.ml" +# 6342 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6293,9 +6385,9 @@ module Tables = struct let domain : (Parsetree.core_type) = Obj.magic domain in let _2 : unit = Obj.magic _2 in let label : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 6299 "parsing/parser.ml" +# 6391 "parsing/parser.ml" ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in @@ -6303,14 +6395,14 @@ module Tables = struct let _v : (Parsetree.class_type) = let _1 = let _1 = let label = -# 3280 "parsing/parser.mly" +# 3416 "parsing/parser.mly" ( Labelled label ) -# 6309 "parsing/parser.ml" +# 6401 "parsing/parser.ml" in -# 1911 "parsing/parser.mly" +# 1991 "parsing/parser.mly" ( Pcty_arrow(label, domain, codomain) ) -# 6314 "parsing/parser.ml" +# 6406 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -6318,15 +6410,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 864 "parsing/parser.mly" +# 944 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 6324 "parsing/parser.ml" +# 6416 "parsing/parser.ml" in -# 1912 "parsing/parser.mly" +# 1992 "parsing/parser.mly" ( _1 ) -# 6330 "parsing/parser.ml" +# 6422 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6365,14 +6457,14 @@ module Tables = struct let _v : (Parsetree.class_type) = let _1 = let _1 = let label = -# 3282 "parsing/parser.mly" +# 3418 "parsing/parser.mly" ( Nolabel ) -# 6371 "parsing/parser.ml" +# 6463 "parsing/parser.ml" in -# 1911 "parsing/parser.mly" +# 1991 "parsing/parser.mly" ( Pcty_arrow(label, domain, codomain) ) -# 6376 "parsing/parser.ml" +# 6468 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_domain_) in @@ -6380,15 +6472,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 864 "parsing/parser.mly" +# 944 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 6386 "parsing/parser.ml" +# 6478 "parsing/parser.ml" in -# 1912 "parsing/parser.mly" +# 1992 "parsing/parser.mly" ( _1 ) -# 6392 "parsing/parser.ml" +# 6484 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6471,9 +6563,9 @@ module Tables = struct let csig : (Parsetree.class_type) = Obj.magic csig in let _8 : unit = Obj.magic _8 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 6477 "parsing/parser.ml" +# 6569 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -6489,9 +6581,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 6495 "parsing/parser.ml" +# 6587 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -6501,24 +6593,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 6507 "parsing/parser.ml" +# 6599 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 6515 "parsing/parser.ml" +# 6607 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2050 "parsing/parser.mly" +# 2130 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -6526,19 +6618,19 @@ module Tables = struct ext, Ci.mk id csig ~virt ~params ~attrs ~loc ~docs ) -# 6530 "parsing/parser.ml" +# 6622 "parsing/parser.ml" in -# 1048 "parsing/parser.mly" +# 1128 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 6536 "parsing/parser.ml" +# 6628 "parsing/parser.ml" in -# 2038 "parsing/parser.mly" +# 2118 "parsing/parser.mly" ( _1 ) -# 6542 "parsing/parser.ml" +# 6634 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6561,9 +6653,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3567 "parsing/parser.mly" +# 3709 "parsing/parser.mly" ( _1 ) -# 6567 "parsing/parser.ml" +# 6659 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6631,21 +6723,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 6637 "parsing/parser.ml" +# 6729 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 6643 "parsing/parser.ml" +# 6735 "parsing/parser.ml" in -# 2315 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( Extensions.From_to(_2, _4, _6, _5) ) -# 6649 "parsing/parser.ml" +# 6741 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6699,21 +6791,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 6705 "parsing/parser.ml" +# 6797 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 6711 "parsing/parser.ml" +# 6803 "parsing/parser.ml" in -# 2316 "parsing/parser.mly" +# 2402 "parsing/parser.mly" ( Extensions.In(_2, _4) ) -# 6717 "parsing/parser.ml" +# 6809 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6753,18 +6845,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 6757 "parsing/parser.ml" +# 6849 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 6762 "parsing/parser.ml" +# 6854 "parsing/parser.ml" in -# 2321 "parsing/parser.mly" +# 2407 "parsing/parser.mly" ( [({clauses= _2; guard=None} : Extensions.comprehension)] ) -# 6768 "parsing/parser.ml" +# 6860 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6818,18 +6910,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 6822 "parsing/parser.ml" +# 6914 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 6827 "parsing/parser.ml" +# 6919 "parsing/parser.ml" in -# 2323 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( [({clauses= _2; guard= Some _4} : Extensions.comprehension)] ) -# 6833 "parsing/parser.ml" +# 6925 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6869,18 +6961,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 6873 "parsing/parser.ml" +# 6965 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 6878 "parsing/parser.ml" +# 6970 "parsing/parser.ml" in -# 2325 "parsing/parser.mly" +# 2411 "parsing/parser.mly" ( ({clauses= _2; guard=None} : Extensions.comprehension) :: _3 ) -# 6884 "parsing/parser.ml" +# 6976 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6934,18 +7026,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 6938 "parsing/parser.ml" +# 7030 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 6943 "parsing/parser.ml" +# 7035 "parsing/parser.ml" in -# 2327 "parsing/parser.mly" +# 2413 "parsing/parser.mly" ( ({clauses= _2; guard= Some _4}: Extensions.comprehension) :: _5 ) -# 6949 "parsing/parser.ml" +# 7041 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6985,18 +7077,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 6989 "parsing/parser.ml" +# 7081 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 6994 "parsing/parser.ml" +# 7086 "parsing/parser.ml" in -# 2321 "parsing/parser.mly" +# 2407 "parsing/parser.mly" ( [({clauses= _2; guard=None} : Extensions.comprehension)] ) -# 7000 "parsing/parser.ml" +# 7092 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7050,18 +7142,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 7054 "parsing/parser.ml" +# 7146 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 7059 "parsing/parser.ml" +# 7151 "parsing/parser.ml" in -# 2323 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( [({clauses= _2; guard= Some _4} : Extensions.comprehension)] ) -# 7065 "parsing/parser.ml" +# 7157 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7101,18 +7193,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 7105 "parsing/parser.ml" +# 7197 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 7110 "parsing/parser.ml" +# 7202 "parsing/parser.ml" in -# 2325 "parsing/parser.mly" +# 2411 "parsing/parser.mly" ( ({clauses= _2; guard=None} : Extensions.comprehension) :: _3 ) -# 7116 "parsing/parser.ml" +# 7208 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7166,18 +7258,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 7170 "parsing/parser.ml" +# 7262 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 7175 "parsing/parser.ml" +# 7267 "parsing/parser.ml" in -# 2327 "parsing/parser.mly" +# 2413 "parsing/parser.mly" ( ({clauses= _2; guard= Some _4}: Extensions.comprehension) :: _5 ) -# 7181 "parsing/parser.ml" +# 7273 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7196,17 +7288,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 637 "parsing/parser.mly" +# 715 "parsing/parser.mly" (string * char option) -# 7202 "parsing/parser.ml" +# 7294 "parsing/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 : (Parsetree.constant) = -# 3450 "parsing/parser.mly" +# 3592 "parsing/parser.mly" ( let (n, m) = _1 in Pconst_integer (n, m) ) -# 7210 "parsing/parser.ml" +# 7302 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7225,17 +7317,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 596 "parsing/parser.mly" +# 673 "parsing/parser.mly" (char) -# 7231 "parsing/parser.ml" +# 7323 "parsing/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 : (Parsetree.constant) = -# 3451 "parsing/parser.mly" +# 3593 "parsing/parser.mly" ( Pconst_char _1 ) -# 7239 "parsing/parser.ml" +# 7331 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7254,17 +7346,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 689 "parsing/parser.mly" +# 769 "parsing/parser.mly" (string * Location.t * string option) -# 7260 "parsing/parser.ml" +# 7352 "parsing/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 : (Parsetree.constant) = -# 3452 "parsing/parser.mly" +# 3594 "parsing/parser.mly" ( let (s, strloc, d) = _1 in Pconst_string (s, strloc, d) ) -# 7268 "parsing/parser.ml" +# 7360 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7283,17 +7375,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 616 "parsing/parser.mly" +# 693 "parsing/parser.mly" (string * char option) -# 7289 "parsing/parser.ml" +# 7381 "parsing/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 : (Parsetree.constant) = -# 3453 "parsing/parser.mly" +# 3595 "parsing/parser.mly" ( let (f, m) = _1 in Pconst_float (f, m) ) -# 7297 "parsing/parser.ml" +# 7389 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7323,9 +7415,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.label) = -# 3524 "parsing/parser.mly" +# 3666 "parsing/parser.mly" ( "[]" ) -# 7329 "parsing/parser.ml" +# 7421 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7355,9 +7447,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.label) = -# 3525 "parsing/parser.mly" +# 3667 "parsing/parser.mly" ( "()" ) -# 7361 "parsing/parser.ml" +# 7453 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7380,9 +7472,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3526 "parsing/parser.mly" +# 3668 "parsing/parser.mly" ( "false" ) -# 7386 "parsing/parser.ml" +# 7478 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7405,9 +7497,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3527 "parsing/parser.mly" +# 3669 "parsing/parser.mly" ( "true" ) -# 7411 "parsing/parser.ml" +# 7503 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7426,17 +7518,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 701 "parsing/parser.mly" +# 781 "parsing/parser.mly" (string) -# 7432 "parsing/parser.ml" +# 7524 "parsing/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 : (Asttypes.label) = -# 3530 "parsing/parser.mly" +# 3672 "parsing/parser.mly" ( _1 ) -# 7440 "parsing/parser.ml" +# 7532 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7473,14 +7565,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Asttypes.label) = let _1 = -# 3521 "parsing/parser.mly" +# 3663 "parsing/parser.mly" ( "::" ) -# 7479 "parsing/parser.ml" +# 7571 "parsing/parser.ml" in -# 3531 "parsing/parser.mly" +# 3673 "parsing/parser.mly" ( _1 ) -# 7484 "parsing/parser.ml" +# 7576 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7503,9 +7595,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3532 "parsing/parser.mly" +# 3674 "parsing/parser.mly" ( _1 ) -# 7509 "parsing/parser.ml" +# 7601 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7528,9 +7620,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3535 "parsing/parser.mly" +# 3677 "parsing/parser.mly" ( _1 ) -# 7534 "parsing/parser.ml" +# 7626 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7581,14 +7673,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = let _3 = -# 3521 "parsing/parser.mly" +# 3663 "parsing/parser.mly" ( "::" ) -# 7587 "parsing/parser.ml" +# 7679 "parsing/parser.ml" in -# 3536 "parsing/parser.mly" +# 3678 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 7592 "parsing/parser.ml" +# 7684 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7625,14 +7717,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = let _1 = -# 3521 "parsing/parser.mly" +# 3663 "parsing/parser.mly" ( "::" ) -# 7631 "parsing/parser.ml" +# 7723 "parsing/parser.ml" in -# 3537 "parsing/parser.mly" +# 3679 "parsing/parser.mly" ( Lident _1 ) -# 7636 "parsing/parser.ml" +# 7728 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7655,9 +7747,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3538 "parsing/parser.mly" +# 3680 "parsing/parser.mly" ( Lident _1 ) -# 7661 "parsing/parser.ml" +# 7753 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7694,9 +7786,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type * Parsetree.core_type) = -# 1994 "parsing/parser.mly" +# 2074 "parsing/parser.mly" ( _1, _3 ) -# 7700 "parsing/parser.ml" +# 7792 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7721,26 +7813,26 @@ module Tables = struct let _v : (Parsetree.constructor_arguments) = let tys = let xs = let xs = -# 935 "parsing/parser.mly" +# 1015 "parsing/parser.mly" ( [ x ] ) -# 7727 "parsing/parser.ml" +# 7819 "parsing/parser.ml" in # 253 "" ( List.rev xs ) -# 7732 "parsing/parser.ml" +# 7824 "parsing/parser.ml" in -# 955 "parsing/parser.mly" +# 1035 "parsing/parser.mly" ( xs ) -# 7738 "parsing/parser.ml" +# 7830 "parsing/parser.ml" in -# 3085 "parsing/parser.mly" +# 3197 "parsing/parser.mly" ( Pcstr_tuple tys ) -# 7744 "parsing/parser.ml" +# 7836 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7779,26 +7871,26 @@ module Tables = struct let _v : (Parsetree.constructor_arguments) = let tys = let xs = let xs = -# 939 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( x :: xs ) -# 7785 "parsing/parser.ml" +# 7877 "parsing/parser.ml" in # 253 "" ( List.rev xs ) -# 7790 "parsing/parser.ml" +# 7882 "parsing/parser.ml" in -# 955 "parsing/parser.mly" +# 1035 "parsing/parser.mly" ( xs ) -# 7796 "parsing/parser.ml" +# 7888 "parsing/parser.ml" in -# 3085 "parsing/parser.mly" +# 3197 "parsing/parser.mly" ( Pcstr_tuple tys ) -# 7802 "parsing/parser.ml" +# 7894 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7835,9 +7927,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.constructor_arguments) = -# 3087 "parsing/parser.mly" +# 3199 "parsing/parser.mly" ( Pcstr_record _2 ) -# 7841 "parsing/parser.ml" +# 7933 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7860,9 +7952,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constructor_declaration list) = -# 3006 "parsing/parser.mly" +# 3118 "parsing/parser.mly" ( [] ) -# 7866 "parsing/parser.ml" +# 7958 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7885,14 +7977,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.constructor_declaration list) = let cs = -# 1040 "parsing/parser.mly" +# 1120 "parsing/parser.mly" ( List.rev xs ) -# 7891 "parsing/parser.ml" +# 7983 "parsing/parser.ml" in -# 3008 "parsing/parser.mly" +# 3120 "parsing/parser.mly" ( cs ) -# 7896 "parsing/parser.ml" +# 7988 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7915,14 +8007,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = -# 3240 "parsing/parser.mly" +# 3357 "parsing/parser.mly" ( _1 ) -# 7921 "parsing/parser.ml" +# 8013 "parsing/parser.ml" in -# 3230 "parsing/parser.mly" +# 3347 "parsing/parser.mly" ( _1 ) -# 7926 "parsing/parser.ml" +# 8018 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7952,9 +8044,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = -# 3232 "parsing/parser.mly" +# 3349 "parsing/parser.mly" ( Typ.attr _1 _2 ) -# 7958 "parsing/parser.ml" +# 8050 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7977,9 +8069,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.direction_flag) = -# 3629 "parsing/parser.mly" +# 3771 "parsing/parser.mly" ( Upto ) -# 7983 "parsing/parser.ml" +# 8075 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8002,9 +8094,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.direction_flag) = -# 3630 "parsing/parser.mly" +# 3772 "parsing/parser.mly" ( Downto ) -# 8008 "parsing/parser.ml" +# 8100 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8027,9 +8119,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = -# 2141 "parsing/parser.mly" +# 2225 "parsing/parser.mly" ( _1 ) -# 8033 "parsing/parser.ml" +# 8125 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8107,9 +8199,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 8113 "parsing/parser.ml" +# 8205 "parsing/parser.ml" in let _3 = @@ -8117,21 +8209,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 8123 "parsing/parser.ml" +# 8215 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 8129 "parsing/parser.ml" +# 8221 "parsing/parser.ml" in -# 2189 "parsing/parser.mly" +# 2275 "parsing/parser.mly" ( Pexp_letmodule(_4, _5, _7), _3 ) -# 8135 "parsing/parser.ml" +# 8227 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -8139,10 +8231,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8146 "parsing/parser.ml" +# 8238 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8226,9 +8318,9 @@ module Tables = struct let _3 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 8232 "parsing/parser.ml" +# 8324 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -8237,19 +8329,19 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 8243 "parsing/parser.ml" +# 8335 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3070 "parsing/parser.mly" +# 3182 "parsing/parser.mly" ( let args, res = _2 in Te.decl _1 ~args ?res ~attrs:_3 ~loc:(make_loc _sloc) ) -# 8253 "parsing/parser.ml" +# 8345 "parsing/parser.ml" in let _3 = @@ -8257,21 +8349,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 8263 "parsing/parser.ml" +# 8355 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 8269 "parsing/parser.ml" +# 8361 "parsing/parser.ml" in -# 2191 "parsing/parser.mly" +# 2277 "parsing/parser.mly" ( Pexp_letexception(_4, _6), _3 ) -# 8275 "parsing/parser.ml" +# 8367 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -8279,10 +8371,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8286 "parsing/parser.ml" +# 8378 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8352,28 +8444,28 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 8358 "parsing/parser.ml" +# 8450 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 8364 "parsing/parser.ml" +# 8456 "parsing/parser.ml" in let _3 = -# 3684 "parsing/parser.mly" +# 3832 "parsing/parser.mly" ( Fresh ) -# 8370 "parsing/parser.ml" +# 8462 "parsing/parser.ml" in -# 2193 "parsing/parser.mly" +# 2279 "parsing/parser.mly" ( let open_loc = make_loc (_startpos__2_, _endpos__5_) in let od = Opn.mk _5 ~override:_3 ~loc:open_loc in Pexp_open(od, _7), _4 ) -# 8377 "parsing/parser.ml" +# 8469 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -8381,10 +8473,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8388 "parsing/parser.ml" +# 8480 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8461,28 +8553,28 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 8467 "parsing/parser.ml" +# 8559 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 8473 "parsing/parser.ml" +# 8565 "parsing/parser.ml" in let _3 = -# 3685 "parsing/parser.mly" +# 3833 "parsing/parser.mly" ( Override ) -# 8479 "parsing/parser.ml" +# 8571 "parsing/parser.ml" in -# 2193 "parsing/parser.mly" +# 2279 "parsing/parser.mly" ( let open_loc = make_loc (_startpos__2_, _endpos__5_) in let od = Opn.mk _5 ~override:_3 ~loc:open_loc in Pexp_open(od, _7), _4 ) -# 8486 "parsing/parser.ml" +# 8578 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -8490,10 +8582,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8497 "parsing/parser.ml" +# 8589 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8542,18 +8634,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 8546 "parsing/parser.ml" +# 8638 "parsing/parser.ml" in -# 1012 "parsing/parser.mly" +# 1092 "parsing/parser.mly" ( xs ) -# 8551 "parsing/parser.ml" +# 8643 "parsing/parser.ml" in -# 2556 "parsing/parser.mly" +# 2668 "parsing/parser.mly" ( xs ) -# 8557 "parsing/parser.ml" +# 8649 "parsing/parser.ml" in let _2 = @@ -8561,21 +8653,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 8567 "parsing/parser.ml" +# 8659 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 8573 "parsing/parser.ml" +# 8665 "parsing/parser.ml" in -# 2197 "parsing/parser.mly" +# 2283 "parsing/parser.mly" ( Pexp_function _3, _2 ) -# 8579 "parsing/parser.ml" +# 8671 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -8583,10 +8675,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8590 "parsing/parser.ml" +# 8682 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8642,22 +8734,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 8648 "parsing/parser.ml" +# 8740 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 8654 "parsing/parser.ml" +# 8746 "parsing/parser.ml" in -# 2199 "parsing/parser.mly" +# 2285 "parsing/parser.mly" ( let (l,o,p) = _3 in Pexp_fun(l, o, p, _4), _2 ) -# 8661 "parsing/parser.ml" +# 8753 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -8665,10 +8757,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8672 "parsing/parser.ml" +# 8764 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8741,33 +8833,33 @@ module Tables = struct let _endpos = _endpos__7_ in let _v : (Parsetree.expression) = let _1 = let _5 = -# 2451 "parsing/parser.mly" +# 2537 "parsing/parser.mly" ( xs ) -# 8747 "parsing/parser.ml" +# 8839 "parsing/parser.ml" in let _2 = let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 8756 "parsing/parser.ml" +# 8848 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 8762 "parsing/parser.ml" +# 8854 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2202 "parsing/parser.mly" +# 2288 "parsing/parser.mly" ( (mk_newtypes ~loc:_sloc _5 _7).pexp_desc, _2 ) -# 8771 "parsing/parser.ml" +# 8863 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -8775,10 +8867,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8782 "parsing/parser.ml" +# 8874 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8841,18 +8933,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 8845 "parsing/parser.ml" +# 8937 "parsing/parser.ml" in -# 1012 "parsing/parser.mly" +# 1092 "parsing/parser.mly" ( xs ) -# 8850 "parsing/parser.ml" +# 8942 "parsing/parser.ml" in -# 2556 "parsing/parser.mly" +# 2668 "parsing/parser.mly" ( xs ) -# 8856 "parsing/parser.ml" +# 8948 "parsing/parser.ml" in let _2 = @@ -8860,21 +8952,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 8866 "parsing/parser.ml" +# 8958 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 8872 "parsing/parser.ml" +# 8964 "parsing/parser.ml" in -# 2204 "parsing/parser.mly" +# 2290 "parsing/parser.mly" ( Pexp_match(_3, _5), _2 ) -# 8878 "parsing/parser.ml" +# 8970 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -8882,10 +8974,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8889 "parsing/parser.ml" +# 8981 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8948,18 +9040,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 8952 "parsing/parser.ml" +# 9044 "parsing/parser.ml" in -# 1012 "parsing/parser.mly" +# 1092 "parsing/parser.mly" ( xs ) -# 8957 "parsing/parser.ml" +# 9049 "parsing/parser.ml" in -# 2556 "parsing/parser.mly" +# 2668 "parsing/parser.mly" ( xs ) -# 8963 "parsing/parser.ml" +# 9055 "parsing/parser.ml" in let _2 = @@ -8967,21 +9059,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 8973 "parsing/parser.ml" +# 9065 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 8979 "parsing/parser.ml" +# 9071 "parsing/parser.ml" in -# 2206 "parsing/parser.mly" +# 2292 "parsing/parser.mly" ( Pexp_try(_3, _5), _2 ) -# 8985 "parsing/parser.ml" +# 9077 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -8989,10 +9081,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8996 "parsing/parser.ml" +# 9088 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9055,21 +9147,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 9061 "parsing/parser.ml" +# 9153 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 9067 "parsing/parser.ml" +# 9159 "parsing/parser.ml" in -# 2208 "parsing/parser.mly" +# 2294 "parsing/parser.mly" ( syntax_error() ) -# 9073 "parsing/parser.ml" +# 9165 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -9077,10 +9169,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9084 "parsing/parser.ml" +# 9176 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9157,21 +9249,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 9163 "parsing/parser.ml" +# 9255 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 9169 "parsing/parser.ml" +# 9261 "parsing/parser.ml" in -# 2210 "parsing/parser.mly" +# 2296 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 9175 "parsing/parser.ml" +# 9267 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -9179,10 +9271,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9186 "parsing/parser.ml" +# 9278 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9245,21 +9337,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 9251 "parsing/parser.ml" +# 9343 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 9257 "parsing/parser.ml" +# 9349 "parsing/parser.ml" in -# 2212 "parsing/parser.mly" +# 2298 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, None), _2 ) -# 9263 "parsing/parser.ml" +# 9355 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -9267,10 +9359,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9274 "parsing/parser.ml" +# 9366 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9340,21 +9432,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 9346 "parsing/parser.ml" +# 9438 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 9352 "parsing/parser.ml" +# 9444 "parsing/parser.ml" in -# 2214 "parsing/parser.mly" +# 2300 "parsing/parser.mly" ( Pexp_while(_3, _5), _2 ) -# 9358 "parsing/parser.ml" +# 9450 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -9362,10 +9454,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9369 "parsing/parser.ml" +# 9461 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9463,21 +9555,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 9469 "parsing/parser.ml" +# 9561 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 9475 "parsing/parser.ml" +# 9567 "parsing/parser.ml" in -# 2217 "parsing/parser.mly" +# 2303 "parsing/parser.mly" ( Pexp_for(_3, _5, _7, _6, _9), _2 ) -# 9481 "parsing/parser.ml" +# 9573 "parsing/parser.ml" in let _endpos__1_ = _endpos__10_ in @@ -9485,10 +9577,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9492 "parsing/parser.ml" +# 9584 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9537,21 +9629,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 9543 "parsing/parser.ml" +# 9635 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 9549 "parsing/parser.ml" +# 9641 "parsing/parser.ml" in -# 2219 "parsing/parser.mly" +# 2305 "parsing/parser.mly" ( Pexp_assert _3, _2 ) -# 9555 "parsing/parser.ml" +# 9647 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -9559,10 +9651,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9566 "parsing/parser.ml" +# 9658 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9611,21 +9703,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 9617 "parsing/parser.ml" +# 9709 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 9623 "parsing/parser.ml" +# 9715 "parsing/parser.ml" in -# 2221 "parsing/parser.mly" +# 2307 "parsing/parser.mly" ( Pexp_lazy _3, _2 ) -# 9629 "parsing/parser.ml" +# 9721 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -9633,10 +9725,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9640 "parsing/parser.ml" +# 9732 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9701,27 +9793,27 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 9705 "parsing/parser.ml" +# 9797 "parsing/parser.ml" in -# 1827 "parsing/parser.mly" +# 1907 "parsing/parser.mly" ( _1 ) -# 9710 "parsing/parser.ml" +# 9802 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 811 "parsing/parser.mly" +# 891 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 9719 "parsing/parser.ml" +# 9811 "parsing/parser.ml" in -# 1814 "parsing/parser.mly" +# 1894 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 9725 "parsing/parser.ml" +# 9817 "parsing/parser.ml" in let _2 = @@ -9729,21 +9821,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 9735 "parsing/parser.ml" +# 9827 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 9741 "parsing/parser.ml" +# 9833 "parsing/parser.ml" in -# 2223 "parsing/parser.mly" +# 2309 "parsing/parser.mly" ( Pexp_object _3, _2 ) -# 9747 "parsing/parser.ml" +# 9839 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -9751,10 +9843,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9758 "parsing/parser.ml" +# 9850 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9819,27 +9911,27 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 9823 "parsing/parser.ml" +# 9915 "parsing/parser.ml" in -# 1827 "parsing/parser.mly" +# 1907 "parsing/parser.mly" ( _1 ) -# 9828 "parsing/parser.ml" +# 9920 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 811 "parsing/parser.mly" +# 891 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 9837 "parsing/parser.ml" +# 9929 "parsing/parser.ml" in -# 1814 "parsing/parser.mly" +# 1894 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 9843 "parsing/parser.ml" +# 9935 "parsing/parser.ml" in let _2 = @@ -9847,23 +9939,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 9853 "parsing/parser.ml" +# 9945 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 9859 "parsing/parser.ml" +# 9951 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2225 "parsing/parser.mly" +# 2311 "parsing/parser.mly" ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 9867 "parsing/parser.ml" +# 9959 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -9871,10 +9963,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2227 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9878 "parsing/parser.ml" +# 9970 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9909,18 +10001,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 9913 "parsing/parser.ml" +# 10005 "parsing/parser.ml" in -# 919 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( xs ) -# 9918 "parsing/parser.ml" +# 10010 "parsing/parser.ml" in -# 2229 "parsing/parser.mly" +# 2315 "parsing/parser.mly" ( Pexp_apply(_1, _2) ) -# 9924 "parsing/parser.ml" +# 10016 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -9928,15 +10020,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 9934 "parsing/parser.ml" +# 10026 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 9940 "parsing/parser.ml" +# 10032 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9965,24 +10057,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 9969 "parsing/parser.ml" +# 10061 "parsing/parser.ml" in -# 979 "parsing/parser.mly" +# 1059 "parsing/parser.mly" ( xs ) -# 9974 "parsing/parser.ml" +# 10066 "parsing/parser.ml" in -# 2583 "parsing/parser.mly" +# 2695 "parsing/parser.mly" ( es ) -# 9980 "parsing/parser.ml" +# 10072 "parsing/parser.ml" in -# 2231 "parsing/parser.mly" +# 2317 "parsing/parser.mly" ( Pexp_tuple(_1) ) -# 9986 "parsing/parser.ml" +# 10078 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_xs_) in @@ -9990,15 +10082,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 9996 "parsing/parser.ml" +# 10088 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10002 "parsing/parser.ml" +# 10094 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10034,15 +10126,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 10040 "parsing/parser.ml" +# 10132 "parsing/parser.ml" in -# 2233 "parsing/parser.mly" +# 2319 "parsing/parser.mly" ( Pexp_construct(_1, Some _2) ) -# 10046 "parsing/parser.ml" +# 10138 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -10050,15 +10142,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10056 "parsing/parser.ml" +# 10148 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10062 "parsing/parser.ml" +# 10154 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10089,24 +10181,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2235 "parsing/parser.mly" +# 2321 "parsing/parser.mly" ( Pexp_variant(_1, Some _2) ) -# 10095 "parsing/parser.ml" +# 10187 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10104 "parsing/parser.ml" +# 10196 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10110 "parsing/parser.ml" +# 10202 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10138,9 +10230,9 @@ module Tables = struct } = _menhir_stack in let e2 : (Parsetree.expression) = Obj.magic e2 in let op : ( -# 627 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 10144 "parsing/parser.ml" +# 10236 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -10150,24 +10242,24 @@ module Tables = struct let _1 = let op = let _1 = -# 3494 "parsing/parser.mly" +# 3636 "parsing/parser.mly" ( op ) -# 10156 "parsing/parser.ml" +# 10248 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10165 "parsing/parser.ml" +# 10257 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10171 "parsing/parser.ml" +# 10263 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10175,15 +10267,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10181 "parsing/parser.ml" +# 10273 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10187 "parsing/parser.ml" +# 10279 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10215,9 +10307,9 @@ module Tables = struct } = _menhir_stack in let e2 : (Parsetree.expression) = Obj.magic e2 in let op : ( -# 628 "parsing/parser.mly" +# 706 "parsing/parser.mly" (string) -# 10221 "parsing/parser.ml" +# 10313 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -10227,24 +10319,24 @@ module Tables = struct let _1 = let op = let _1 = -# 3495 "parsing/parser.mly" +# 3637 "parsing/parser.mly" ( op ) -# 10233 "parsing/parser.ml" +# 10325 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10242 "parsing/parser.ml" +# 10334 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10248 "parsing/parser.ml" +# 10340 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10252,15 +10344,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10258 "parsing/parser.ml" +# 10350 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10264 "parsing/parser.ml" +# 10356 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10292,9 +10384,9 @@ module Tables = struct } = _menhir_stack in let e2 : (Parsetree.expression) = Obj.magic e2 in let op : ( -# 629 "parsing/parser.mly" +# 707 "parsing/parser.mly" (string) -# 10298 "parsing/parser.ml" +# 10390 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -10304,24 +10396,24 @@ module Tables = struct let _1 = let op = let _1 = -# 3496 "parsing/parser.mly" +# 3638 "parsing/parser.mly" ( op ) -# 10310 "parsing/parser.ml" +# 10402 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10319 "parsing/parser.ml" +# 10411 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10325 "parsing/parser.ml" +# 10417 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10329,15 +10421,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10335 "parsing/parser.ml" +# 10427 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10341 "parsing/parser.ml" +# 10433 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10369,9 +10461,9 @@ module Tables = struct } = _menhir_stack in let e2 : (Parsetree.expression) = Obj.magic e2 in let op : ( -# 630 "parsing/parser.mly" +# 708 "parsing/parser.mly" (string) -# 10375 "parsing/parser.ml" +# 10467 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -10381,24 +10473,24 @@ module Tables = struct let _1 = let op = let _1 = -# 3497 "parsing/parser.mly" +# 3639 "parsing/parser.mly" ( op ) -# 10387 "parsing/parser.ml" +# 10479 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10396 "parsing/parser.ml" +# 10488 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10402 "parsing/parser.ml" +# 10494 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10406,15 +10498,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10412 "parsing/parser.ml" +# 10504 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10418 "parsing/parser.ml" +# 10510 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10446,9 +10538,9 @@ module Tables = struct } = _menhir_stack in let e2 : (Parsetree.expression) = Obj.magic e2 in let op : ( -# 631 "parsing/parser.mly" +# 709 "parsing/parser.mly" (string) -# 10452 "parsing/parser.ml" +# 10544 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -10458,24 +10550,24 @@ module Tables = struct let _1 = let op = let _1 = -# 3498 "parsing/parser.mly" +# 3640 "parsing/parser.mly" ( op ) -# 10464 "parsing/parser.ml" +# 10556 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10473 "parsing/parser.ml" +# 10565 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10479 "parsing/parser.ml" +# 10571 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10483,15 +10575,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10489 "parsing/parser.ml" +# 10581 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10495 "parsing/parser.ml" +# 10587 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10531,23 +10623,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3499 "parsing/parser.mly" +# 3641 "parsing/parser.mly" ("+") -# 10537 "parsing/parser.ml" +# 10629 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10545 "parsing/parser.ml" +# 10637 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10551 "parsing/parser.ml" +# 10643 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10555,15 +10647,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10561 "parsing/parser.ml" +# 10653 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10567 "parsing/parser.ml" +# 10659 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10603,23 +10695,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3500 "parsing/parser.mly" +# 3642 "parsing/parser.mly" ("+.") -# 10609 "parsing/parser.ml" +# 10701 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10617 "parsing/parser.ml" +# 10709 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10623 "parsing/parser.ml" +# 10715 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10627,15 +10719,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10633 "parsing/parser.ml" +# 10725 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10639 "parsing/parser.ml" +# 10731 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10675,23 +10767,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3501 "parsing/parser.mly" +# 3643 "parsing/parser.mly" ("+=") -# 10681 "parsing/parser.ml" +# 10773 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10689 "parsing/parser.ml" +# 10781 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10695 "parsing/parser.ml" +# 10787 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10699,15 +10791,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10705 "parsing/parser.ml" +# 10797 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10711 "parsing/parser.ml" +# 10803 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10747,23 +10839,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3502 "parsing/parser.mly" +# 3644 "parsing/parser.mly" ("-") -# 10753 "parsing/parser.ml" +# 10845 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10761 "parsing/parser.ml" +# 10853 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10767 "parsing/parser.ml" +# 10859 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10771,15 +10863,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10777 "parsing/parser.ml" +# 10869 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10783 "parsing/parser.ml" +# 10875 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10819,23 +10911,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3503 "parsing/parser.mly" +# 3645 "parsing/parser.mly" ("-.") -# 10825 "parsing/parser.ml" +# 10917 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10833 "parsing/parser.ml" +# 10925 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10839 "parsing/parser.ml" +# 10931 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10843,15 +10935,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10849 "parsing/parser.ml" +# 10941 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10855 "parsing/parser.ml" +# 10947 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10891,23 +10983,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3504 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ("*") -# 10897 "parsing/parser.ml" +# 10989 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10905 "parsing/parser.ml" +# 10997 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10911 "parsing/parser.ml" +# 11003 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10915,15 +11007,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10921 "parsing/parser.ml" +# 11013 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10927 "parsing/parser.ml" +# 11019 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10963,23 +11055,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3505 "parsing/parser.mly" +# 3647 "parsing/parser.mly" ("%") -# 10969 "parsing/parser.ml" +# 11061 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10977 "parsing/parser.ml" +# 11069 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10983 "parsing/parser.ml" +# 11075 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10987,15 +11079,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10993 "parsing/parser.ml" +# 11085 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 10999 "parsing/parser.ml" +# 11091 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11035,23 +11127,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3506 "parsing/parser.mly" +# 3648 "parsing/parser.mly" ("=") -# 11041 "parsing/parser.ml" +# 11133 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11049 "parsing/parser.ml" +# 11141 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11055 "parsing/parser.ml" +# 11147 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -11059,15 +11151,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11065 "parsing/parser.ml" +# 11157 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 11071 "parsing/parser.ml" +# 11163 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11107,23 +11199,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3507 "parsing/parser.mly" +# 3649 "parsing/parser.mly" ("<") -# 11113 "parsing/parser.ml" +# 11205 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11121 "parsing/parser.ml" +# 11213 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11127 "parsing/parser.ml" +# 11219 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -11131,15 +11223,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11137 "parsing/parser.ml" +# 11229 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 11143 "parsing/parser.ml" +# 11235 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11179,23 +11271,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3508 "parsing/parser.mly" +# 3650 "parsing/parser.mly" (">") -# 11185 "parsing/parser.ml" +# 11277 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11193 "parsing/parser.ml" +# 11285 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11199 "parsing/parser.ml" +# 11291 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -11203,15 +11295,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11209 "parsing/parser.ml" +# 11301 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 11215 "parsing/parser.ml" +# 11307 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11251,23 +11343,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3509 "parsing/parser.mly" +# 3651 "parsing/parser.mly" ("or") -# 11257 "parsing/parser.ml" +# 11349 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11265 "parsing/parser.ml" +# 11357 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11271 "parsing/parser.ml" +# 11363 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -11275,15 +11367,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11281 "parsing/parser.ml" +# 11373 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 11287 "parsing/parser.ml" +# 11379 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11323,23 +11415,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3510 "parsing/parser.mly" +# 3652 "parsing/parser.mly" ("||") -# 11329 "parsing/parser.ml" +# 11421 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11337 "parsing/parser.ml" +# 11429 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11343 "parsing/parser.ml" +# 11435 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -11347,15 +11439,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11353 "parsing/parser.ml" +# 11445 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 11359 "parsing/parser.ml" +# 11451 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11395,23 +11487,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3511 "parsing/parser.mly" +# 3653 "parsing/parser.mly" ("&") -# 11401 "parsing/parser.ml" +# 11493 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11409 "parsing/parser.ml" +# 11501 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11415 "parsing/parser.ml" +# 11507 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -11419,15 +11511,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11425 "parsing/parser.ml" +# 11517 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 11431 "parsing/parser.ml" +# 11523 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11467,23 +11559,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3512 "parsing/parser.mly" +# 3654 "parsing/parser.mly" ("&&") -# 11473 "parsing/parser.ml" +# 11565 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11481 "parsing/parser.ml" +# 11573 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11487 "parsing/parser.ml" +# 11579 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -11491,15 +11583,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11497 "parsing/parser.ml" +# 11589 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 11503 "parsing/parser.ml" +# 11595 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11539,23 +11631,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3513 "parsing/parser.mly" +# 3655 "parsing/parser.mly" (":=") -# 11545 "parsing/parser.ml" +# 11637 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11553 "parsing/parser.ml" +# 11645 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2323 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11559 "parsing/parser.ml" +# 11651 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -11563,15 +11655,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11569 "parsing/parser.ml" +# 11661 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 11575 "parsing/parser.ml" +# 11667 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11604,9 +11696,9 @@ module Tables = struct let _1 = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2239 "parsing/parser.mly" +# 2325 "parsing/parser.mly" ( mkuminus ~oploc:_loc__1_ _1 _2 ) -# 11610 "parsing/parser.ml" +# 11702 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -11614,15 +11706,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11620 "parsing/parser.ml" +# 11712 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 11626 "parsing/parser.ml" +# 11718 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11655,9 +11747,9 @@ module Tables = struct let _1 = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2241 "parsing/parser.mly" +# 2327 "parsing/parser.mly" ( mkuplus ~oploc:_loc__1_ _1 _2 ) -# 11661 "parsing/parser.ml" +# 11753 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -11665,15 +11757,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11671 "parsing/parser.ml" +# 11763 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2230 "parsing/parser.mly" ( _1 ) -# 11677 "parsing/parser.ml" +# 11769 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11713,9 +11805,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2148 "parsing/parser.mly" +# 2232 "parsing/parser.mly" ( expr_of_let_bindings ~loc:_sloc _1 _3 ) -# 11719 "parsing/parser.ml" +# 11811 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11755,9 +11847,9 @@ module Tables = struct let _3 : unit = Obj.magic _3 in let bindings : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = Obj.magic bindings in let _1 : ( -# 633 "parsing/parser.mly" +# 711 "parsing/parser.mly" (string) -# 11761 "parsing/parser.ml" +# 11853 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -11767,9 +11859,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 11773 "parsing/parser.ml" +# 11865 "parsing/parser.ml" in let _startpos_pbop_op_ = _startpos__1_ in @@ -11777,13 +11869,13 @@ module Tables = struct let _symbolstartpos = _startpos_pbop_op_ in let _sloc = (_symbolstartpos, _endpos) in -# 2150 "parsing/parser.mly" +# 2234 "parsing/parser.mly" ( let (pbop_pat, pbop_exp, rev_ands) = bindings in let ands = List.rev rev_ands in let pbop_loc = make_loc _sloc in let let_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in mkexp ~loc:_sloc (Pexp_letop{ let_; ands; body}) ) -# 11787 "parsing/parser.ml" +# 11879 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11824,9 +11916,9 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in -# 2156 "parsing/parser.mly" +# 2240 "parsing/parser.mly" ( mkexp_cons ~loc:_sloc _loc__2_ (ghexp ~loc:_sloc (Pexp_tuple[_1;_3])) ) -# 11830 "parsing/parser.ml" +# 11922 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11859,35 +11951,35 @@ module Tables = struct let _3 : (Parsetree.expression) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 11865 "parsing/parser.ml" +# 11957 "parsing/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 : (Parsetree.expression) = let _1 = let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 11874 "parsing/parser.ml" +# 11966 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 11882 "parsing/parser.ml" +# 11974 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2158 "parsing/parser.mly" +# 2242 "parsing/parser.mly" ( mkexp ~loc:_sloc (Pexp_setinstvar(_1, _3)) ) -# 11891 "parsing/parser.ml" +# 11983 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11943,18 +12035,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 11949 "parsing/parser.ml" +# 12041 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2160 "parsing/parser.mly" +# 2244 "parsing/parser.mly" ( mkexp ~loc:_sloc (Pexp_setfield(_1, _3, _5)) ) -# 11958 "parsing/parser.ml" +# 12050 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12022,9 +12114,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2162 "parsing/parser.mly" +# 2246 "parsing/parser.mly" ( array_set ~loc:_sloc _1 _4 _7 ) -# 12028 "parsing/parser.ml" +# 12120 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12092,9 +12184,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2164 "parsing/parser.mly" +# 2248 "parsing/parser.mly" ( string_set ~loc:_sloc _1 _4 _7 ) -# 12098 "parsing/parser.ml" +# 12190 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12162,9 +12254,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2166 "parsing/parser.mly" +# 2250 "parsing/parser.mly" ( bigarray_set ~loc:_sloc _1 _4 _7 ) -# 12168 "parsing/parser.ml" +# 12260 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12224,26 +12316,26 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 12230 "parsing/parser.ml" +# 12322 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = 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 : (Parsetree.expression) = let _4 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 12239 "parsing/parser.ml" +# 12331 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2168 "parsing/parser.mly" +# 2252 "parsing/parser.mly" ( dotop_set ~loc:_sloc lident bracket _2 _1 _4 _7 ) -# 12247 "parsing/parser.ml" +# 12339 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12303,26 +12395,26 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 12309 "parsing/parser.ml" +# 12401 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = 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 : (Parsetree.expression) = let _4 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 12318 "parsing/parser.ml" +# 12410 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2170 "parsing/parser.mly" +# 2254 "parsing/parser.mly" ( dotop_set ~loc:_sloc lident paren _2 _1 _4 _7 ) -# 12326 "parsing/parser.ml" +# 12418 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12382,26 +12474,26 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 12388 "parsing/parser.ml" +# 12480 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = 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 : (Parsetree.expression) = let _4 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 12397 "parsing/parser.ml" +# 12489 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2172 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( dotop_set ~loc:_sloc lident brace _2 _1 _4 _7 ) -# 12405 "parsing/parser.ml" +# 12497 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12473,9 +12565,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _5 : unit = Obj.magic _5 in let _4 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 12479 "parsing/parser.ml" +# 12571 "parsing/parser.ml" ) = Obj.magic _4 in let _3 : (Longident.t) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in @@ -12484,17 +12576,17 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__9_ in let _v : (Parsetree.expression) = let _6 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 12490 "parsing/parser.ml" +# 12582 "parsing/parser.ml" in let _endpos = _endpos__9_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2175 "parsing/parser.mly" +# 2259 "parsing/parser.mly" ( dotop_set ~loc:_sloc (ldot _3) bracket _4 _1 _6 _9 ) -# 12498 "parsing/parser.ml" +# 12590 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12566,9 +12658,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _5 : unit = Obj.magic _5 in let _4 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 12572 "parsing/parser.ml" +# 12664 "parsing/parser.ml" ) = Obj.magic _4 in let _3 : (Longident.t) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in @@ -12577,17 +12669,17 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__9_ in let _v : (Parsetree.expression) = let _6 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 12583 "parsing/parser.ml" +# 12675 "parsing/parser.ml" in let _endpos = _endpos__9_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2178 "parsing/parser.mly" +# 2262 "parsing/parser.mly" ( dotop_set ~loc:_sloc (ldot _3) paren _4 _1 _6 _9 ) -# 12591 "parsing/parser.ml" +# 12683 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12659,9 +12751,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _5 : unit = Obj.magic _5 in let _4 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 12665 "parsing/parser.ml" +# 12757 "parsing/parser.ml" ) = Obj.magic _4 in let _3 : (Longident.t) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in @@ -12670,17 +12762,17 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__9_ in let _v : (Parsetree.expression) = let _6 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 12676 "parsing/parser.ml" +# 12768 "parsing/parser.ml" in let _endpos = _endpos__9_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2181 "parsing/parser.mly" +# 2265 "parsing/parser.mly" ( dotop_set ~loc:_sloc (ldot _3) brace _4 _1 _6 _9 ) -# 12684 "parsing/parser.ml" +# 12776 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12710,9 +12802,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 2183 "parsing/parser.mly" +# 2267 "parsing/parser.mly" ( Exp.attr _1 _2 ) -# 12716 "parsing/parser.ml" +# 12808 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12736,9 +12828,44 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2185 "parsing/parser.mly" +# 2269 "parsing/parser.mly" ( not_expecting _loc__1_ "wildcard \"_\"" ) -# 12742 "parsing/parser.ml" +# 12834 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 : (Parsetree.expression) = 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 : (Parsetree.expression) = let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2271 "parsing/parser.mly" + ( mkexp_stack ~loc:_sloc _2 ) +# 12869 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12754,9 +12881,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (string Asttypes.loc option) = -# 3785 "parsing/parser.mly" +# 3935 "parsing/parser.mly" ( None ) -# 12760 "parsing/parser.ml" +# 12887 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12786,9 +12913,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (string Asttypes.loc option) = -# 3786 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( Some _2 ) -# 12792 "parsing/parser.ml" +# 12919 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12832,9 +12959,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.extension) = -# 3796 "parsing/parser.mly" +# 3946 "parsing/parser.mly" ( (_2, _3) ) -# 12838 "parsing/parser.ml" +# 12965 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12853,9 +12980,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 691 "parsing/parser.mly" +# 771 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) -# 12859 "parsing/parser.ml" +# 12986 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -12864,9 +12991,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3798 "parsing/parser.mly" +# 3948 "parsing/parser.mly" ( mk_quotedext ~loc:_sloc _1 ) -# 12870 "parsing/parser.ml" +# 12997 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12919,9 +13046,9 @@ module Tables = struct let _v : (Parsetree.extension_constructor) = let attrs = let _1 = _1_inlined3 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 12925 "parsing/parser.ml" +# 13052 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined3_ in @@ -12931,9 +13058,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 12937 "parsing/parser.ml" +# 13064 "parsing/parser.ml" in let cid = @@ -12942,19 +13069,19 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 12948 "parsing/parser.ml" +# 13075 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3154 "parsing/parser.mly" +# 3271 "parsing/parser.mly" ( let info = symbol_info _endpos in Te.rebind cid lid ~attrs ~loc:(make_loc _sloc) ~info ) -# 12958 "parsing/parser.ml" +# 13085 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13000,9 +13127,9 @@ module Tables = struct let _v : (Parsetree.extension_constructor) = let attrs = let _1 = _1_inlined2 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 13006 "parsing/parser.ml" +# 13133 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined2_ in @@ -13012,9 +13139,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 13018 "parsing/parser.ml" +# 13145 "parsing/parser.ml" in let cid = @@ -13022,25 +13149,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 13028 "parsing/parser.ml" +# 13155 "parsing/parser.ml" in let _startpos_cid_ = _startpos__1_ in let _1 = -# 3605 "parsing/parser.mly" +# 3747 "parsing/parser.mly" ( () ) -# 13035 "parsing/parser.ml" +# 13162 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos_cid_ in let _sloc = (_symbolstartpos, _endpos) in -# 3154 "parsing/parser.mly" +# 3271 "parsing/parser.mly" ( let info = symbol_info _endpos in Te.rebind cid lid ~attrs ~loc:(make_loc _sloc) ~info ) -# 13044 "parsing/parser.ml" +# 13171 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13087,10 +13214,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3773 "parsing/parser.mly" +# 3923 "parsing/parser.mly" ( mark_symbol_docs _sloc; Attr.mk ~loc:(make_loc _sloc) _2 _3 ) -# 13094 "parsing/parser.ml" +# 13221 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13106,14 +13233,14 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let params = -# 1934 "parsing/parser.mly" +# 2014 "parsing/parser.mly" ( [] ) -# 13112 "parsing/parser.ml" +# 13239 "parsing/parser.ml" in -# 1759 "parsing/parser.mly" +# 1839 "parsing/parser.mly" ( params ) -# 13117 "parsing/parser.ml" +# 13244 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13154,24 +13281,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 13158 "parsing/parser.ml" +# 13285 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 13163 "parsing/parser.ml" +# 13290 "parsing/parser.ml" in -# 1936 "parsing/parser.mly" +# 2016 "parsing/parser.mly" ( params ) -# 13169 "parsing/parser.ml" +# 13296 "parsing/parser.ml" in -# 1759 "parsing/parser.mly" +# 1839 "parsing/parser.mly" ( params ) -# 13175 "parsing/parser.ml" +# 13302 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13194,9 +13321,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = -# 2542 "parsing/parser.mly" +# 2640 "parsing/parser.mly" ( _1 ) -# 13200 "parsing/parser.ml" +# 13327 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13236,9 +13363,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2544 "parsing/parser.mly" +# 2642 "parsing/parser.mly" ( mkexp_constraint ~loc:_sloc _3 _1 ) -# 13242 "parsing/parser.ml" +# 13369 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13268,9 +13395,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 2568 "parsing/parser.mly" +# 2680 "parsing/parser.mly" ( _2 ) -# 13274 "parsing/parser.ml" +# 13401 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13315,24 +13442,24 @@ module Tables = struct let _endpos = _endpos__4_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2570 "parsing/parser.mly" +# 2682 "parsing/parser.mly" ( Pexp_constraint (_4, _2) ) -# 13321 "parsing/parser.ml" +# 13448 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13330 "parsing/parser.ml" +# 13457 "parsing/parser.ml" in -# 2571 "parsing/parser.mly" +# 2683 "parsing/parser.mly" ( _1 ) -# 13336 "parsing/parser.ml" +# 13463 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13365,12 +13492,12 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2574 "parsing/parser.mly" +# 2686 "parsing/parser.mly" ( let (l,o,p) = _1 in ghexp ~loc:_sloc (Pexp_fun(l, o, p, _2)) ) -# 13374 "parsing/parser.ml" +# 13501 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13421,17 +13548,42 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Parsetree.expression) = let _3 = -# 2451 "parsing/parser.mly" +# 2537 "parsing/parser.mly" ( xs ) -# 13427 "parsing/parser.ml" +# 13554 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2579 "parsing/parser.mly" +# 2691 "parsing/parser.mly" ( mk_newtypes ~loc:_sloc _3 _5 ) -# 13435 "parsing/parser.ml" +# 13562 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_ty_ in + let _endpos = _endpos_ty_ in + let _v : (Parsetree.core_type) = +# 3383 "parsing/parser.mly" + ( ty ) +# 13587 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13454,9 +13606,9 @@ module Tables = struct let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.core_type) = -# 3266 "parsing/parser.mly" +# 3385 "parsing/parser.mly" ( ty ) -# 13460 "parsing/parser.ml" +# 13612 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13469,68 +13621,27 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in - let _3 : unit = Obj.magic _3 in - let _1 : (Parsetree.core_type) = Obj.magic _1 in - let label : (string) = Obj.magic label 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_label_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = - let _1 = - let domain = -# 815 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 13508 "parsing/parser.ml" - in - let label = -# 3278 "parsing/parser.mly" - ( Optional label ) -# 13513 "parsing/parser.ml" - in - -# 3272 "parsing/parser.mly" - ( Ptyp_arrow(label, domain, codomain) ) -# 13518 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 854 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 13528 "parsing/parser.ml" - - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Lexing.position * Parsetree.functor_parameter) = let _startpos = _startpos__1_ in -# 3274 "parsing/parser.mly" - ( _1 ) -# 13534 "parsing/parser.ml" +# 1270 "parsing/parser.mly" + ( _startpos, Unit ) +# 13645 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13543,79 +13654,77 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + 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 = label; - MenhirLib.EngineTypes.startp = _startpos_label_; - MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _5 : unit = Obj.magic _5 in + let mty : (Parsetree.module_type) = Obj.magic mty in let _3 : unit = Obj.magic _3 in - let _1 : (Parsetree.core_type) = Obj.magic _1 in - let _2 : unit = Obj.magic _2 in - let label : ( -# 651 "parsing/parser.mly" - (string) -# 13583 "parsing/parser.ml" - ) = Obj.magic label in + let _1_inlined1 : (string option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_label_ in - let _endpos = _endpos_codomain_ in - let _v : (Parsetree.core_type) = let _1 = - let _1 = - let domain = -# 815 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 13593 "parsing/parser.ml" - in - let label = -# 3280 "parsing/parser.mly" - ( Labelled label ) -# 13598 "parsing/parser.ml" - in - -# 3272 "parsing/parser.mly" - ( Ptyp_arrow(label, domain, codomain) ) -# 13603 "parsing/parser.ml" - - in - let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Lexing.position * Parsetree.functor_parameter) = let x = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 13613 "parsing/parser.ml" +# 897 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 13703 "parsing/parser.ml" in + let _startpos = _startpos__1_ in -# 3274 "parsing/parser.mly" - ( _1 ) -# 13619 "parsing/parser.ml" +# 1273 "parsing/parser.mly" + ( _startpos, Named (x, mty) ) +# 13710 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.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 : (Parsetree.constructor_arguments * Parsetree.core_type option) = +# 3186 "parsing/parser.mly" + ( (Pcstr_tuple [],None) ) +# 13728 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13628,255 +13737,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = codomain; - MenhirLib.EngineTypes.startp = _startpos_codomain_; - MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_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 : (Parsetree.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 : (Parsetree.constructor_arguments * Parsetree.core_type option) = +# 3187 "parsing/parser.mly" + ( (_2,None) ) +# 13760 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in - let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : (Parsetree.core_type) = Obj.magic _4 in let _3 : unit = Obj.magic _3 in - let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _2 : (Parsetree.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_codomain_ in - let _v : (Parsetree.core_type) = let _1 = - let _1 = - let domain = -# 815 "parsing/parser.mly" - ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 13660 "parsing/parser.ml" - in - let label = -# 3282 "parsing/parser.mly" - ( Nolabel ) -# 13665 "parsing/parser.ml" - in - -# 3272 "parsing/parser.mly" - ( Ptyp_arrow(label, domain, codomain) ) -# 13670 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos_codomain_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 854 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 13680 "parsing/parser.ml" - - in - -# 3274 "parsing/parser.mly" - ( _1 ) -# 13686 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - 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 : (Lexing.position * Parsetree.functor_parameter) = let _startpos = _startpos__1_ in - -# 1190 "parsing/parser.mly" - ( _startpos, Unit ) -# 13719 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - 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 = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; - 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 _5 : unit = Obj.magic _5 in - let mty : (Parsetree.module_type) = Obj.magic mty in - let _3 : unit = Obj.magic _3 in - let _1_inlined1 : (string option) = 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__5_ in - let _v : (Lexing.position * Parsetree.functor_parameter) = let x = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 817 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 13777 "parsing/parser.ml" - - in - let _startpos = _startpos__1_ in - -# 1193 "parsing/parser.mly" - ( _startpos, Named (x, mty) ) -# 13784 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.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 : (Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3074 "parsing/parser.mly" - ( (Pcstr_tuple [],None) ) -# 13802 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - 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 : (Parsetree.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 : (Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3075 "parsing/parser.mly" - ( (_2,None) ) -# 13834 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - 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 : (Parsetree.core_type) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.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__4_ in - let _v : (Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3077 "parsing/parser.mly" - ( (_2,Some _4) ) -# 13880 "parsing/parser.ml" + let _endpos = _endpos__4_ in + let _v : (Parsetree.constructor_arguments * Parsetree.core_type option) = +# 3189 "parsing/parser.mly" + ( (_2,Some _4) ) +# 13806 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13906,9 +13832,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3079 "parsing/parser.mly" +# 3191 "parsing/parser.mly" ( (Pcstr_tuple [],Some _2) ) -# 13912 "parsing/parser.ml" +# 13838 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13956,9 +13882,9 @@ module Tables = struct Docstrings.info) = let attrs = let _1 = _1_inlined2 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 13962 "parsing/parser.ml" +# 13888 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined2_ in @@ -13968,23 +13894,23 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 13974 "parsing/parser.ml" +# 13900 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3022 "parsing/parser.mly" +# 3134 "parsing/parser.mly" ( let args, res = args_res in let info = symbol_info _endpos in let loc = make_loc _sloc in cid, args, res, attrs, loc, info ) -# 13988 "parsing/parser.ml" +# 13914 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14025,9 +13951,9 @@ module Tables = struct Docstrings.info) = let attrs = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 14031 "parsing/parser.ml" +# 13957 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined1_ in @@ -14036,29 +13962,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 14042 "parsing/parser.ml" +# 13968 "parsing/parser.ml" in let _startpos_cid_ = _startpos__1_ in let _1 = -# 3605 "parsing/parser.mly" +# 3747 "parsing/parser.mly" ( () ) -# 14049 "parsing/parser.ml" +# 13975 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos_cid_ in let _sloc = (_symbolstartpos, _endpos) in -# 3022 "parsing/parser.mly" +# 3134 "parsing/parser.mly" ( let args, res = args_res in let info = symbol_info _endpos in let loc = make_loc _sloc in cid, args, res, attrs, loc, info ) -# 14062 "parsing/parser.ml" +# 13988 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14129,9 +14055,9 @@ module Tables = struct let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 14135 "parsing/parser.ml" +# 14061 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -14144,9 +14070,9 @@ module Tables = struct Parsetree.type_declaration) = let attrs2 = let _1 = _1_inlined4 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 14150 "parsing/parser.ml" +# 14076 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -14155,24 +14081,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 14159 "parsing/parser.ml" +# 14085 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 981 "parsing/parser.mly" ( xs ) -# 14164 "parsing/parser.ml" +# 14090 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 3039 "parsing/parser.mly" ( _1 ) -# 14170 "parsing/parser.ml" +# 14096 "parsing/parser.ml" in let kind_priv_manifest = -# 2962 "parsing/parser.mly" +# 3074 "parsing/parser.mly" ( _2 ) -# 14176 "parsing/parser.ml" +# 14102 "parsing/parser.ml" in let id = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in @@ -14180,29 +14106,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 14186 "parsing/parser.ml" +# 14112 "parsing/parser.ml" in let flag = -# 3625 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( Recursive ) -# 14192 "parsing/parser.ml" +# 14118 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 14199 "parsing/parser.ml" +# 14125 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2899 "parsing/parser.mly" +# 3011 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -14211,7 +14137,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 14215 "parsing/parser.ml" +# 14141 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14288,9 +14214,9 @@ module Tables = struct let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in let _1_inlined4 : unit = Obj.magic _1_inlined4 in let _1_inlined3 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 14294 "parsing/parser.ml" +# 14220 "parsing/parser.ml" ) = Obj.magic _1_inlined3 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined2 : unit = Obj.magic _1_inlined2 in @@ -14304,9 +14230,9 @@ module Tables = struct Parsetree.type_declaration) = let attrs2 = let _1 = _1_inlined5 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 14310 "parsing/parser.ml" +# 14236 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined5_ in @@ -14315,24 +14241,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 14319 "parsing/parser.ml" +# 14245 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 981 "parsing/parser.mly" ( xs ) -# 14324 "parsing/parser.ml" +# 14250 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 3039 "parsing/parser.mly" ( _1 ) -# 14330 "parsing/parser.ml" +# 14256 "parsing/parser.ml" in let kind_priv_manifest = -# 2962 "parsing/parser.mly" +# 3074 "parsing/parser.mly" ( _2 ) -# 14336 "parsing/parser.ml" +# 14262 "parsing/parser.ml" in let id = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in @@ -14340,9 +14266,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 14346 "parsing/parser.ml" +# 14272 "parsing/parser.ml" in let flag = @@ -14351,24 +14277,24 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3626 "parsing/parser.mly" +# 3768 "parsing/parser.mly" ( not_expecting _loc "nonrec flag" ) -# 14357 "parsing/parser.ml" +# 14283 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 14365 "parsing/parser.ml" +# 14291 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2899 "parsing/parser.mly" +# 3011 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -14377,7 +14303,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 14381 "parsing/parser.ml" +# 14307 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14441,9 +14367,9 @@ module Tables = struct let xs : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs in let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 14447 "parsing/parser.ml" +# 14373 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -14456,9 +14382,9 @@ module Tables = struct Parsetree.type_declaration) = let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 14462 "parsing/parser.ml" +# 14388 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -14467,18 +14393,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 14471 "parsing/parser.ml" +# 14397 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 981 "parsing/parser.mly" ( xs ) -# 14476 "parsing/parser.ml" +# 14402 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 3039 "parsing/parser.mly" ( _1 ) -# 14482 "parsing/parser.ml" +# 14408 "parsing/parser.ml" in let id = @@ -14487,29 +14413,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 14493 "parsing/parser.ml" +# 14419 "parsing/parser.ml" in let flag = -# 3621 "parsing/parser.mly" +# 3763 "parsing/parser.mly" ( Recursive ) -# 14499 "parsing/parser.ml" +# 14425 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 14506 "parsing/parser.ml" +# 14432 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2899 "parsing/parser.mly" +# 3011 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -14518,7 +14444,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 14522 "parsing/parser.ml" +# 14448 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14588,9 +14514,9 @@ module Tables = struct let xs : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs in let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in let _1_inlined3 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 14594 "parsing/parser.ml" +# 14520 "parsing/parser.ml" ) = Obj.magic _1_inlined3 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined2 : unit = Obj.magic _1_inlined2 in @@ -14604,9 +14530,9 @@ module Tables = struct Parsetree.type_declaration) = let attrs2 = let _1 = _1_inlined4 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 14610 "parsing/parser.ml" +# 14536 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -14615,18 +14541,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 14619 "parsing/parser.ml" +# 14545 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 981 "parsing/parser.mly" ( xs ) -# 14624 "parsing/parser.ml" +# 14550 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 3039 "parsing/parser.mly" ( _1 ) -# 14630 "parsing/parser.ml" +# 14556 "parsing/parser.ml" in let id = @@ -14635,29 +14561,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 14641 "parsing/parser.ml" +# 14567 "parsing/parser.ml" in let flag = -# 3622 "parsing/parser.mly" +# 3764 "parsing/parser.mly" ( Nonrecursive ) -# 14647 "parsing/parser.ml" +# 14573 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 14654 "parsing/parser.ml" +# 14580 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2899 "parsing/parser.mly" +# 3011 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -14666,7 +14592,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 14670 "parsing/parser.ml" +# 14596 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14685,17 +14611,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 701 "parsing/parser.mly" +# 781 "parsing/parser.mly" (string) -# 14691 "parsing/parser.ml" +# 14617 "parsing/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 : (Asttypes.label) = -# 3466 "parsing/parser.mly" +# 3608 "parsing/parser.mly" ( _1 ) -# 14699 "parsing/parser.ml" +# 14625 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14714,17 +14640,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 14720 "parsing/parser.ml" +# 14646 "parsing/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 : (Asttypes.label) = -# 3467 "parsing/parser.mly" +# 3609 "parsing/parser.mly" ( _1 ) -# 14728 "parsing/parser.ml" +# 14654 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14754,9 +14680,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.structure) = -# 1072 "parsing/parser.mly" +# 1152 "parsing/parser.mly" ( _1 ) -# 14760 "parsing/parser.ml" +# 14686 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14772,9 +14698,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (string) = -# 3516 "parsing/parser.mly" +# 3658 "parsing/parser.mly" ( "" ) -# 14778 "parsing/parser.ml" +# 14704 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14804,9 +14730,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (string) = -# 3517 "parsing/parser.mly" +# 3659 "parsing/parser.mly" ( ";.." ) -# 14810 "parsing/parser.ml" +# 14736 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14836,9 +14762,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.signature) = -# 1078 "parsing/parser.mly" +# 1158 "parsing/parser.mly" ( _1 ) -# 14842 "parsing/parser.ml" +# 14768 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14882,9 +14808,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.extension) = -# 3801 "parsing/parser.mly" +# 3951 "parsing/parser.mly" ( (_2, _3) ) -# 14888 "parsing/parser.ml" +# 14814 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14903,9 +14829,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 693 "parsing/parser.mly" +# 773 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) -# 14909 "parsing/parser.ml" +# 14835 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -14914,9 +14840,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3803 "parsing/parser.mly" +# 3953 "parsing/parser.mly" ( mk_quotedext ~loc:_sloc _1 ) -# 14920 "parsing/parser.ml" +# 14846 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14962,45 +14888,45 @@ module Tables = struct let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in let _3 : unit = Obj.magic _3 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 14968 "parsing/parser.ml" +# 14894 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in - let _1 : (Asttypes.mutable_flag) = Obj.magic _1 in + let _1 : (Asttypes.mutable_flag * global_flag) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_inlined3_ in let _v : (Parsetree.label_declaration) = let _5 = let _1 = _1_inlined3 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 14979 "parsing/parser.ml" +# 14905 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3219 "parsing/parser.mly" +# 3336 "parsing/parser.mly" ( _1 ) -# 14988 "parsing/parser.ml" +# 14914 "parsing/parser.ml" in let _2 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 14996 "parsing/parser.ml" +# 14922 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 15004 "parsing/parser.ml" +# 14930 "parsing/parser.ml" in let _startpos__2_ = _startpos__1_inlined1_ in @@ -15011,10 +14937,12 @@ module Tables = struct _startpos__2_ in let _sloc = (_symbolstartpos, _endpos) in -# 3096 "parsing/parser.mly" +# 3208 "parsing/parser.mly" ( let info = symbol_info _endpos in - Type.field _2 _4 ~mut:_1 ~attrs:_5 ~loc:(make_loc _sloc) ~info ) -# 15018 "parsing/parser.ml" + let mut, gbl = _1 in + mkld_global_maybe gbl + (Type.field _2 _4 ~mut ~attrs:_5 ~loc:(make_loc _sloc) ~info) ) +# 14946 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15074,54 +15002,54 @@ module Tables = struct let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in let _3 : unit = Obj.magic _3 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 15080 "parsing/parser.ml" +# 15008 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in - let _1 : (Asttypes.mutable_flag) = Obj.magic _1 in + let _1 : (Asttypes.mutable_flag * global_flag) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_inlined4_ in let _v : (Parsetree.label_declaration) = let _7 = let _1 = _1_inlined4 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 15091 "parsing/parser.ml" +# 15019 "parsing/parser.ml" in let _endpos__7_ = _endpos__1_inlined4_ in let _5 = let _1 = _1_inlined3 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 15100 "parsing/parser.ml" +# 15028 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3219 "parsing/parser.mly" +# 3336 "parsing/parser.mly" ( _1 ) -# 15109 "parsing/parser.ml" +# 15037 "parsing/parser.ml" in let _2 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 15117 "parsing/parser.ml" +# 15045 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 15125 "parsing/parser.ml" +# 15053 "parsing/parser.ml" in let _startpos__2_ = _startpos__1_inlined1_ in @@ -15132,14 +15060,16 @@ module Tables = struct _startpos__2_ in let _sloc = (_symbolstartpos, _endpos) in -# 3101 "parsing/parser.mly" +# 3216 "parsing/parser.mly" ( let info = match rhs_info _endpos__5_ with | Some _ as info_before_semi -> info_before_semi | None -> symbol_info _endpos in - Type.field _2 _4 ~mut:_1 ~attrs:(_5 @ _7) ~loc:(make_loc _sloc) ~info ) -# 15143 "parsing/parser.ml" + let mut, gbl = _1 in + mkld_global_maybe gbl + (Type.field _2 _4 ~mut ~attrs:(_5 @ _7) ~loc:(make_loc _sloc) ~info) ) +# 15073 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15162,9 +15092,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.label_declaration list) = -# 3090 "parsing/parser.mly" +# 3202 "parsing/parser.mly" ( [_1] ) -# 15168 "parsing/parser.ml" +# 15098 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15187,9 +15117,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.label_declaration list) = -# 3091 "parsing/parser.mly" +# 3203 "parsing/parser.mly" ( [_1] ) -# 15193 "parsing/parser.ml" +# 15123 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15219,9 +15149,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.label_declaration list) = -# 3092 "parsing/parser.mly" +# 3204 "parsing/parser.mly" ( _1 :: _2 ) -# 15225 "parsing/parser.ml" +# 15155 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15240,9 +15170,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 15246 "parsing/parser.ml" +# 15176 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -15253,24 +15183,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 15259 "parsing/parser.ml" +# 15189 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2129 "parsing/parser.mly" +# 2213 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 15268 "parsing/parser.ml" +# 15198 "parsing/parser.ml" in -# 2121 "parsing/parser.mly" +# 2205 "parsing/parser.mly" ( x ) -# 15274 "parsing/parser.ml" +# 15204 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15303,9 +15233,9 @@ module Tables = struct let cty : (Parsetree.core_type) = Obj.magic cty in let _2 : unit = Obj.magic _2 in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 15309 "parsing/parser.ml" +# 15239 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -15316,18 +15246,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 15322 "parsing/parser.ml" +# 15252 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2129 "parsing/parser.mly" +# 2213 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 15331 "parsing/parser.ml" +# 15261 "parsing/parser.ml" in let _startpos_x_ = _startpos__1_ in @@ -15335,11 +15265,11 @@ module Tables = struct let _symbolstartpos = _startpos_x_ in let _sloc = (_symbolstartpos, _endpos) in -# 2123 "parsing/parser.mly" +# 2207 "parsing/parser.mly" ( let lab, pat = x in lab, mkpat ~loc:_sloc (Ppat_constraint (pat, cty)) ) -# 15343 "parsing/parser.ml" +# 15273 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15362,9 +15292,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3548 "parsing/parser.mly" +# 3690 "parsing/parser.mly" ( _1 ) -# 15368 "parsing/parser.ml" +# 15298 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15387,9 +15317,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.arg_label * Parsetree.expression) = -# 2434 "parsing/parser.mly" +# 2520 "parsing/parser.mly" ( (Nolabel, _1) ) -# 15393 "parsing/parser.ml" +# 15323 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15415,17 +15345,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.expression) = Obj.magic _2 in let _1 : ( -# 638 "parsing/parser.mly" +# 716 "parsing/parser.mly" (string) -# 15421 "parsing/parser.ml" +# 15351 "parsing/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 : (Asttypes.arg_label * Parsetree.expression) = -# 2436 "parsing/parser.mly" +# 2522 "parsing/parser.mly" ( (Labelled _1, _2) ) -# 15429 "parsing/parser.ml" +# 15359 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15450,9 +15380,9 @@ module Tables = struct }; } = _menhir_stack in let label : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 15456 "parsing/parser.ml" +# 15386 "parsing/parser.ml" ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -15460,10 +15390,10 @@ module Tables = struct let _endpos = _endpos_label_ in let _v : (Asttypes.arg_label * Parsetree.expression) = let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2438 "parsing/parser.mly" +# 2524 "parsing/parser.mly" ( let loc = _loc_label_ in (Labelled label, mkexpvar ~loc label) ) -# 15467 "parsing/parser.ml" +# 15397 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15508,9 +15438,9 @@ module Tables = struct let _5 : unit = Obj.magic _5 in let ty : (Parsetree.core_type option * Parsetree.core_type option) = Obj.magic ty in let label : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 15514 "parsing/parser.ml" +# 15444 "parsing/parser.ml" ) = Obj.magic label in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in @@ -15520,10 +15450,10 @@ module Tables = struct let _v : (Asttypes.arg_label * Parsetree.expression) = let _endpos = _endpos__5_ in let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2441 "parsing/parser.mly" +# 2527 "parsing/parser.mly" ( (Labelled label, mkexp_constraint ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_label_ label) ty) ) -# 15527 "parsing/parser.ml" +# 15457 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15548,9 +15478,9 @@ module Tables = struct }; } = _menhir_stack in let label : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 15554 "parsing/parser.ml" +# 15484 "parsing/parser.ml" ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -15558,10 +15488,10 @@ module Tables = struct let _endpos = _endpos_label_ in let _v : (Asttypes.arg_label * Parsetree.expression) = let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2444 "parsing/parser.mly" +# 2530 "parsing/parser.mly" ( let loc = _loc_label_ in (Optional label, mkexpvar ~loc label) ) -# 15565 "parsing/parser.ml" +# 15495 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15587,17 +15517,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.expression) = Obj.magic _2 in let _1 : ( -# 668 "parsing/parser.mly" +# 748 "parsing/parser.mly" (string) -# 15593 "parsing/parser.ml" +# 15523 "parsing/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 : (Asttypes.arg_label * Parsetree.expression) = -# 2447 "parsing/parser.mly" +# 2533 "parsing/parser.mly" ( (Optional _1, _2) ) -# 15601 "parsing/parser.ml" +# 15531 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15610,9 +15540,9 @@ module Tables = struct 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.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; @@ -15620,9 +15550,9 @@ module Tables = struct 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.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -15639,26 +15569,104 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in + let _6 : unit = Obj.magic _6 in let _1_inlined1 : (Parsetree.expression option) = Obj.magic _1_inlined1 in - let _3 : (string * Parsetree.pattern) = Obj.magic _3 in + let _4 : (string * Parsetree.pattern) = Obj.magic _4 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 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _4 = + let _endpos = _endpos__6_ in + let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _5 = let _1 = _1_inlined1 in -# 2117 "parsing/parser.mly" +# 2201 "parsing/parser.mly" ( _1 ) -# 15656 "parsing/parser.ml" +# 15586 "parsing/parser.ml" in + let _3 = +# 3422 "parsing/parser.mly" + ( false ) +# 15592 "parsing/parser.ml" + in -# 2091 "parsing/parser.mly" - ( (Optional (fst _3), _4, snd _3) ) -# 15662 "parsing/parser.ml" +# 2171 "parsing/parser.mly" + ( (Optional (fst _4), _5, mkpat_local_if _3 (snd _4)) ) +# 15597 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 = _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 _1_inlined2 : (Parsetree.expression option) = Obj.magic _1_inlined2 in + let _4 : (string * Parsetree.pattern) = Obj.magic _4 in + let _1_inlined1 : unit = 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__6_ in + let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _5 = + let _1 = _1_inlined2 in + +# 2201 "parsing/parser.mly" + ( _1 ) +# 15659 "parsing/parser.ml" + + in + let _3 = +# 3424 "parsing/parser.mly" + ( true ) +# 15665 "parsing/parser.ml" + in + +# 2171 "parsing/parser.mly" + ( (Optional (fst _4), _5, mkpat_local_if _3 (snd _4)) ) +# 15670 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15683,9 +15691,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 15689 "parsing/parser.ml" +# 15697 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -15698,24 +15706,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 15704 "parsing/parser.ml" +# 15712 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2129 "parsing/parser.mly" +# 2213 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 15713 "parsing/parser.ml" +# 15721 "parsing/parser.ml" in -# 2093 "parsing/parser.mly" +# 2173 "parsing/parser.mly" ( (Optional (fst _2), None, snd _2) ) -# 15719 "parsing/parser.ml" +# 15727 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15728,9 +15736,9 @@ module Tables = struct 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.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; @@ -15738,9 +15746,9 @@ module Tables = struct 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.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -15757,30 +15765,112 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in + let _6 : unit = Obj.magic _6 in let _1_inlined1 : (Parsetree.expression option) = Obj.magic _1_inlined1 in - let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _4 : (Parsetree.pattern) = Obj.magic _4 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 668 "parsing/parser.mly" +# 748 "parsing/parser.mly" (string) -# 15768 "parsing/parser.ml" +# 15776 "parsing/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 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _4 = + let _endpos = _endpos__6_ in + let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _5 = let _1 = _1_inlined1 in -# 2117 "parsing/parser.mly" +# 2201 "parsing/parser.mly" + ( _1 ) +# 15786 "parsing/parser.ml" + + in + let _3 = +# 3422 "parsing/parser.mly" + ( false ) +# 15792 "parsing/parser.ml" + in + +# 2175 "parsing/parser.mly" + ( (Optional _1, _5, mkpat_local_if _3 _4) ) +# 15797 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 = _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 _1_inlined2 : (Parsetree.expression option) = Obj.magic _1_inlined2 in + let _4 : (Parsetree.pattern) = Obj.magic _4 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 748 "parsing/parser.mly" + (string) +# 15853 "parsing/parser.ml" + ) = 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 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _5 = + let _1 = _1_inlined2 in + +# 2201 "parsing/parser.mly" ( _1 ) -# 15778 "parsing/parser.ml" +# 15863 "parsing/parser.ml" in + let _3 = +# 3424 "parsing/parser.mly" + ( true ) +# 15869 "parsing/parser.ml" + in -# 2095 "parsing/parser.mly" - ( (Optional _1, _4, _3) ) -# 15784 "parsing/parser.ml" +# 2175 "parsing/parser.mly" + ( (Optional _1, _5, mkpat_local_if _3 _4) ) +# 15874 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15806,17 +15896,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.pattern) = Obj.magic _2 in let _1 : ( -# 668 "parsing/parser.mly" +# 748 "parsing/parser.mly" (string) -# 15812 "parsing/parser.ml" +# 15902 "parsing/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 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2097 "parsing/parser.mly" +# 2177 "parsing/parser.mly" ( (Optional _1, None, _2) ) -# 15820 "parsing/parser.ml" +# 15910 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15829,14 +15919,14 @@ module Tables = struct 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.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.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -15852,17 +15942,80 @@ module Tables = struct }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (string * Parsetree.pattern) = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let _4 : (string * Parsetree.pattern) = Obj.magic _4 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 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2099 "parsing/parser.mly" - ( (Labelled (fst _3), None, snd _3) ) -# 15866 "parsing/parser.ml" + let _endpos = _endpos__5_ in + let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _3 = +# 3422 "parsing/parser.mly" + ( false ) +# 15956 "parsing/parser.ml" + in + +# 2179 "parsing/parser.mly" + ( (Labelled (fst _4), None, mkpat_local_if _3 (snd _4)) ) +# 15961 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 : unit = Obj.magic _5 in + let _4 : (string * Parsetree.pattern) = Obj.magic _4 in + let _1_inlined1 : unit = 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__5_ in + let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _3 = +# 3424 "parsing/parser.mly" + ( true ) +# 16014 "parsing/parser.ml" + in + +# 2179 "parsing/parser.mly" + ( (Labelled (fst _4), None, mkpat_local_if _3 (snd _4)) ) +# 16019 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15887,9 +16040,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 15893 "parsing/parser.ml" +# 16046 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -15902,24 +16055,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 15908 "parsing/parser.ml" +# 16061 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2129 "parsing/parser.mly" +# 2213 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 15917 "parsing/parser.ml" +# 16070 "parsing/parser.ml" in -# 2101 "parsing/parser.mly" +# 2181 "parsing/parser.mly" ( (Labelled (fst _2), None, snd _2) ) -# 15923 "parsing/parser.ml" +# 16076 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15945,17 +16098,74 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.pattern) = Obj.magic _2 in let _1 : ( -# 638 "parsing/parser.mly" +# 716 "parsing/parser.mly" (string) -# 15951 "parsing/parser.ml" +# 16104 "parsing/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 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2103 "parsing/parser.mly" +# 2183 "parsing/parser.mly" ( (Labelled _1, None, _2) ) -# 15959 "parsing/parser.ml" +# 16112 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 : (Parsetree.pattern) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 716 "parsing/parser.mly" + (string) +# 16161 "parsing/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 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = +# 2185 "parsing/parser.mly" + ( (Labelled _1, None, mkpat_stack _4) ) +# 16169 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15978,9 +16188,55 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2105 "parsing/parser.mly" +# 2187 "parsing/parser.mly" ( (Nolabel, None, _1) ) -# 15984 "parsing/parser.ml" +# 16194 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 : (Parsetree.pattern) = 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 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = +# 2189 "parsing/parser.mly" + ( (Nolabel, None, mkpat_stack _3) ) +# 16240 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16014,15 +16270,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2454 "parsing/parser.mly" +# 2540 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 16020 "parsing/parser.ml" +# 16276 "parsing/parser.ml" in -# 2458 "parsing/parser.mly" +# 2544 "parsing/parser.mly" ( (_1, _2) ) -# 16026 "parsing/parser.ml" +# 16282 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16035,19 +16291,19 @@ module Tables = struct 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.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.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.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -16058,41 +16314,57 @@ module Tables = struct }; }; } = _menhir_stack in - let _4 : (Parsetree.expression) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.core_type option * Parsetree.core_type option) = Obj.magic _2 in + let _5 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.core_type option * Parsetree.core_type option) = Obj.magic _3 in let _1 : (Asttypes.label) = 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 : (Parsetree.pattern * Parsetree.expression) = let _1 = + let _endpos = _endpos__5_ in + let _v : (Parsetree.pattern * Parsetree.expression) = let _2 = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2454 "parsing/parser.mly" +# 2540 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 16076 "parsing/parser.ml" +# 16332 "parsing/parser.ml" in - let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in + let _startpos__2_ = _startpos__1_ in + let _1 = +# 3422 "parsing/parser.mly" + ( false ) +# 16339 "parsing/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 let _sloc = (_symbolstartpos, _endpos) in -# 2460 "parsing/parser.mly" - ( let v = _1 in (* PR#7344 *) +# 2546 "parsing/parser.mly" + ( let v = _2 in (* PR#7344 *) let t = - match _2 with + match _3 with Some t, None -> t | _, Some t -> t | _ -> assert false in let loc = Location.(t.ptyp_loc.loc_start, t.ptyp_loc.loc_end) in let typ = ghtyp ~loc (Ptyp_poly([],t)) in - let patloc = (_startpos__1_, _endpos__2_) in - (ghpat ~loc:patloc (Ppat_constraint(v, typ)), - mkexp_constraint ~loc:_sloc _4 _2) ) -# 16096 "parsing/parser.ml" + let patloc = (_startpos__2_, _endpos__3_) in + let pat = + mkpat_local_if _1 (ghpat ~loc:patloc (Ppat_constraint(v, typ))) + in + let exp = + mkexp_local_if _1 ~loc:_sloc + (wrap_exp_local_if _1 (mkexp_constraint ~loc:_sloc _5 _3)) + in + (pat, exp) ) +# 16368 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16105,24 +16377,117 @@ module Tables = struct 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.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + 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 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.core_type option * Parsetree.core_type option) = Obj.magic _3 in + let _1_inlined1 : (Asttypes.label) = 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__5_ in + let _v : (Parsetree.pattern * Parsetree.expression) = let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2540 "parsing/parser.mly" + ( mkpatvar ~loc:_sloc _1 ) +# 16426 "parsing/parser.ml" + + in + let _startpos__2_ = _startpos__1_inlined1_ in + let _1 = +# 3424 "parsing/parser.mly" + ( true ) +# 16433 "parsing/parser.ml" + in + let _endpos = _endpos__5_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2546 "parsing/parser.mly" + ( let v = _2 in (* PR#7344 *) + let t = + match _3 with + Some t, None -> t + | _, Some t -> t + | _ -> assert false + in + let loc = Location.(t.ptyp_loc.loc_start, t.ptyp_loc.loc_end) in + let typ = ghtyp ~loc (Ptyp_poly([],t)) in + let patloc = (_startpos__2_, _endpos__3_) in + let pat = + mkpat_local_if _1 (ghpat ~loc:patloc (Ppat_constraint(v, typ))) + in + let exp = + mkexp_local_if _1 ~loc:_sloc + (wrap_exp_local_if _1 (mkexp_constraint ~loc:_sloc _5 _3)) + in + (pat, exp) ) +# 16461 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 = xs; @@ -16130,9 +16495,9 @@ module Tables = struct 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.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -16146,54 +16511,71 @@ module Tables = struct }; }; } = _menhir_stack in - let _7 : (Parsetree.expression) = Obj.magic _7 in - let _6 : unit = Obj.magic _6 in - let _5 : (Parsetree.core_type) = Obj.magic _5 in - let _4 : unit = Obj.magic _4 in + let _8 : (Parsetree.expression) = Obj.magic _8 in + let _7 : unit = Obj.magic _7 in + let _6 : (Parsetree.core_type) = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in let xs : (Asttypes.label Asttypes.loc list) = Obj.magic xs in - let _2 : unit = Obj.magic _2 in + let _3 : unit = Obj.magic _3 in let _1 : (Asttypes.label) = 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 : (Parsetree.pattern * Parsetree.expression) = let _3 = + let _endpos = _endpos__8_ in + let _v : (Parsetree.pattern * Parsetree.expression) = let _4 = let _1 = let xs = # 253 "" ( List.rev xs ) -# 16165 "parsing/parser.ml" +# 16530 "parsing/parser.ml" in -# 919 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( xs ) -# 16170 "parsing/parser.ml" +# 16535 "parsing/parser.ml" in -# 3201 "parsing/parser.mly" +# 3318 "parsing/parser.mly" ( _1 ) -# 16176 "parsing/parser.ml" +# 16541 "parsing/parser.ml" in - let _startpos__3_ = _startpos_xs_ in - let _1 = + let _startpos__4_ = _startpos_xs_ in + let _2 = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2454 "parsing/parser.mly" +# 2540 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 16187 "parsing/parser.ml" +# 16552 "parsing/parser.ml" in + let _startpos__2_ = _startpos__1_ in + let _1 = +# 3422 "parsing/parser.mly" + ( false ) +# 16559 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in + let _endpos = _endpos__8_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2476 "parsing/parser.mly" - ( let typloc = (_startpos__3_, _endpos__5_) in - let patloc = (_startpos__1_, _endpos__5_) in - (ghpat ~loc:patloc - (Ppat_constraint(_1, ghtyp ~loc:typloc (Ptyp_poly(_3,_5)))), - _7) ) -# 16197 "parsing/parser.ml" +# 2568 "parsing/parser.mly" + ( let typloc = (_startpos__4_, _endpos__6_) in + let patloc = (_startpos__2_, _endpos__6_) in + let pat = + mkpat_local_if _1 + (ghpat ~loc:patloc + (Ppat_constraint(_2, ghtyp ~loc:typloc (Ptyp_poly(_4,_6))))) + in + let exp = mkexp_local_if _1 ~loc:_sloc _8 in + (pat, exp) ) +# 16579 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16236,9 +16618,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + 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; @@ -16257,38 +16639,68 @@ module Tables = struct let _7 : unit = Obj.magic _7 in let _6 : (Parsetree.core_type) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in - let xs : (string Asttypes.loc list) = Obj.magic xs in + let xs : (Asttypes.label Asttypes.loc list) = Obj.magic xs in let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Asttypes.label) = Obj.magic _1 in + let _1_inlined1 : (Asttypes.label) = 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__8_ in - let _v : (Parsetree.pattern * Parsetree.expression) = let _4 = -# 2451 "parsing/parser.mly" + let _v : (Parsetree.pattern * Parsetree.expression) = let _4 = + let _1 = + let xs = +# 253 "" + ( List.rev xs ) +# 16655 "parsing/parser.ml" + in + +# 999 "parsing/parser.mly" ( xs ) -# 16271 "parsing/parser.ml" - in - let _1 = +# 16660 "parsing/parser.ml" + + in + +# 3318 "parsing/parser.mly" + ( _1 ) +# 16666 "parsing/parser.ml" + + in + let _startpos__4_ = _startpos_xs_ in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2454 "parsing/parser.mly" +# 2540 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 16280 "parsing/parser.ml" +# 16678 "parsing/parser.ml" in + let _startpos__2_ = _startpos__1_inlined1_ in + let _1 = +# 3424 "parsing/parser.mly" + ( true ) +# 16685 "parsing/parser.ml" + in let _endpos = _endpos__8_ in - let _symbolstartpos = _startpos__1_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + _startpos__2_ in let _sloc = (_symbolstartpos, _endpos) in -# 2482 "parsing/parser.mly" - ( let exp, poly = - wrap_type_annotation ~loc:_sloc _4 _6 _8 in - let loc = (_startpos__1_, _endpos__6_) in - (ghpat ~loc (Ppat_constraint(_1, poly)), exp) ) -# 16292 "parsing/parser.ml" +# 2568 "parsing/parser.mly" + ( let typloc = (_startpos__4_, _endpos__6_) in + let patloc = (_startpos__2_, _endpos__6_) in + let pat = + mkpat_local_if _1 + (ghpat ~loc:patloc + (Ppat_constraint(_2, ghtyp ~loc:typloc (Ptyp_poly(_4,_6))))) + in + let exp = mkexp_local_if _1 ~loc:_sloc _8 in + (pat, exp) ) +# 16704 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16301,34 +16713,129 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _8; + MenhirLib.EngineTypes.startp = _startpos__8_; + MenhirLib.EngineTypes.endp = _endpos__8_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : (Parsetree.expression) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.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 : (Parsetree.pattern * Parsetree.expression) = -# 2487 "parsing/parser.mly" - ( (_1, _3) ) -# 16331 "parsing/parser.ml" - in + 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 = 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 _8 : (Parsetree.expression) = Obj.magic _8 in + let _7 : unit = Obj.magic _7 in + let _6 : (Parsetree.core_type) = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let xs : (string Asttypes.loc list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Asttypes.label) = 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 : (Parsetree.pattern * Parsetree.expression) = let _4 = +# 2537 "parsing/parser.mly" + ( xs ) +# 16778 "parsing/parser.ml" + in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2540 "parsing/parser.mly" + ( mkpatvar ~loc:_sloc _1 ) +# 16787 "parsing/parser.ml" + + in + let _endpos = _endpos__8_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2578 "parsing/parser.mly" + ( let exp, poly = + wrap_type_annotation ~loc:_sloc _4 _6 _8 in + let loc = (_startpos__1_, _endpos__6_) in + (ghpat ~loc (Ppat_constraint(_1, poly)), exp) ) +# 16799 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.expression) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.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 : (Parsetree.pattern * Parsetree.expression) = +# 2583 "parsing/parser.mly" + ( (_1, _3) ) +# 16838 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -16378,10 +16885,63 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Parsetree.pattern * Parsetree.expression) = -# 2489 "parsing/parser.mly" +# 2585 "parsing/parser.mly" ( let loc = (_startpos__1_, _endpos__3_) in (ghpat ~loc (Ppat_constraint(_1, _3)), _5) ) -# 16385 "parsing/parser.ml" +# 16892 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.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 : (Parsetree.expression) = Obj.magic _3 in + let _1_inlined1 : (Asttypes.label) = 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 : (Parsetree.pattern * Parsetree.expression) = let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2540 "parsing/parser.mly" + ( mkpatvar ~loc:_sloc _1 ) +# 16936 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2588 "parsing/parser.mly" + ( (_2, mkexp_stack ~loc:_sloc _3) ) +# 16945 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16442,36 +17002,36 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 16448 "parsing/parser.ml" +# 17008 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 16457 "parsing/parser.ml" +# 17017 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2505 "parsing/parser.mly" +# 2603 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in mklbs ~loc:_sloc ext rec_flag (mklb ~loc:_sloc true body attrs) ) -# 16469 "parsing/parser.ml" +# 17029 "parsing/parser.ml" in -# 2495 "parsing/parser.mly" +# 2593 "parsing/parser.mly" ( _1 ) -# 16475 "parsing/parser.ml" +# 17035 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16501,9 +17061,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (let_bindings) = -# 2496 "parsing/parser.mly" +# 2594 "parsing/parser.mly" ( addlb _1 _2 ) -# 16507 "parsing/parser.ml" +# 17067 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16557,41 +17117,41 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 16563 "parsing/parser.ml" +# 17123 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 16572 "parsing/parser.ml" +# 17132 "parsing/parser.ml" in let ext = -# 3789 "parsing/parser.mly" +# 3939 "parsing/parser.mly" ( None ) -# 16578 "parsing/parser.ml" +# 17138 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2505 "parsing/parser.mly" +# 2603 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in mklbs ~loc:_sloc ext rec_flag (mklb ~loc:_sloc true body attrs) ) -# 16589 "parsing/parser.ml" +# 17149 "parsing/parser.ml" in -# 2495 "parsing/parser.mly" +# 2593 "parsing/parser.mly" ( _1 ) -# 16595 "parsing/parser.ml" +# 17155 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16659,18 +17219,18 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 16665 "parsing/parser.ml" +# 17225 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let attrs1 = let _1 = _1_inlined2 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 16674 "parsing/parser.ml" +# 17234 "parsing/parser.ml" in let ext = @@ -16679,27 +17239,27 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3790 "parsing/parser.mly" +# 3940 "parsing/parser.mly" ( not_expecting _loc "extension" ) -# 16685 "parsing/parser.ml" +# 17245 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2505 "parsing/parser.mly" +# 2603 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in mklbs ~loc:_sloc ext rec_flag (mklb ~loc:_sloc true body attrs) ) -# 16697 "parsing/parser.ml" +# 17257 "parsing/parser.ml" in -# 2495 "parsing/parser.mly" +# 2593 "parsing/parser.mly" ( _1 ) -# 16703 "parsing/parser.ml" +# 17263 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16729,9 +17289,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (let_bindings) = -# 2496 "parsing/parser.mly" +# 2594 "parsing/parser.mly" ( addlb _1 _2 ) -# 16735 "parsing/parser.ml" +# 17295 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16754,9 +17314,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2133 "parsing/parser.mly" +# 2217 "parsing/parser.mly" ( _1 ) -# 16760 "parsing/parser.ml" +# 17320 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16794,24 +17354,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2135 "parsing/parser.mly" +# 2219 "parsing/parser.mly" ( Ppat_constraint(_1, _3) ) -# 16800 "parsing/parser.ml" +# 17360 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 16809 "parsing/parser.ml" +# 17369 "parsing/parser.ml" in -# 2136 "parsing/parser.mly" +# 2220 "parsing/parser.mly" ( _1 ) -# 16815 "parsing/parser.ml" +# 17375 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16845,15 +17405,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2454 "parsing/parser.mly" +# 2540 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 16851 "parsing/parser.ml" +# 17411 "parsing/parser.ml" in -# 2522 "parsing/parser.mly" +# 2620 "parsing/parser.mly" ( (pat, exp) ) -# 16857 "parsing/parser.ml" +# 17417 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16904,10 +17464,10 @@ module Tables = struct let _startpos = _startpos_pat_ in let _endpos = _endpos_exp_ in let _v : (Parsetree.pattern * Parsetree.expression) = -# 2524 "parsing/parser.mly" +# 2622 "parsing/parser.mly" ( let loc = (_startpos_pat_, _endpos_typ_) in (ghpat ~loc (Ppat_constraint(pat, typ)), exp) ) -# 16911 "parsing/parser.ml" +# 17471 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16944,9 +17504,9 @@ module Tables = struct let _startpos = _startpos_pat_ in let _endpos = _endpos_exp_ in let _v : (Parsetree.pattern * Parsetree.expression) = -# 2527 "parsing/parser.mly" +# 2625 "parsing/parser.mly" ( (pat, exp) ) -# 16950 "parsing/parser.ml" +# 17510 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16969,10 +17529,10 @@ module Tables = struct let _startpos = _startpos_body_ in let _endpos = _endpos_body_ in let _v : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = -# 2531 "parsing/parser.mly" +# 2629 "parsing/parser.mly" ( let let_pat, let_exp = body in let_pat, let_exp, [] ) -# 16976 "parsing/parser.ml" +# 17536 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17004,9 +17564,9 @@ module Tables = struct } = _menhir_stack in let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in let _1 : ( -# 634 "parsing/parser.mly" +# 712 "parsing/parser.mly" (string) -# 17010 "parsing/parser.ml" +# 17570 "parsing/parser.ml" ) = Obj.magic _1 in let bindings : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = Obj.magic bindings in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -17017,22 +17577,22 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17023 "parsing/parser.ml" +# 17583 "parsing/parser.ml" in let _endpos = _endpos_body_ in let _symbolstartpos = _startpos_bindings_ in let _sloc = (_symbolstartpos, _endpos) in -# 2534 "parsing/parser.mly" +# 2632 "parsing/parser.mly" ( let let_pat, let_exp, rev_ands = bindings in let pbop_pat, pbop_exp = body in let pbop_loc = make_loc _sloc in let and_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in let_pat, let_exp, and_ :: rev_ands ) -# 17036 "parsing/parser.ml" +# 17596 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17050,7 +17610,7 @@ module Tables = struct let _v : (Parsetree.class_declaration list) = # 211 "" ( [] ) -# 17054 "parsing/parser.ml" +# 17614 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17114,9 +17674,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in let body : (Parsetree.class_expr) = Obj.magic body in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 17120 "parsing/parser.ml" +# 17680 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -17129,9 +17689,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 17135 "parsing/parser.ml" +# 17695 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -17141,24 +17701,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17147 "parsing/parser.ml" +# 17707 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 17155 "parsing/parser.ml" +# 17715 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1737 "parsing/parser.mly" +# 1817 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -17166,13 +17726,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Ci.mk id body ~virt ~params ~attrs ~loc ~text ~docs ) -# 17170 "parsing/parser.ml" +# 17730 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17176 "parsing/parser.ml" +# 17736 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17190,7 +17750,7 @@ module Tables = struct let _v : (Parsetree.class_description list) = # 211 "" ( [] ) -# 17194 "parsing/parser.ml" +# 17754 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17261,9 +17821,9 @@ module Tables = struct let cty : (Parsetree.class_type) = Obj.magic cty in let _6 : unit = Obj.magic _6 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 17267 "parsing/parser.ml" +# 17827 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -17276,9 +17836,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 17282 "parsing/parser.ml" +# 17842 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -17288,24 +17848,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17294 "parsing/parser.ml" +# 17854 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 17302 "parsing/parser.ml" +# 17862 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2028 "parsing/parser.mly" +# 2108 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -17313,13 +17873,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Ci.mk id cty ~virt ~params ~attrs ~loc ~text ~docs ) -# 17317 "parsing/parser.ml" +# 17877 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17323 "parsing/parser.ml" +# 17883 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17337,7 +17897,7 @@ module Tables = struct let _v : (Parsetree.class_type_declaration list) = # 211 "" ( [] ) -# 17341 "parsing/parser.ml" +# 17901 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17408,9 +17968,9 @@ module Tables = struct let csig : (Parsetree.class_type) = Obj.magic csig in let _6 : unit = Obj.magic _6 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 17414 "parsing/parser.ml" +# 17974 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -17423,9 +17983,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 17429 "parsing/parser.ml" +# 17989 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -17435,24 +17995,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17441 "parsing/parser.ml" +# 18001 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 17449 "parsing/parser.ml" +# 18009 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2067 "parsing/parser.mly" +# 2147 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -17460,13 +18020,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Ci.mk id csig ~virt ~params ~attrs ~loc ~text ~docs ) -# 17464 "parsing/parser.ml" +# 18024 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17470 "parsing/parser.ml" +# 18030 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17484,7 +18044,7 @@ module Tables = struct let _v : (Parsetree.module_binding list) = # 211 "" ( [] ) -# 17488 "parsing/parser.ml" +# 18048 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17545,9 +18105,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 17551 "parsing/parser.ml" +# 18111 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -17557,24 +18117,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17563 "parsing/parser.ml" +# 18123 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 17571 "parsing/parser.ml" +# 18131 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1418 "parsing/parser.mly" +# 1498 "parsing/parser.mly" ( let loc = make_loc _sloc in let attrs = attrs1 @ attrs2 in @@ -17582,13 +18142,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Mb.mk name body ~attrs ~loc ~text ~docs ) -# 17586 "parsing/parser.ml" +# 18146 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17592 "parsing/parser.ml" +# 18152 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17606,7 +18166,7 @@ module Tables = struct let _v : (Parsetree.module_declaration list) = # 211 "" ( [] ) -# 17610 "parsing/parser.ml" +# 18170 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17674,9 +18234,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 17680 "parsing/parser.ml" +# 18240 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -17686,24 +18246,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17692 "parsing/parser.ml" +# 18252 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 17700 "parsing/parser.ml" +# 18260 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1695 "parsing/parser.mly" +# 1775 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let docs = symbol_docs _sloc in @@ -17711,13 +18271,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Md.mk name mty ~attrs ~loc ~text ~docs ) -# 17715 "parsing/parser.ml" +# 18275 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17721 "parsing/parser.ml" +# 18281 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17735,7 +18295,7 @@ module Tables = struct let _v : (Parsetree.attributes) = # 211 "" ( [] ) -# 17739 "parsing/parser.ml" +# 18299 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17767,7 +18327,7 @@ module Tables = struct let _v : (Parsetree.attributes) = # 213 "" ( x :: xs ) -# 17771 "parsing/parser.ml" +# 18331 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17785,7 +18345,7 @@ module Tables = struct let _v : (Parsetree.type_declaration list) = # 211 "" ( [] ) -# 17789 "parsing/parser.ml" +# 18349 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17850,9 +18410,9 @@ module Tables = struct let xs_inlined1 : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs_inlined1 in let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 17856 "parsing/parser.ml" +# 18416 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -17865,9 +18425,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 17871 "parsing/parser.ml" +# 18431 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -17876,18 +18436,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 17880 "parsing/parser.ml" +# 18440 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 981 "parsing/parser.mly" ( xs ) -# 17885 "parsing/parser.ml" +# 18445 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 3039 "parsing/parser.mly" ( _1 ) -# 17891 "parsing/parser.ml" +# 18451 "parsing/parser.ml" in let id = @@ -17896,24 +18456,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17902 "parsing/parser.ml" +# 18462 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 17910 "parsing/parser.ml" +# 18470 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2916 "parsing/parser.mly" +# 3028 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -17922,13 +18482,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ~text ) -# 17926 "parsing/parser.ml" +# 18486 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17932 "parsing/parser.ml" +# 18492 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17946,7 +18506,7 @@ module Tables = struct let _v : (Parsetree.type_declaration list) = # 211 "" ( [] ) -# 17950 "parsing/parser.ml" +# 18510 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18018,9 +18578,9 @@ module Tables = struct let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 18024 "parsing/parser.ml" +# 18584 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -18033,9 +18593,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 18039 "parsing/parser.ml" +# 18599 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -18044,24 +18604,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 18048 "parsing/parser.ml" +# 18608 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 981 "parsing/parser.mly" ( xs ) -# 18053 "parsing/parser.ml" +# 18613 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 3039 "parsing/parser.mly" ( _1 ) -# 18059 "parsing/parser.ml" +# 18619 "parsing/parser.ml" in let kind_priv_manifest = -# 2962 "parsing/parser.mly" +# 3074 "parsing/parser.mly" ( _2 ) -# 18065 "parsing/parser.ml" +# 18625 "parsing/parser.ml" in let id = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in @@ -18069,24 +18629,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 18075 "parsing/parser.ml" +# 18635 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 18083 "parsing/parser.ml" +# 18643 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2916 "parsing/parser.mly" +# 3028 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -18095,13 +18655,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ~text ) -# 18099 "parsing/parser.ml" +# 18659 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18105 "parsing/parser.ml" +# 18665 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18119,7 +18679,7 @@ module Tables = struct let _v : (Parsetree.attributes) = # 211 "" ( [] ) -# 18123 "parsing/parser.ml" +# 18683 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18151,7 +18711,7 @@ module Tables = struct let _v : (Parsetree.attributes) = # 213 "" ( x :: xs ) -# 18155 "parsing/parser.ml" +# 18715 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18169,7 +18729,7 @@ module Tables = struct let _v : (Parsetree.signature_item list list) = # 211 "" ( [] ) -# 18173 "parsing/parser.ml" +# 18733 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18202,21 +18762,21 @@ module Tables = struct let _1 = let _startpos = _startpos__1_ in -# 827 "parsing/parser.mly" +# 907 "parsing/parser.mly" ( text_sig _startpos ) -# 18208 "parsing/parser.ml" +# 18768 "parsing/parser.ml" in -# 1556 "parsing/parser.mly" +# 1636 "parsing/parser.mly" ( _1 ) -# 18214 "parsing/parser.ml" +# 18774 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18220 "parsing/parser.ml" +# 18780 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18249,21 +18809,21 @@ module Tables = struct let _1 = let _startpos = _startpos__1_ in -# 825 "parsing/parser.mly" +# 905 "parsing/parser.mly" ( text_sig _startpos @ [_1] ) -# 18255 "parsing/parser.ml" +# 18815 "parsing/parser.ml" in -# 1556 "parsing/parser.mly" +# 1636 "parsing/parser.mly" ( _1 ) -# 18261 "parsing/parser.ml" +# 18821 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18267 "parsing/parser.ml" +# 18827 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18281,7 +18841,7 @@ module Tables = struct let _v : (Parsetree.structure_item list list) = # 211 "" ( [] ) -# 18285 "parsing/parser.ml" +# 18845 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18314,40 +18874,40 @@ module Tables = struct let _1 = let ys = let items = -# 887 "parsing/parser.mly" +# 967 "parsing/parser.mly" ( [] ) -# 18320 "parsing/parser.ml" +# 18880 "parsing/parser.ml" in -# 1301 "parsing/parser.mly" +# 1381 "parsing/parser.mly" ( items ) -# 18325 "parsing/parser.ml" +# 18885 "parsing/parser.ml" in let xs = let _startpos = _startpos__1_ in -# 823 "parsing/parser.mly" +# 903 "parsing/parser.mly" ( text_str _startpos ) -# 18333 "parsing/parser.ml" +# 18893 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 18339 "parsing/parser.ml" +# 18899 "parsing/parser.ml" in -# 1317 "parsing/parser.mly" +# 1397 "parsing/parser.mly" ( _1 ) -# 18345 "parsing/parser.ml" +# 18905 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18351 "parsing/parser.ml" +# 18911 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18399,70 +18959,70 @@ module Tables = struct let _1 = let _1 = let attrs = -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 18405 "parsing/parser.ml" +# 18965 "parsing/parser.ml" in -# 1308 "parsing/parser.mly" +# 1388 "parsing/parser.mly" ( mkstrexp e attrs ) -# 18410 "parsing/parser.ml" +# 18970 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 821 "parsing/parser.mly" +# 901 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 18418 "parsing/parser.ml" +# 18978 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 840 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mark_rhs_docs _startpos _endpos; _1 ) -# 18428 "parsing/parser.ml" +# 18988 "parsing/parser.ml" in -# 889 "parsing/parser.mly" +# 969 "parsing/parser.mly" ( x ) -# 18434 "parsing/parser.ml" +# 18994 "parsing/parser.ml" in -# 1301 "parsing/parser.mly" +# 1381 "parsing/parser.mly" ( items ) -# 18440 "parsing/parser.ml" +# 19000 "parsing/parser.ml" in let xs = let _startpos = _startpos__1_ in -# 823 "parsing/parser.mly" +# 903 "parsing/parser.mly" ( text_str _startpos ) -# 18448 "parsing/parser.ml" +# 19008 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 18454 "parsing/parser.ml" +# 19014 "parsing/parser.ml" in -# 1317 "parsing/parser.mly" +# 1397 "parsing/parser.mly" ( _1 ) -# 18460 "parsing/parser.ml" +# 19020 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18466 "parsing/parser.ml" +# 19026 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18495,21 +19055,21 @@ module Tables = struct let _1 = let _startpos = _startpos__1_ in -# 821 "parsing/parser.mly" +# 901 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 18501 "parsing/parser.ml" +# 19061 "parsing/parser.ml" in -# 1317 "parsing/parser.mly" +# 1397 "parsing/parser.mly" ( _1 ) -# 18507 "parsing/parser.ml" +# 19067 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18513 "parsing/parser.ml" +# 19073 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18527,7 +19087,7 @@ module Tables = struct let _v : (Parsetree.class_type_field list list) = # 211 "" ( [] ) -# 18531 "parsing/parser.ml" +# 19091 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18559,15 +19119,15 @@ module Tables = struct let _v : (Parsetree.class_type_field list list) = let x = let _startpos = _startpos__1_ in -# 835 "parsing/parser.mly" +# 915 "parsing/parser.mly" ( text_csig _startpos @ [_1] ) -# 18565 "parsing/parser.ml" +# 19125 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18571 "parsing/parser.ml" +# 19131 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18585,7 +19145,7 @@ module Tables = struct let _v : (Parsetree.class_field list list) = # 211 "" ( [] ) -# 18589 "parsing/parser.ml" +# 19149 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18617,15 +19177,15 @@ module Tables = struct let _v : (Parsetree.class_field list list) = let x = let _startpos = _startpos__1_ in -# 833 "parsing/parser.mly" +# 913 "parsing/parser.mly" ( text_cstr _startpos @ [_1] ) -# 18623 "parsing/parser.ml" +# 19183 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18629 "parsing/parser.ml" +# 19189 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18643,7 +19203,7 @@ module Tables = struct let _v : (Parsetree.structure_item list list) = # 211 "" ( [] ) -# 18647 "parsing/parser.ml" +# 19207 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18675,15 +19235,15 @@ module Tables = struct let _v : (Parsetree.structure_item list list) = let x = let _startpos = _startpos__1_ in -# 821 "parsing/parser.mly" +# 901 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 18681 "parsing/parser.ml" +# 19241 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18687 "parsing/parser.ml" +# 19247 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18701,7 +19261,7 @@ module Tables = struct let _v : (Parsetree.toplevel_phrase list list) = # 211 "" ( [] ) -# 18705 "parsing/parser.ml" +# 19265 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18734,32 +19294,32 @@ module Tables = struct let _1 = let x = let _1 = -# 887 "parsing/parser.mly" +# 967 "parsing/parser.mly" ( [] ) -# 18740 "parsing/parser.ml" +# 19300 "parsing/parser.ml" in -# 1117 "parsing/parser.mly" +# 1197 "parsing/parser.mly" ( _1 ) -# 18745 "parsing/parser.ml" +# 19305 "parsing/parser.ml" in # 183 "" ( x ) -# 18751 "parsing/parser.ml" +# 19311 "parsing/parser.ml" in -# 1129 "parsing/parser.mly" +# 1209 "parsing/parser.mly" ( _1 ) -# 18757 "parsing/parser.ml" +# 19317 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18763 "parsing/parser.ml" +# 19323 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18811,58 +19371,58 @@ module Tables = struct let _1 = let _1 = let attrs = -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 18817 "parsing/parser.ml" +# 19377 "parsing/parser.ml" in -# 1308 "parsing/parser.mly" +# 1388 "parsing/parser.mly" ( mkstrexp e attrs ) -# 18822 "parsing/parser.ml" +# 19382 "parsing/parser.ml" in -# 831 "parsing/parser.mly" +# 911 "parsing/parser.mly" ( Ptop_def [_1] ) -# 18828 "parsing/parser.ml" +# 19388 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 829 "parsing/parser.mly" +# 909 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 18836 "parsing/parser.ml" +# 19396 "parsing/parser.ml" in -# 889 "parsing/parser.mly" +# 969 "parsing/parser.mly" ( x ) -# 18842 "parsing/parser.ml" +# 19402 "parsing/parser.ml" in -# 1117 "parsing/parser.mly" +# 1197 "parsing/parser.mly" ( _1 ) -# 18848 "parsing/parser.ml" +# 19408 "parsing/parser.ml" in # 183 "" ( x ) -# 18854 "parsing/parser.ml" +# 19414 "parsing/parser.ml" in -# 1129 "parsing/parser.mly" +# 1209 "parsing/parser.mly" ( _1 ) -# 18860 "parsing/parser.ml" +# 19420 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18866 "parsing/parser.ml" +# 19426 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18894,27 +19454,27 @@ module Tables = struct let _v : (Parsetree.toplevel_phrase list list) = let x = let _1 = let _1 = -# 831 "parsing/parser.mly" +# 911 "parsing/parser.mly" ( Ptop_def [_1] ) -# 18900 "parsing/parser.ml" +# 19460 "parsing/parser.ml" in let _startpos = _startpos__1_ in -# 829 "parsing/parser.mly" +# 909 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 18906 "parsing/parser.ml" +# 19466 "parsing/parser.ml" in -# 1129 "parsing/parser.mly" +# 1209 "parsing/parser.mly" ( _1 ) -# 18912 "parsing/parser.ml" +# 19472 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18918 "parsing/parser.ml" +# 19478 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18949,29 +19509,29 @@ module Tables = struct let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 840 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mark_rhs_docs _startpos _endpos; _1 ) -# 18956 "parsing/parser.ml" +# 19516 "parsing/parser.ml" in let _startpos = _startpos__1_ in -# 829 "parsing/parser.mly" +# 909 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 18963 "parsing/parser.ml" +# 19523 "parsing/parser.ml" in -# 1129 "parsing/parser.mly" +# 1209 "parsing/parser.mly" ( _1 ) -# 18969 "parsing/parser.ml" +# 19529 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18975 "parsing/parser.ml" +# 19535 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19010,7 +19570,7 @@ module Tables = struct let _v : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = let _2 = # 124 "" ( None ) -# 19014 "parsing/parser.ml" +# 19574 "parsing/parser.ml" in let x = let label = @@ -19018,9 +19578,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19024 "parsing/parser.ml" +# 19584 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -19028,7 +19588,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2802 "parsing/parser.mly" +# 2914 "parsing/parser.mly" ( let label, pat = match opat with | None -> @@ -19042,13 +19602,13 @@ module Tables = struct in label, mkpat_opt_constraint ~loc:_sloc pat octy ) -# 19046 "parsing/parser.ml" +# 19606 "parsing/parser.ml" in -# 1056 "parsing/parser.mly" +# 1136 "parsing/parser.mly" ( [x], None ) -# 19052 "parsing/parser.ml" +# 19612 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19094,7 +19654,7 @@ module Tables = struct let _v : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = let _2 = # 126 "" ( Some x ) -# 19098 "parsing/parser.ml" +# 19658 "parsing/parser.ml" in let x = let label = @@ -19102,9 +19662,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19108 "parsing/parser.ml" +# 19668 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -19112,7 +19672,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2802 "parsing/parser.mly" +# 2914 "parsing/parser.mly" ( let label, pat = match opat with | None -> @@ -19126,13 +19686,13 @@ module Tables = struct in label, mkpat_opt_constraint ~loc:_sloc pat octy ) -# 19130 "parsing/parser.ml" +# 19690 "parsing/parser.ml" in -# 1056 "parsing/parser.mly" +# 1136 "parsing/parser.mly" ( [x], None ) -# 19136 "parsing/parser.ml" +# 19696 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19195,9 +19755,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19201 "parsing/parser.ml" +# 19761 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -19205,7 +19765,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2802 "parsing/parser.mly" +# 2914 "parsing/parser.mly" ( let label, pat = match opat with | None -> @@ -19219,13 +19779,13 @@ module Tables = struct in label, mkpat_opt_constraint ~loc:_sloc pat octy ) -# 19223 "parsing/parser.ml" +# 19783 "parsing/parser.ml" in -# 1058 "parsing/parser.mly" +# 1138 "parsing/parser.mly" ( [x], Some y ) -# 19229 "parsing/parser.ml" +# 19789 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19281,9 +19841,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19287 "parsing/parser.ml" +# 19847 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -19291,7 +19851,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2802 "parsing/parser.mly" +# 2914 "parsing/parser.mly" ( let label, pat = match opat with | None -> @@ -19305,14 +19865,14 @@ module Tables = struct in label, mkpat_opt_constraint ~loc:_sloc pat octy ) -# 19309 "parsing/parser.ml" +# 19869 "parsing/parser.ml" in -# 1062 "parsing/parser.mly" +# 1142 "parsing/parser.mly" ( let xs, y = tail in x :: xs, y ) -# 19316 "parsing/parser.ml" +# 19876 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19324,87 +19884,282 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : (Parsetree.expression) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.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 : (Parsetree.case) = -# 2560 "parsing/parser.mly" - ( Exp.case _1 _3 ) -# 19355 "parsing/parser.ml" - in - { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; 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 : (Parsetree.expression) = Obj.magic _5 in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.expression) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _1 : (Parsetree.expression) = 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 : (Parsetree.case) = -# 2562 "parsing/parser.mly" - ( Exp.case _1 ~guard:_3 _5 ) -# 19408 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Parsetree.expression) = +# 2654 "parsing/parser.mly" + ( _1 ) +# 19901 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.expression) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.core_type option * Parsetree.core_type option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.expression) = let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2656 "parsing/parser.mly" + ( wrap_exp_stack (mkexp_constraint ~loc:_sloc _3 _1) ) +# 19943 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 : (Parsetree.expression) = 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 : (Parsetree.expression) = +# 2660 "parsing/parser.mly" + ( _2 ) +# 19975 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 : (Parsetree.expression) = Obj.magic _2 in + let _1 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.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 : (Parsetree.expression) = let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2662 "parsing/parser.mly" + ( let (l, o, p) = _1 in ghexp ~loc:_sloc (Pexp_fun(l, o, p, _2)) ) +# 20010 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 = 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 _5 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let xs : (string Asttypes.loc list) = Obj.magic xs 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 : (Parsetree.expression) = let _3 = +# 2537 "parsing/parser.mly" + ( xs ) +# 20063 "parsing/parser.ml" + in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2664 "parsing/parser.mly" + ( mk_newtypes ~loc:_sloc _3 _5 ) +# 20071 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.expression) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.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 : (Parsetree.case) = +# 2672 "parsing/parser.mly" + ( Exp.case _1 _3 ) +# 20110 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.expression) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = 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 : (Parsetree.case) = +# 2674 "parsing/parser.mly" + ( Exp.case _1 ~guard:_3 _5 ) +# 20163 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19442,9 +20197,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.case) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2564 "parsing/parser.mly" +# 2676 "parsing/parser.mly" ( Exp.case _1 (Exp.unreachable ~loc:(make_loc _loc__3_) ()) ) -# 19448 "parsing/parser.ml" +# 20203 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19505,9 +20260,9 @@ module Tables = struct let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 19511 "parsing/parser.ml" +# 20266 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -19516,49 +20271,49 @@ module Tables = struct let _6 = let _1 = _1_inlined3 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 19522 "parsing/parser.ml" +# 20277 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 19531 "parsing/parser.ml" +# 20286 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 3219 "parsing/parser.mly" +# 3336 "parsing/parser.mly" ( _1 ) -# 19540 "parsing/parser.ml" +# 20295 "parsing/parser.ml" in let _1 = let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 19547 "parsing/parser.ml" +# 20302 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19555 "parsing/parser.ml" +# 20310 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3429 "parsing/parser.mly" +# 3571 "parsing/parser.mly" ( let info = match rhs_info _endpos__4_ with | Some _ as info_before_semi -> info_before_semi @@ -19566,13 +20321,13 @@ module Tables = struct in let attrs = add_info_attrs info (_4 @ _6) in Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 19570 "parsing/parser.ml" +# 20325 "parsing/parser.ml" in -# 3410 "parsing/parser.mly" +# 3552 "parsing/parser.mly" ( let (f, c) = tail in (head :: f, c) ) -# 19576 "parsing/parser.ml" +# 20331 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19613,15 +20368,15 @@ module Tables = struct let _symbolstartpos = _startpos_ty_ in let _sloc = (_symbolstartpos, _endpos) in -# 3440 "parsing/parser.mly" +# 3582 "parsing/parser.mly" ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 19619 "parsing/parser.ml" +# 20374 "parsing/parser.ml" in -# 3410 "parsing/parser.mly" +# 3552 "parsing/parser.mly" ( let (f, c) = tail in (head :: f, c) ) -# 19625 "parsing/parser.ml" +# 20380 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19675,9 +20430,9 @@ module Tables = struct let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 19681 "parsing/parser.ml" +# 20436 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -19686,49 +20441,49 @@ module Tables = struct let _6 = let _1 = _1_inlined3 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 19692 "parsing/parser.ml" +# 20447 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 19701 "parsing/parser.ml" +# 20456 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 3219 "parsing/parser.mly" +# 3336 "parsing/parser.mly" ( _1 ) -# 19710 "parsing/parser.ml" +# 20465 "parsing/parser.ml" in let _1 = let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 19717 "parsing/parser.ml" +# 20472 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19725 "parsing/parser.ml" +# 20480 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3429 "parsing/parser.mly" +# 3571 "parsing/parser.mly" ( let info = match rhs_info _endpos__4_ with | Some _ as info_before_semi -> info_before_semi @@ -19736,13 +20491,13 @@ module Tables = struct in let attrs = add_info_attrs info (_4 @ _6) in Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 19740 "parsing/parser.ml" +# 20495 "parsing/parser.ml" in -# 3413 "parsing/parser.mly" +# 3555 "parsing/parser.mly" ( [head], Closed ) -# 19746 "parsing/parser.ml" +# 20501 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19776,15 +20531,15 @@ module Tables = struct let _symbolstartpos = _startpos_ty_ in let _sloc = (_symbolstartpos, _endpos) in -# 3440 "parsing/parser.mly" +# 3582 "parsing/parser.mly" ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 19782 "parsing/parser.ml" +# 20537 "parsing/parser.ml" in -# 3413 "parsing/parser.mly" +# 3555 "parsing/parser.mly" ( [head], Closed ) -# 19788 "parsing/parser.ml" +# 20543 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19824,9 +20579,9 @@ module Tables = struct let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 19830 "parsing/parser.ml" +# 20585 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -19835,50 +20590,50 @@ module Tables = struct let _4 = let _1 = _1_inlined2 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 19841 "parsing/parser.ml" +# 20596 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 3219 "parsing/parser.mly" +# 3336 "parsing/parser.mly" ( _1 ) -# 19850 "parsing/parser.ml" +# 20605 "parsing/parser.ml" in let _1 = let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 19857 "parsing/parser.ml" +# 20612 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19865 "parsing/parser.ml" +# 20620 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3422 "parsing/parser.mly" +# 3564 "parsing/parser.mly" ( let info = symbol_info _endpos in let attrs = add_info_attrs info _4 in Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 19876 "parsing/parser.ml" +# 20631 "parsing/parser.ml" in -# 3416 "parsing/parser.mly" +# 3558 "parsing/parser.mly" ( [head], Closed ) -# 19882 "parsing/parser.ml" +# 20637 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19905,15 +20660,15 @@ module Tables = struct let _symbolstartpos = _startpos_ty_ in let _sloc = (_symbolstartpos, _endpos) in -# 3440 "parsing/parser.mly" +# 3582 "parsing/parser.mly" ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 19911 "parsing/parser.ml" +# 20666 "parsing/parser.ml" in -# 3416 "parsing/parser.mly" +# 3558 "parsing/parser.mly" ( [head], Closed ) -# 19917 "parsing/parser.ml" +# 20672 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19936,9 +20691,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.object_field list * Asttypes.closed_flag) = -# 3418 "parsing/parser.mly" +# 3560 "parsing/parser.mly" ( [], Open ) -# 19942 "parsing/parser.ml" +# 20697 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19983,9 +20738,9 @@ module Tables = struct let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 19989 "parsing/parser.ml" +# 20744 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let private_ : (Asttypes.private_flag) = Obj.magic private_ in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -19997,41 +20752,41 @@ module Tables = struct Parsetree.attributes) = let ty = let _1 = _1_inlined2 in -# 3215 "parsing/parser.mly" +# 3332 "parsing/parser.mly" ( _1 ) -# 20003 "parsing/parser.ml" +# 20758 "parsing/parser.ml" in let label = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 20011 "parsing/parser.ml" +# 20766 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 20019 "parsing/parser.ml" +# 20774 "parsing/parser.ml" in let attrs = -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 20025 "parsing/parser.ml" +# 20780 "parsing/parser.ml" in let _1 = -# 3681 "parsing/parser.mly" +# 3829 "parsing/parser.mly" ( Fresh ) -# 20030 "parsing/parser.ml" +# 20785 "parsing/parser.ml" in -# 1875 "parsing/parser.mly" +# 1955 "parsing/parser.mly" ( (label, private_, Cfk_virtual ty), attrs ) -# 20035 "parsing/parser.ml" +# 20790 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20069,9 +20824,9 @@ module Tables = struct } = _menhir_stack in let _5 : (Parsetree.expression) = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 20075 "parsing/parser.ml" +# 20830 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -20083,36 +20838,36 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 20089 "parsing/parser.ml" +# 20844 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 20097 "parsing/parser.ml" +# 20852 "parsing/parser.ml" in let _2 = -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 20103 "parsing/parser.ml" +# 20858 "parsing/parser.ml" in let _1 = -# 3684 "parsing/parser.mly" +# 3832 "parsing/parser.mly" ( Fresh ) -# 20108 "parsing/parser.ml" +# 20863 "parsing/parser.ml" in -# 1877 "parsing/parser.mly" +# 1957 "parsing/parser.mly" ( let e = _5 in let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in (_4, _3, Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) -# 20116 "parsing/parser.ml" +# 20871 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20156,9 +20911,9 @@ module Tables = struct } = _menhir_stack in let _5 : (Parsetree.expression) = Obj.magic _5 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 20162 "parsing/parser.ml" +# 20917 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -20171,39 +20926,39 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 20177 "parsing/parser.ml" +# 20932 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 20185 "parsing/parser.ml" +# 20940 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 20193 "parsing/parser.ml" +# 20948 "parsing/parser.ml" in let _1 = -# 3685 "parsing/parser.mly" +# 3833 "parsing/parser.mly" ( Override ) -# 20199 "parsing/parser.ml" +# 20954 "parsing/parser.ml" in -# 1877 "parsing/parser.mly" +# 1957 "parsing/parser.mly" ( let e = _5 in let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in (_4, _3, Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) -# 20207 "parsing/parser.ml" +# 20962 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20262,9 +21017,9 @@ module Tables = struct let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 20268 "parsing/parser.ml" +# 21023 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -20276,45 +21031,45 @@ module Tables = struct Parsetree.attributes) = let _6 = let _1 = _1_inlined2 in -# 3215 "parsing/parser.mly" +# 3332 "parsing/parser.mly" ( _1 ) -# 20282 "parsing/parser.ml" +# 21037 "parsing/parser.ml" in let _startpos__6_ = _startpos__1_inlined2_ in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 20291 "parsing/parser.ml" +# 21046 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 20299 "parsing/parser.ml" +# 21054 "parsing/parser.ml" in let _2 = -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 20305 "parsing/parser.ml" +# 21060 "parsing/parser.ml" in let _1 = -# 3684 "parsing/parser.mly" +# 3832 "parsing/parser.mly" ( Fresh ) -# 20310 "parsing/parser.ml" +# 21065 "parsing/parser.ml" in -# 1883 "parsing/parser.mly" +# 1963 "parsing/parser.mly" ( let poly_exp = let loc = (_startpos__6_, _endpos__8_) in ghexp ~loc (Pexp_poly(_8, Some _6)) in (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 20318 "parsing/parser.ml" +# 21073 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20379,9 +21134,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.core_type) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 20385 "parsing/parser.ml" +# 21140 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -20394,48 +21149,48 @@ module Tables = struct Parsetree.attributes) = let _6 = let _1 = _1_inlined3 in -# 3215 "parsing/parser.mly" +# 3332 "parsing/parser.mly" ( _1 ) -# 20400 "parsing/parser.ml" +# 21155 "parsing/parser.ml" in let _startpos__6_ = _startpos__1_inlined3_ in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 20409 "parsing/parser.ml" +# 21164 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 20417 "parsing/parser.ml" +# 21172 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 20425 "parsing/parser.ml" +# 21180 "parsing/parser.ml" in let _1 = -# 3685 "parsing/parser.mly" +# 3833 "parsing/parser.mly" ( Override ) -# 20431 "parsing/parser.ml" +# 21186 "parsing/parser.ml" in -# 1883 "parsing/parser.mly" +# 1963 "parsing/parser.mly" ( let poly_exp = let loc = (_startpos__6_, _endpos__8_) in ghexp ~loc (Pexp_poly(_8, Some _6)) in (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 20439 "parsing/parser.ml" +# 21194 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20515,9 +21270,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 20521 "parsing/parser.ml" +# 21276 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -20527,38 +21282,38 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * Parsetree.class_field_kind) * Parsetree.attributes) = let _7 = -# 2451 "parsing/parser.mly" +# 2537 "parsing/parser.mly" ( xs ) -# 20533 "parsing/parser.ml" +# 21288 "parsing/parser.ml" in let _startpos__7_ = _startpos_xs_ in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 20541 "parsing/parser.ml" +# 21296 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 20549 "parsing/parser.ml" +# 21304 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined1_ in let _2 = -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 20556 "parsing/parser.ml" +# 21311 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in let _1 = -# 3684 "parsing/parser.mly" +# 3832 "parsing/parser.mly" ( Fresh ) -# 20562 "parsing/parser.ml" +# 21317 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in let _endpos = _endpos__11_ in @@ -20574,7 +21329,7 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 1889 "parsing/parser.mly" +# 1969 "parsing/parser.mly" ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in let poly_exp = let exp, poly = @@ -20585,7 +21340,7 @@ module Tables = struct ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 20589 "parsing/parser.ml" +# 21344 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20671,9 +21426,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 20677 "parsing/parser.ml" +# 21432 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -20684,41 +21439,41 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * Parsetree.class_field_kind) * Parsetree.attributes) = let _7 = -# 2451 "parsing/parser.mly" +# 2537 "parsing/parser.mly" ( xs ) -# 20690 "parsing/parser.ml" +# 21445 "parsing/parser.ml" in let _startpos__7_ = _startpos_xs_ in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 20698 "parsing/parser.ml" +# 21453 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 20706 "parsing/parser.ml" +# 21461 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 20715 "parsing/parser.ml" +# 21470 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in let _1 = -# 3685 "parsing/parser.mly" +# 3833 "parsing/parser.mly" ( Override ) -# 20722 "parsing/parser.ml" +# 21477 "parsing/parser.ml" in let _endpos = _endpos__11_ in let _symbolstartpos = if _startpos__1_ != _endpos__1_ then @@ -20733,7 +21488,7 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 1889 "parsing/parser.mly" +# 1969 "parsing/parser.mly" ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in let poly_exp = let exp, poly = @@ -20744,7 +21499,7 @@ module Tables = struct ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 20748 "parsing/parser.ml" +# 21503 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20763,17 +21518,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 20769 "parsing/parser.ml" +# 21524 "parsing/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 : (Longident.t) = -# 3541 "parsing/parser.mly" +# 3683 "parsing/parser.mly" ( Lident _1 ) -# 20777 "parsing/parser.ml" +# 21532 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20804,9 +21559,9 @@ module Tables = struct }; } = _menhir_stack in let _3 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 20810 "parsing/parser.ml" +# 21565 "parsing/parser.ml" ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : (Longident.t) = Obj.magic _1 in @@ -20814,9 +21569,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3542 "parsing/parser.mly" +# 3684 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 20820 "parsing/parser.ml" +# 21575 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20835,17 +21590,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 701 "parsing/parser.mly" +# 781 "parsing/parser.mly" (string) -# 20841 "parsing/parser.ml" +# 21596 "parsing/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 : (Longident.t) = -# 3541 "parsing/parser.mly" +# 3683 "parsing/parser.mly" ( Lident _1 ) -# 20849 "parsing/parser.ml" +# 21604 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20876,9 +21631,9 @@ module Tables = struct }; } = _menhir_stack in let _3 : ( -# 701 "parsing/parser.mly" +# 781 "parsing/parser.mly" (string) -# 20882 "parsing/parser.ml" +# 21637 "parsing/parser.ml" ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : (Longident.t) = Obj.magic _1 in @@ -20886,9 +21641,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3542 "parsing/parser.mly" +# 3684 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 20892 "parsing/parser.ml" +# 21647 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20911,14 +21666,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = let _1 = -# 3578 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 20917 "parsing/parser.ml" +# 21672 "parsing/parser.ml" in -# 3541 "parsing/parser.mly" +# 3683 "parsing/parser.mly" ( Lident _1 ) -# 20922 "parsing/parser.ml" +# 21677 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20956,20 +21711,20 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Longident.t) = let _1 = let _1 = -# 3521 "parsing/parser.mly" +# 3663 "parsing/parser.mly" ( "::" ) -# 20962 "parsing/parser.ml" +# 21717 "parsing/parser.ml" in -# 3578 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 20967 "parsing/parser.ml" +# 21722 "parsing/parser.ml" in -# 3541 "parsing/parser.mly" +# 3683 "parsing/parser.mly" ( Lident _1 ) -# 20973 "parsing/parser.ml" +# 21728 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20992,14 +21747,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = let _1 = -# 3578 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 20998 "parsing/parser.ml" +# 21753 "parsing/parser.ml" in -# 3541 "parsing/parser.mly" +# 3683 "parsing/parser.mly" ( Lident _1 ) -# 21003 "parsing/parser.ml" +# 21758 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21038,15 +21793,15 @@ module Tables = struct let _v : (Longident.t) = let _3 = let _1 = _1_inlined1 in -# 3578 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 21044 "parsing/parser.ml" +# 21799 "parsing/parser.ml" in -# 3542 "parsing/parser.mly" +# 3684 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 21050 "parsing/parser.ml" +# 21805 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21098,20 +21853,20 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Longident.t) = let _3 = let _1 = -# 3521 "parsing/parser.mly" +# 3663 "parsing/parser.mly" ( "::" ) -# 21104 "parsing/parser.ml" +# 21859 "parsing/parser.ml" in -# 3578 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 21109 "parsing/parser.ml" +# 21864 "parsing/parser.ml" in -# 3542 "parsing/parser.mly" +# 3684 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 21115 "parsing/parser.ml" +# 21870 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21150,15 +21905,15 @@ module Tables = struct let _v : (Longident.t) = let _3 = let _1 = _1_inlined1 in -# 3578 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 21156 "parsing/parser.ml" +# 21911 "parsing/parser.ml" in -# 3542 "parsing/parser.mly" +# 3684 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 21162 "parsing/parser.ml" +# 21917 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21181,9 +21936,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3541 "parsing/parser.mly" +# 3683 "parsing/parser.mly" ( Lident _1 ) -# 21187 "parsing/parser.ml" +# 21942 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21220,9 +21975,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3542 "parsing/parser.mly" +# 3684 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 21226 "parsing/parser.ml" +# 21981 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21241,17 +21996,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 21247 "parsing/parser.ml" +# 22002 "parsing/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 : (Longident.t) = -# 3541 "parsing/parser.mly" +# 3683 "parsing/parser.mly" ( Lident _1 ) -# 21255 "parsing/parser.ml" +# 22010 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21282,9 +22037,9 @@ module Tables = struct }; } = _menhir_stack in let _3 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 21288 "parsing/parser.ml" +# 22043 "parsing/parser.ml" ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : (Longident.t) = Obj.magic _1 in @@ -21292,9 +22047,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3542 "parsing/parser.mly" +# 3684 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 21298 "parsing/parser.ml" +# 22053 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21313,17 +22068,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 701 "parsing/parser.mly" +# 781 "parsing/parser.mly" (string) -# 21319 "parsing/parser.ml" +# 22074 "parsing/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 : (Longident.t) = -# 3541 "parsing/parser.mly" +# 3683 "parsing/parser.mly" ( Lident _1 ) -# 21327 "parsing/parser.ml" +# 22082 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21354,9 +22109,9 @@ module Tables = struct }; } = _menhir_stack in let _3 : ( -# 701 "parsing/parser.mly" +# 781 "parsing/parser.mly" (string) -# 21360 "parsing/parser.ml" +# 22115 "parsing/parser.ml" ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : (Longident.t) = Obj.magic _1 in @@ -21364,9 +22119,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3542 "parsing/parser.mly" +# 3684 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 21370 "parsing/parser.ml" +# 22125 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21389,9 +22144,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3541 "parsing/parser.mly" +# 3683 "parsing/parser.mly" ( Lident _1 ) -# 21395 "parsing/parser.ml" +# 22150 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21428,9 +22183,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3542 "parsing/parser.mly" +# 3684 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 21434 "parsing/parser.ml" +# 22189 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21453,9 +22208,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3557 "parsing/parser.mly" +# 3699 "parsing/parser.mly" ( _1 ) -# 21459 "parsing/parser.ml" +# 22214 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21502,9 +22257,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3559 "parsing/parser.mly" +# 3701 "parsing/parser.mly" ( lapply ~loc:_sloc _1 _3 ) -# 21508 "parsing/parser.ml" +# 22263 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21542,9 +22297,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Longident.t) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 3561 "parsing/parser.mly" +# 3703 "parsing/parser.mly" ( expecting _loc__3_ "module path" ) -# 21548 "parsing/parser.ml" +# 22303 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21567,9 +22322,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3554 "parsing/parser.mly" +# 3696 "parsing/parser.mly" ( _1 ) -# 21573 "parsing/parser.ml" +# 22328 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21599,9 +22354,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos_me_ in let _v : (Parsetree.module_expr) = -# 1377 "parsing/parser.mly" +# 1457 "parsing/parser.mly" ( me ) -# 21605 "parsing/parser.ml" +# 22360 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21646,24 +22401,24 @@ module Tables = struct let _endpos = _endpos_me_ in let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 1380 "parsing/parser.mly" +# 1460 "parsing/parser.mly" ( Pmod_constraint(me, mty) ) -# 21652 "parsing/parser.ml" +# 22407 "parsing/parser.ml" in let _endpos__1_ = _endpos_me_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 860 "parsing/parser.mly" +# 940 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 21661 "parsing/parser.ml" +# 22416 "parsing/parser.ml" in -# 1384 "parsing/parser.mly" +# 1464 "parsing/parser.mly" ( _1 ) -# 21667 "parsing/parser.ml" +# 22422 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21694,25 +22449,25 @@ module Tables = struct let _endpos = _endpos_body_ in let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 1382 "parsing/parser.mly" +# 1462 "parsing/parser.mly" ( let (_, arg) = arg_and_pos in Pmod_functor(arg, body) ) -# 21701 "parsing/parser.ml" +# 22456 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 860 "parsing/parser.mly" +# 940 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 21710 "parsing/parser.ml" +# 22465 "parsing/parser.ml" in -# 1384 "parsing/parser.mly" +# 1464 "parsing/parser.mly" ( _1 ) -# 21716 "parsing/parser.ml" +# 22471 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21742,9 +22497,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos_mty_ in let _v : (Parsetree.module_type) = -# 1621 "parsing/parser.mly" +# 1701 "parsing/parser.mly" ( mty ) -# 21748 "parsing/parser.ml" +# 22503 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21775,25 +22530,25 @@ module Tables = struct let _endpos = _endpos_body_ in let _v : (Parsetree.module_type) = let _1 = let _1 = -# 1624 "parsing/parser.mly" +# 1704 "parsing/parser.mly" ( let (_, arg) = arg_and_pos in Pmty_functor(arg, body) ) -# 21782 "parsing/parser.ml" +# 22537 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 862 "parsing/parser.mly" +# 942 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 21791 "parsing/parser.ml" +# 22546 "parsing/parser.ml" in -# 1627 "parsing/parser.mly" +# 1707 "parsing/parser.mly" ( _1 ) -# 21797 "parsing/parser.ml" +# 22552 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21839,18 +22594,18 @@ module Tables = struct let _v : (Parsetree.module_expr) = let attrs = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 21845 "parsing/parser.ml" +# 22600 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1216 "parsing/parser.mly" +# 1296 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_structure s) ) -# 21854 "parsing/parser.ml" +# 22609 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21896,17 +22651,17 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 21902 "parsing/parser.ml" +# 22657 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1218 "parsing/parser.mly" +# 1298 "parsing/parser.mly" ( unclosed "struct" _loc__1_ "end" _loc__4_ ) -# 21910 "parsing/parser.ml" +# 22665 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21959,30 +22714,30 @@ module Tables = struct let _v : (Parsetree.module_expr) = let args = let _1 = _1_inlined2 in -# 1182 "parsing/parser.mly" +# 1262 "parsing/parser.mly" ( _1 ) -# 21965 "parsing/parser.ml" +# 22720 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 21973 "parsing/parser.ml" +# 22728 "parsing/parser.ml" in let _endpos = _endpos_me_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1220 "parsing/parser.mly" +# 1300 "parsing/parser.mly" ( wrap_mod_attrs ~loc:_sloc attrs ( List.fold_left (fun acc (startpos, arg) -> mkmod ~loc:(startpos, _endpos) (Pmod_functor (arg, acc)) ) me args ) ) -# 21986 "parsing/parser.ml" +# 22741 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22005,9 +22760,9 @@ module Tables = struct let _startpos = _startpos_me_ in let _endpos = _endpos_me_ in let _v : (Parsetree.module_expr) = -# 1226 "parsing/parser.mly" +# 1306 "parsing/parser.mly" ( me ) -# 22011 "parsing/parser.ml" +# 22766 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22037,9 +22792,9 @@ module Tables = struct let _startpos = _startpos_me_ in let _endpos = _endpos_attr_ in let _v : (Parsetree.module_expr) = -# 1228 "parsing/parser.mly" +# 1308 "parsing/parser.mly" ( Mod.attr me attr ) -# 22043 "parsing/parser.ml" +# 22798 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22068,30 +22823,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22074 "parsing/parser.ml" +# 22829 "parsing/parser.ml" in -# 1232 "parsing/parser.mly" +# 1312 "parsing/parser.mly" ( Pmod_ident x ) -# 22080 "parsing/parser.ml" +# 22835 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 860 "parsing/parser.mly" +# 940 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 22089 "parsing/parser.ml" +# 22844 "parsing/parser.ml" in -# 1244 "parsing/parser.mly" +# 1324 "parsing/parser.mly" ( _1 ) -# 22095 "parsing/parser.ml" +# 22850 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22122,24 +22877,24 @@ module Tables = struct let _endpos = _endpos_me2_ in let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 1235 "parsing/parser.mly" +# 1315 "parsing/parser.mly" ( Pmod_apply(me1, me2) ) -# 22128 "parsing/parser.ml" +# 22883 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_me2_, _startpos_me1_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 860 "parsing/parser.mly" +# 940 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 22137 "parsing/parser.ml" +# 22892 "parsing/parser.ml" in -# 1244 "parsing/parser.mly" +# 1324 "parsing/parser.mly" ( _1 ) -# 22143 "parsing/parser.ml" +# 22898 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22181,10 +22936,10 @@ module Tables = struct let _symbolstartpos = _startpos_me1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1238 "parsing/parser.mly" +# 1318 "parsing/parser.mly" ( (* TODO review mkmod location *) Pmod_apply(me1, mkmod ~loc:_sloc (Pmod_structure [])) ) -# 22188 "parsing/parser.ml" +# 22943 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_me1_) in @@ -22192,15 +22947,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 860 "parsing/parser.mly" +# 940 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 22198 "parsing/parser.ml" +# 22953 "parsing/parser.ml" in -# 1244 "parsing/parser.mly" +# 1324 "parsing/parser.mly" ( _1 ) -# 22204 "parsing/parser.ml" +# 22959 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22224,24 +22979,24 @@ module Tables = struct let _endpos = _endpos_ex_ in let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 1242 "parsing/parser.mly" +# 1322 "parsing/parser.mly" ( Pmod_extension ex ) -# 22230 "parsing/parser.ml" +# 22985 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_ex_, _startpos_ex_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 860 "parsing/parser.mly" +# 940 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 22239 "parsing/parser.ml" +# 22994 "parsing/parser.ml" in -# 1244 "parsing/parser.mly" +# 1324 "parsing/parser.mly" ( _1 ) -# 22245 "parsing/parser.ml" +# 23000 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22260,17 +23015,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let x : ( -# 701 "parsing/parser.mly" +# 781 "parsing/parser.mly" (string) -# 22266 "parsing/parser.ml" +# 23021 "parsing/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 : (string option) = -# 1199 "parsing/parser.mly" +# 1279 "parsing/parser.mly" ( Some x ) -# 22274 "parsing/parser.ml" +# 23029 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22293,9 +23048,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string option) = -# 1202 "parsing/parser.mly" +# 1282 "parsing/parser.mly" ( None ) -# 22299 "parsing/parser.ml" +# 23054 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22353,9 +23108,9 @@ module Tables = struct let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 701 "parsing/parser.mly" +# 781 "parsing/parser.mly" (string) -# 22359 "parsing/parser.ml" +# 23114 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let ext : (string Asttypes.loc option) = Obj.magic ext in @@ -22366,9 +23121,9 @@ module Tables = struct let _v : (Parsetree.module_substitution * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined4 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 22372 "parsing/parser.ml" +# 23127 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -22378,9 +23133,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22384 "parsing/parser.ml" +# 23139 "parsing/parser.ml" in let uid = @@ -22389,31 +23144,31 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22395 "parsing/parser.ml" +# 23150 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 22403 "parsing/parser.ml" +# 23158 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1657 "parsing/parser.mly" +# 1737 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Ms.mk uid body ~attrs ~loc ~docs, ext ) -# 22417 "parsing/parser.ml" +# 23172 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22464,9 +23219,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 701 "parsing/parser.mly" +# 781 "parsing/parser.mly" (string) -# 22470 "parsing/parser.ml" +# 23225 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _2 : (string Asttypes.loc option) = Obj.magic _2 in @@ -22480,24 +23235,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22486 "parsing/parser.ml" +# 23241 "parsing/parser.ml" in let _3 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 22494 "parsing/parser.ml" +# 23249 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in -# 1664 "parsing/parser.mly" +# 1744 "parsing/parser.mly" ( expecting _loc__6_ "module path" ) -# 22501 "parsing/parser.ml" +# 23256 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22543,18 +23298,18 @@ module Tables = struct let _v : (Parsetree.module_type) = let attrs = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 22549 "parsing/parser.ml" +# 23304 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1509 "parsing/parser.mly" +# 1589 "parsing/parser.mly" ( mkmty ~loc:_sloc ~attrs (Pmty_signature s) ) -# 22558 "parsing/parser.ml" +# 23313 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22600,17 +23355,17 @@ module Tables = struct let _v : (Parsetree.module_type) = let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 22606 "parsing/parser.ml" +# 23361 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1511 "parsing/parser.mly" +# 1591 "parsing/parser.mly" ( unclosed "sig" _loc__1_ "end" _loc__4_ ) -# 22614 "parsing/parser.ml" +# 23369 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22663,30 +23418,30 @@ module Tables = struct let _v : (Parsetree.module_type) = let args = let _1 = _1_inlined2 in -# 1182 "parsing/parser.mly" +# 1262 "parsing/parser.mly" ( _1 ) -# 22669 "parsing/parser.ml" +# 23424 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 22677 "parsing/parser.ml" +# 23432 "parsing/parser.ml" in let _endpos = _endpos_mty_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1515 "parsing/parser.mly" +# 1595 "parsing/parser.mly" ( wrap_mty_attrs ~loc:_sloc attrs ( List.fold_left (fun acc (startpos, arg) -> mkmty ~loc:(startpos, _endpos) (Pmty_functor (arg, acc)) ) mty args ) ) -# 22690 "parsing/parser.ml" +# 23445 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22739,18 +23494,18 @@ module Tables = struct let _v : (Parsetree.module_type) = let _4 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 22745 "parsing/parser.ml" +# 23500 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1521 "parsing/parser.mly" +# 1601 "parsing/parser.mly" ( mkmty ~loc:_sloc ~attrs:_4 (Pmty_typeof _5) ) -# 22754 "parsing/parser.ml" +# 23509 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22787,9 +23542,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.module_type) = -# 1523 "parsing/parser.mly" +# 1603 "parsing/parser.mly" ( _2 ) -# 22793 "parsing/parser.ml" +# 23548 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22828,9 +23583,9 @@ module Tables = struct let _v : (Parsetree.module_type) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1525 "parsing/parser.mly" +# 1605 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 22834 "parsing/parser.ml" +# 23589 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22860,9 +23615,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.module_type) = -# 1527 "parsing/parser.mly" +# 1607 "parsing/parser.mly" ( Mty.attr _1 _2 ) -# 22866 "parsing/parser.ml" +# 23621 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22891,30 +23646,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22897 "parsing/parser.ml" +# 23652 "parsing/parser.ml" in -# 1530 "parsing/parser.mly" +# 1610 "parsing/parser.mly" ( Pmty_ident _1 ) -# 22903 "parsing/parser.ml" +# 23658 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 862 "parsing/parser.mly" +# 942 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 22912 "parsing/parser.ml" +# 23667 "parsing/parser.ml" in -# 1541 "parsing/parser.mly" +# 1621 "parsing/parser.mly" ( _1 ) -# 22918 "parsing/parser.ml" +# 23673 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22952,24 +23707,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.module_type) = let _1 = let _1 = -# 1533 "parsing/parser.mly" +# 1613 "parsing/parser.mly" ( Pmty_functor(Named (mknoloc None, _1), _3) ) -# 22958 "parsing/parser.ml" +# 23713 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 862 "parsing/parser.mly" +# 942 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 22967 "parsing/parser.ml" +# 23722 "parsing/parser.ml" in -# 1541 "parsing/parser.mly" +# 1621 "parsing/parser.mly" ( _1 ) -# 22973 "parsing/parser.ml" +# 23728 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23011,18 +23766,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 23015 "parsing/parser.ml" +# 23770 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 23020 "parsing/parser.ml" +# 23775 "parsing/parser.ml" in -# 1535 "parsing/parser.mly" +# 1615 "parsing/parser.mly" ( Pmty_with(_1, _3) ) -# 23026 "parsing/parser.ml" +# 23781 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -23030,15 +23785,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 862 "parsing/parser.mly" +# 942 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 23036 "parsing/parser.ml" +# 23791 "parsing/parser.ml" in -# 1541 "parsing/parser.mly" +# 1621 "parsing/parser.mly" ( _1 ) -# 23042 "parsing/parser.ml" +# 23797 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23062,23 +23817,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.module_type) = let _1 = let _1 = -# 1539 "parsing/parser.mly" +# 1619 "parsing/parser.mly" ( Pmty_extension _1 ) -# 23068 "parsing/parser.ml" +# 23823 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 862 "parsing/parser.mly" +# 942 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 23076 "parsing/parser.ml" +# 23831 "parsing/parser.ml" in -# 1541 "parsing/parser.mly" +# 1621 "parsing/parser.mly" ( _1 ) -# 23082 "parsing/parser.ml" +# 23837 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23145,9 +23900,9 @@ module Tables = struct let _v : (Parsetree.module_type_declaration * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 23151 "parsing/parser.ml" +# 23906 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -23157,31 +23912,31 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 23163 "parsing/parser.ml" +# 23918 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 23171 "parsing/parser.ml" +# 23926 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1455 "parsing/parser.mly" +# 1535 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Mtd.mk id ?typ ~attrs ~loc ~docs, ext ) -# 23185 "parsing/parser.ml" +# 23940 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23204,9 +23959,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3564 "parsing/parser.mly" +# 3706 "parsing/parser.mly" ( _1 ) -# 23210 "parsing/parser.ml" +# 23965 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23222,9 +23977,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.mutable_flag) = -# 3641 "parsing/parser.mly" +# 3783 "parsing/parser.mly" ( Immutable ) -# 23228 "parsing/parser.ml" +# 23983 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23247,9 +24002,102 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag) = -# 3642 "parsing/parser.mly" +# 3784 "parsing/parser.mly" ( Mutable ) -# 23253 "parsing/parser.ml" +# 24008 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.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 : (Asttypes.mutable_flag * global_flag) = +# 3787 "parsing/parser.mly" + ( Immutable, Nothing ) +# 24026 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + 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 : (Asttypes.mutable_flag * global_flag) = +# 3788 "parsing/parser.mly" + ( Mutable, Nothing ) +# 24051 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + 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 : (Asttypes.mutable_flag * global_flag) = +# 3789 "parsing/parser.mly" + ( Immutable, Global ) +# 24076 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + 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 : (Asttypes.mutable_flag * global_flag) = +# 3790 "parsing/parser.mly" + ( Immutable, Nonlocal ) +# 24101 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23265,9 +24113,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3650 "parsing/parser.mly" +# 3798 "parsing/parser.mly" ( Immutable, Concrete ) -# 23271 "parsing/parser.ml" +# 24119 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23290,9 +24138,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3652 "parsing/parser.mly" +# 3800 "parsing/parser.mly" ( Mutable, Concrete ) -# 23296 "parsing/parser.ml" +# 24144 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23315,9 +24163,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3654 "parsing/parser.mly" +# 3802 "parsing/parser.mly" ( Immutable, Virtual ) -# 23321 "parsing/parser.ml" +# 24169 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23347,9 +24195,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3657 "parsing/parser.mly" +# 3805 "parsing/parser.mly" ( Mutable, Virtual ) -# 23353 "parsing/parser.ml" +# 24201 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23379,9 +24227,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3657 "parsing/parser.mly" +# 3805 "parsing/parser.mly" ( Mutable, Virtual ) -# 23385 "parsing/parser.ml" +# 24233 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23411,9 +24259,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.label) = -# 3614 "parsing/parser.mly" +# 3756 "parsing/parser.mly" ( _2 ) -# 23417 "parsing/parser.ml" +# 24265 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23432,9 +24280,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 23438 "parsing/parser.ml" +# 24286 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -23444,15 +24292,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 23450 "parsing/parser.ml" +# 24298 "parsing/parser.ml" in # 221 "" ( [ x ] ) -# 23456 "parsing/parser.ml" +# 24304 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23478,9 +24326,9 @@ module Tables = struct } = _menhir_stack in let xs : (string Asttypes.loc list) = Obj.magic xs in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 23484 "parsing/parser.ml" +# 24332 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -23490,15 +24338,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 23496 "parsing/parser.ml" +# 24344 "parsing/parser.ml" in # 223 "" ( x :: xs ) -# 23502 "parsing/parser.ml" +# 24350 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23517,22 +24365,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let s : ( -# 689 "parsing/parser.mly" +# 769 "parsing/parser.mly" (string * Location.t * string option) -# 23523 "parsing/parser.ml" +# 24371 "parsing/parser.ml" ) = Obj.magic s in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_s_ in let _endpos = _endpos_s_ in let _v : (string list) = let x = -# 3610 "parsing/parser.mly" +# 3752 "parsing/parser.mly" ( let body, _, _ = s in body ) -# 23531 "parsing/parser.ml" +# 24379 "parsing/parser.ml" in # 221 "" ( [ x ] ) -# 23536 "parsing/parser.ml" +# 24384 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23558,22 +24406,22 @@ module Tables = struct } = _menhir_stack in let xs : (string list) = Obj.magic xs in let s : ( -# 689 "parsing/parser.mly" +# 769 "parsing/parser.mly" (string * Location.t * string option) -# 23564 "parsing/parser.ml" +# 24412 "parsing/parser.ml" ) = Obj.magic s in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_s_ in let _endpos = _endpos_xs_ in let _v : (string list) = let x = -# 3610 "parsing/parser.mly" +# 3752 "parsing/parser.mly" ( let body, _, _ = s in body ) -# 23572 "parsing/parser.ml" +# 24420 "parsing/parser.ml" in # 223 "" ( x :: xs ) -# 23577 "parsing/parser.ml" +# 24425 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23596,14 +24444,14 @@ module Tables = struct let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3637 "parsing/parser.mly" +# 3779 "parsing/parser.mly" ( Public ) -# 23602 "parsing/parser.ml" +# 24450 "parsing/parser.ml" in -# 2936 "parsing/parser.mly" +# 3048 "parsing/parser.mly" ( (Ptype_abstract, priv, Some ty) ) -# 23607 "parsing/parser.ml" +# 24455 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23633,14 +24481,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3638 "parsing/parser.mly" +# 3780 "parsing/parser.mly" ( Private ) -# 23639 "parsing/parser.ml" +# 24487 "parsing/parser.ml" in -# 2936 "parsing/parser.mly" +# 3048 "parsing/parser.mly" ( (Ptype_abstract, priv, Some ty) ) -# 23644 "parsing/parser.ml" +# 24492 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23663,26 +24511,26 @@ module Tables = struct let _startpos = _startpos_cs_ in let _endpos = _endpos_cs_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3637 "parsing/parser.mly" +# 3779 "parsing/parser.mly" ( Public ) -# 23669 "parsing/parser.ml" +# 24517 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 23675 "parsing/parser.ml" +# 24523 "parsing/parser.ml" in -# 2952 "parsing/parser.mly" +# 3064 "parsing/parser.mly" ( _1 ) -# 23680 "parsing/parser.ml" +# 24528 "parsing/parser.ml" in -# 2940 "parsing/parser.mly" +# 3052 "parsing/parser.mly" ( (Ptype_variant cs, priv, oty) ) -# 23686 "parsing/parser.ml" +# 24534 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23712,26 +24560,26 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos_cs_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3638 "parsing/parser.mly" +# 3780 "parsing/parser.mly" ( Private ) -# 23718 "parsing/parser.ml" +# 24566 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 23724 "parsing/parser.ml" +# 24572 "parsing/parser.ml" in -# 2952 "parsing/parser.mly" +# 3064 "parsing/parser.mly" ( _1 ) -# 23729 "parsing/parser.ml" +# 24577 "parsing/parser.ml" in -# 2940 "parsing/parser.mly" +# 3052 "parsing/parser.mly" ( (Ptype_variant cs, priv, oty) ) -# 23735 "parsing/parser.ml" +# 24583 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23768,33 +24616,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_cs_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3637 "parsing/parser.mly" +# 3779 "parsing/parser.mly" ( Public ) -# 23774 "parsing/parser.ml" +# 24622 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 23781 "parsing/parser.ml" +# 24629 "parsing/parser.ml" in # 126 "" ( Some x ) -# 23786 "parsing/parser.ml" +# 24634 "parsing/parser.ml" in -# 2952 "parsing/parser.mly" +# 3064 "parsing/parser.mly" ( _1 ) -# 23792 "parsing/parser.ml" +# 24640 "parsing/parser.ml" in -# 2940 "parsing/parser.mly" +# 3052 "parsing/parser.mly" ( (Ptype_variant cs, priv, oty) ) -# 23798 "parsing/parser.ml" +# 24646 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23838,33 +24686,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_cs_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3638 "parsing/parser.mly" +# 3780 "parsing/parser.mly" ( Private ) -# 23844 "parsing/parser.ml" +# 24692 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 23851 "parsing/parser.ml" +# 24699 "parsing/parser.ml" in # 126 "" ( Some x ) -# 23856 "parsing/parser.ml" +# 24704 "parsing/parser.ml" in -# 2952 "parsing/parser.mly" +# 3064 "parsing/parser.mly" ( _1 ) -# 23862 "parsing/parser.ml" +# 24710 "parsing/parser.ml" in -# 2940 "parsing/parser.mly" +# 3052 "parsing/parser.mly" ( (Ptype_variant cs, priv, oty) ) -# 23868 "parsing/parser.ml" +# 24716 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23887,26 +24735,26 @@ module Tables = struct let _startpos = _startpos__3_ in let _endpos = _endpos__3_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3637 "parsing/parser.mly" +# 3779 "parsing/parser.mly" ( Public ) -# 23893 "parsing/parser.ml" +# 24741 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 23899 "parsing/parser.ml" +# 24747 "parsing/parser.ml" in -# 2952 "parsing/parser.mly" +# 3064 "parsing/parser.mly" ( _1 ) -# 23904 "parsing/parser.ml" +# 24752 "parsing/parser.ml" in -# 2944 "parsing/parser.mly" +# 3056 "parsing/parser.mly" ( (Ptype_open, priv, oty) ) -# 23910 "parsing/parser.ml" +# 24758 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23936,26 +24784,26 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3638 "parsing/parser.mly" +# 3780 "parsing/parser.mly" ( Private ) -# 23942 "parsing/parser.ml" +# 24790 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 23948 "parsing/parser.ml" +# 24796 "parsing/parser.ml" in -# 2952 "parsing/parser.mly" +# 3064 "parsing/parser.mly" ( _1 ) -# 23953 "parsing/parser.ml" +# 24801 "parsing/parser.ml" in -# 2944 "parsing/parser.mly" +# 3056 "parsing/parser.mly" ( (Ptype_open, priv, oty) ) -# 23959 "parsing/parser.ml" +# 24807 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23992,33 +24840,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos__3_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3637 "parsing/parser.mly" +# 3779 "parsing/parser.mly" ( Public ) -# 23998 "parsing/parser.ml" +# 24846 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 24005 "parsing/parser.ml" +# 24853 "parsing/parser.ml" in # 126 "" ( Some x ) -# 24010 "parsing/parser.ml" +# 24858 "parsing/parser.ml" in -# 2952 "parsing/parser.mly" +# 3064 "parsing/parser.mly" ( _1 ) -# 24016 "parsing/parser.ml" +# 24864 "parsing/parser.ml" in -# 2944 "parsing/parser.mly" +# 3056 "parsing/parser.mly" ( (Ptype_open, priv, oty) ) -# 24022 "parsing/parser.ml" +# 24870 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24062,33 +24910,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos__3_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3638 "parsing/parser.mly" +# 3780 "parsing/parser.mly" ( Private ) -# 24068 "parsing/parser.ml" +# 24916 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 24075 "parsing/parser.ml" +# 24923 "parsing/parser.ml" in # 126 "" ( Some x ) -# 24080 "parsing/parser.ml" +# 24928 "parsing/parser.ml" in -# 2952 "parsing/parser.mly" +# 3064 "parsing/parser.mly" ( _1 ) -# 24086 "parsing/parser.ml" +# 24934 "parsing/parser.ml" in -# 2944 "parsing/parser.mly" +# 3056 "parsing/parser.mly" ( (Ptype_open, priv, oty) ) -# 24092 "parsing/parser.ml" +# 24940 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24125,26 +24973,26 @@ module Tables = struct let _startpos = _startpos__3_ in let _endpos = _endpos__5_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3637 "parsing/parser.mly" +# 3779 "parsing/parser.mly" ( Public ) -# 24131 "parsing/parser.ml" +# 24979 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 24137 "parsing/parser.ml" +# 24985 "parsing/parser.ml" in -# 2952 "parsing/parser.mly" +# 3064 "parsing/parser.mly" ( _1 ) -# 24142 "parsing/parser.ml" +# 24990 "parsing/parser.ml" in -# 2948 "parsing/parser.mly" +# 3060 "parsing/parser.mly" ( (Ptype_record ls, priv, oty) ) -# 24148 "parsing/parser.ml" +# 24996 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24188,26 +25036,26 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3638 "parsing/parser.mly" +# 3780 "parsing/parser.mly" ( Private ) -# 24194 "parsing/parser.ml" +# 25042 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 24200 "parsing/parser.ml" +# 25048 "parsing/parser.ml" in -# 2952 "parsing/parser.mly" +# 3064 "parsing/parser.mly" ( _1 ) -# 24205 "parsing/parser.ml" +# 25053 "parsing/parser.ml" in -# 2948 "parsing/parser.mly" +# 3060 "parsing/parser.mly" ( (Ptype_record ls, priv, oty) ) -# 24211 "parsing/parser.ml" +# 25059 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24258,33 +25106,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos__5_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3637 "parsing/parser.mly" +# 3779 "parsing/parser.mly" ( Public ) -# 24264 "parsing/parser.ml" +# 25112 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 24271 "parsing/parser.ml" +# 25119 "parsing/parser.ml" in # 126 "" ( Some x ) -# 24276 "parsing/parser.ml" +# 25124 "parsing/parser.ml" in -# 2952 "parsing/parser.mly" +# 3064 "parsing/parser.mly" ( _1 ) -# 24282 "parsing/parser.ml" +# 25130 "parsing/parser.ml" in -# 2948 "parsing/parser.mly" +# 3060 "parsing/parser.mly" ( (Ptype_record ls, priv, oty) ) -# 24288 "parsing/parser.ml" +# 25136 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24342,33 +25190,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos__5_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3638 "parsing/parser.mly" +# 3780 "parsing/parser.mly" ( Private ) -# 24348 "parsing/parser.ml" +# 25196 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 24355 "parsing/parser.ml" +# 25203 "parsing/parser.ml" in # 126 "" ( Some x ) -# 24360 "parsing/parser.ml" +# 25208 "parsing/parser.ml" in -# 2952 "parsing/parser.mly" +# 3064 "parsing/parser.mly" ( _1 ) -# 24366 "parsing/parser.ml" +# 25214 "parsing/parser.ml" in -# 2948 "parsing/parser.mly" +# 3060 "parsing/parser.mly" ( (Ptype_record ls, priv, oty) ) -# 24372 "parsing/parser.ml" +# 25220 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24421,37 +25269,37 @@ module Tables = struct let _v : (Parsetree.open_declaration * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined2 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 24427 "parsing/parser.ml" +# 25275 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 24436 "parsing/parser.ml" +# 25284 "parsing/parser.ml" in let override = -# 3684 "parsing/parser.mly" +# 3832 "parsing/parser.mly" ( Fresh ) -# 24442 "parsing/parser.ml" +# 25290 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1474 "parsing/parser.mly" +# 1554 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Opn.mk me ~override ~attrs ~loc ~docs, ext ) -# 24455 "parsing/parser.ml" +# 25303 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24511,37 +25359,37 @@ module Tables = struct let _v : (Parsetree.open_declaration * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 24517 "parsing/parser.ml" +# 25365 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let attrs1 = let _1 = _1_inlined2 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 24526 "parsing/parser.ml" +# 25374 "parsing/parser.ml" in let override = -# 3685 "parsing/parser.mly" +# 3833 "parsing/parser.mly" ( Override ) -# 24532 "parsing/parser.ml" +# 25380 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1474 "parsing/parser.mly" +# 1554 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Opn.mk me ~override ~attrs ~loc ~docs, ext ) -# 24545 "parsing/parser.ml" +# 25393 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24594,9 +25442,9 @@ module Tables = struct let _v : (Parsetree.open_description * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 24600 "parsing/parser.ml" +# 25448 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -24606,36 +25454,36 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 24612 "parsing/parser.ml" +# 25460 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 24620 "parsing/parser.ml" +# 25468 "parsing/parser.ml" in let override = -# 3684 "parsing/parser.mly" +# 3832 "parsing/parser.mly" ( Fresh ) -# 24626 "parsing/parser.ml" +# 25474 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1489 "parsing/parser.mly" +# 1569 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Opn.mk id ~override ~attrs ~loc ~docs, ext ) -# 24639 "parsing/parser.ml" +# 25487 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24695,9 +25543,9 @@ module Tables = struct let _v : (Parsetree.open_description * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined4 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 24701 "parsing/parser.ml" +# 25549 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -24707,36 +25555,36 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 24713 "parsing/parser.ml" +# 25561 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined2 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 24721 "parsing/parser.ml" +# 25569 "parsing/parser.ml" in let override = -# 3685 "parsing/parser.mly" +# 3833 "parsing/parser.mly" ( Override ) -# 24727 "parsing/parser.ml" +# 25575 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1489 "parsing/parser.mly" +# 1569 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Opn.mk id ~override ~attrs ~loc ~docs, ext ) -# 24740 "parsing/parser.ml" +# 25588 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24755,17 +25603,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 675 "parsing/parser.mly" +# 755 "parsing/parser.mly" (string) -# 24761 "parsing/parser.ml" +# 25609 "parsing/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 : (Asttypes.label) = -# 3480 "parsing/parser.mly" +# 3622 "parsing/parser.mly" ( _1 ) -# 24769 "parsing/parser.ml" +# 25617 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24784,17 +25632,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 633 "parsing/parser.mly" +# 711 "parsing/parser.mly" (string) -# 24790 "parsing/parser.ml" +# 25638 "parsing/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 : (Asttypes.label) = -# 3481 "parsing/parser.mly" +# 3623 "parsing/parser.mly" ( _1 ) -# 24798 "parsing/parser.ml" +# 25646 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24813,17 +25661,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 634 "parsing/parser.mly" +# 712 "parsing/parser.mly" (string) -# 24819 "parsing/parser.ml" +# 25667 "parsing/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 : (Asttypes.label) = -# 3482 "parsing/parser.mly" +# 3624 "parsing/parser.mly" ( _1 ) -# 24827 "parsing/parser.ml" +# 25675 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24863,17 +25711,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 24869 "parsing/parser.ml" +# 25717 "parsing/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 : (Asttypes.label) = -# 3483 "parsing/parser.mly" +# 3625 "parsing/parser.mly" ( "."^ _1 ^"(" ^ _3 ^ ")" ) -# 24877 "parsing/parser.ml" +# 25725 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24920,17 +25768,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 24926 "parsing/parser.ml" +# 25774 "parsing/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 : (Asttypes.label) = -# 3484 "parsing/parser.mly" +# 3626 "parsing/parser.mly" ( "."^ _1 ^ "(" ^ _3 ^ ")<-" ) -# 24934 "parsing/parser.ml" +# 25782 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24970,17 +25818,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 24976 "parsing/parser.ml" +# 25824 "parsing/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 : (Asttypes.label) = -# 3485 "parsing/parser.mly" +# 3627 "parsing/parser.mly" ( "."^ _1 ^"[" ^ _3 ^ "]" ) -# 24984 "parsing/parser.ml" +# 25832 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25027,17 +25875,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 25033 "parsing/parser.ml" +# 25881 "parsing/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 : (Asttypes.label) = -# 3486 "parsing/parser.mly" +# 3628 "parsing/parser.mly" ( "."^ _1 ^ "[" ^ _3 ^ "]<-" ) -# 25041 "parsing/parser.ml" +# 25889 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25077,17 +25925,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 25083 "parsing/parser.ml" +# 25931 "parsing/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 : (Asttypes.label) = -# 3487 "parsing/parser.mly" +# 3629 "parsing/parser.mly" ( "."^ _1 ^"{" ^ _3 ^ "}" ) -# 25091 "parsing/parser.ml" +# 25939 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25134,17 +25982,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 25140 "parsing/parser.ml" +# 25988 "parsing/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 : (Asttypes.label) = -# 3488 "parsing/parser.mly" +# 3630 "parsing/parser.mly" ( "."^ _1 ^ "{" ^ _3 ^ "}<-" ) -# 25148 "parsing/parser.ml" +# 25996 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25163,17 +26011,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 686 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 25169 "parsing/parser.ml" +# 26017 "parsing/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 : (Asttypes.label) = -# 3489 "parsing/parser.mly" +# 3631 "parsing/parser.mly" ( _1 ) -# 25177 "parsing/parser.ml" +# 26025 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25196,9 +26044,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3490 "parsing/parser.mly" +# 3632 "parsing/parser.mly" ( "!" ) -# 25202 "parsing/parser.ml" +# 26050 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25217,22 +26065,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 627 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 25223 "parsing/parser.ml" +# 26071 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3494 "parsing/parser.mly" +# 3636 "parsing/parser.mly" ( op ) -# 25231 "parsing/parser.ml" +# 26079 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25236 "parsing/parser.ml" +# 26084 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25251,22 +26099,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 628 "parsing/parser.mly" +# 706 "parsing/parser.mly" (string) -# 25257 "parsing/parser.ml" +# 26105 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3495 "parsing/parser.mly" +# 3637 "parsing/parser.mly" ( op ) -# 25265 "parsing/parser.ml" +# 26113 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25270 "parsing/parser.ml" +# 26118 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25285,22 +26133,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 629 "parsing/parser.mly" +# 707 "parsing/parser.mly" (string) -# 25291 "parsing/parser.ml" +# 26139 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3496 "parsing/parser.mly" +# 3638 "parsing/parser.mly" ( op ) -# 25299 "parsing/parser.ml" +# 26147 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25304 "parsing/parser.ml" +# 26152 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25319,22 +26167,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 630 "parsing/parser.mly" +# 708 "parsing/parser.mly" (string) -# 25325 "parsing/parser.ml" +# 26173 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3497 "parsing/parser.mly" +# 3639 "parsing/parser.mly" ( op ) -# 25333 "parsing/parser.ml" +# 26181 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25338 "parsing/parser.ml" +# 26186 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25353,22 +26201,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 631 "parsing/parser.mly" +# 709 "parsing/parser.mly" (string) -# 25359 "parsing/parser.ml" +# 26207 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3498 "parsing/parser.mly" +# 3640 "parsing/parser.mly" ( op ) -# 25367 "parsing/parser.ml" +# 26215 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25372 "parsing/parser.ml" +# 26220 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25391,14 +26239,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3499 "parsing/parser.mly" +# 3641 "parsing/parser.mly" ("+") -# 25397 "parsing/parser.ml" +# 26245 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25402 "parsing/parser.ml" +# 26250 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25421,14 +26269,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3500 "parsing/parser.mly" +# 3642 "parsing/parser.mly" ("+.") -# 25427 "parsing/parser.ml" +# 26275 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25432 "parsing/parser.ml" +# 26280 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25451,14 +26299,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3501 "parsing/parser.mly" +# 3643 "parsing/parser.mly" ("+=") -# 25457 "parsing/parser.ml" +# 26305 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25462 "parsing/parser.ml" +# 26310 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25481,14 +26329,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3502 "parsing/parser.mly" +# 3644 "parsing/parser.mly" ("-") -# 25487 "parsing/parser.ml" +# 26335 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25492 "parsing/parser.ml" +# 26340 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25511,14 +26359,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3503 "parsing/parser.mly" +# 3645 "parsing/parser.mly" ("-.") -# 25517 "parsing/parser.ml" +# 26365 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25522 "parsing/parser.ml" +# 26370 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25541,14 +26389,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3504 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ("*") -# 25547 "parsing/parser.ml" +# 26395 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25552 "parsing/parser.ml" +# 26400 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25571,14 +26419,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3505 "parsing/parser.mly" +# 3647 "parsing/parser.mly" ("%") -# 25577 "parsing/parser.ml" +# 26425 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25582 "parsing/parser.ml" +# 26430 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25601,14 +26449,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3506 "parsing/parser.mly" +# 3648 "parsing/parser.mly" ("=") -# 25607 "parsing/parser.ml" +# 26455 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25612 "parsing/parser.ml" +# 26460 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25631,14 +26479,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3507 "parsing/parser.mly" +# 3649 "parsing/parser.mly" ("<") -# 25637 "parsing/parser.ml" +# 26485 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25642 "parsing/parser.ml" +# 26490 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25661,14 +26509,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3508 "parsing/parser.mly" +# 3650 "parsing/parser.mly" (">") -# 25667 "parsing/parser.ml" +# 26515 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25672 "parsing/parser.ml" +# 26520 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25691,14 +26539,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3509 "parsing/parser.mly" +# 3651 "parsing/parser.mly" ("or") -# 25697 "parsing/parser.ml" +# 26545 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25702 "parsing/parser.ml" +# 26550 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25721,14 +26569,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3510 "parsing/parser.mly" +# 3652 "parsing/parser.mly" ("||") -# 25727 "parsing/parser.ml" +# 26575 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25732 "parsing/parser.ml" +# 26580 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25751,14 +26599,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3511 "parsing/parser.mly" +# 3653 "parsing/parser.mly" ("&") -# 25757 "parsing/parser.ml" +# 26605 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25762 "parsing/parser.ml" +# 26610 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25781,14 +26629,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3512 "parsing/parser.mly" +# 3654 "parsing/parser.mly" ("&&") -# 25787 "parsing/parser.ml" +# 26635 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25792 "parsing/parser.ml" +# 26640 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25811,14 +26659,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3513 "parsing/parser.mly" +# 3655 "parsing/parser.mly" (":=") -# 25817 "parsing/parser.ml" +# 26665 "parsing/parser.ml" in -# 3491 "parsing/parser.mly" +# 3633 "parsing/parser.mly" ( _1 ) -# 25822 "parsing/parser.ml" +# 26670 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25841,9 +26689,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (bool) = -# 3395 "parsing/parser.mly" +# 3537 "parsing/parser.mly" ( true ) -# 25847 "parsing/parser.ml" +# 26695 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25859,9 +26707,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (bool) = -# 3396 "parsing/parser.mly" +# 3538 "parsing/parser.mly" ( false ) -# 25865 "parsing/parser.ml" +# 26713 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25879,7 +26727,7 @@ module Tables = struct let _v : (unit option) = # 114 "" ( None ) -# 25883 "parsing/parser.ml" +# 26731 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25904,7 +26752,7 @@ module Tables = struct let _v : (unit option) = # 116 "" ( Some x ) -# 25908 "parsing/parser.ml" +# 26756 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25922,7 +26770,7 @@ module Tables = struct let _v : (unit option) = # 114 "" ( None ) -# 25926 "parsing/parser.ml" +# 26774 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25947,7 +26795,7 @@ module Tables = struct let _v : (unit option) = # 116 "" ( Some x ) -# 25951 "parsing/parser.ml" +# 26799 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25965,7 +26813,7 @@ module Tables = struct let _v : (string Asttypes.loc option) = # 114 "" ( None ) -# 25969 "parsing/parser.ml" +# 26817 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25990,9 +26838,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 25996 "parsing/parser.ml" +# 26844 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -26005,21 +26853,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 26011 "parsing/parser.ml" +# 26859 "parsing/parser.ml" in # 183 "" ( x ) -# 26017 "parsing/parser.ml" +# 26865 "parsing/parser.ml" in # 116 "" ( Some x ) -# 26023 "parsing/parser.ml" +# 26871 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26037,7 +26885,7 @@ module Tables = struct let _v : (Parsetree.core_type option) = # 114 "" ( None ) -# 26041 "parsing/parser.ml" +# 26889 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26069,12 +26917,12 @@ module Tables = struct let _v : (Parsetree.core_type option) = let x = # 183 "" ( x ) -# 26073 "parsing/parser.ml" +# 26921 "parsing/parser.ml" in # 116 "" ( Some x ) -# 26078 "parsing/parser.ml" +# 26926 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26092,7 +26940,7 @@ module Tables = struct let _v : (Parsetree.expression option) = # 114 "" ( None ) -# 26096 "parsing/parser.ml" +# 26944 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26124,12 +26972,12 @@ module Tables = struct let _v : (Parsetree.expression option) = let x = # 183 "" ( x ) -# 26128 "parsing/parser.ml" +# 26976 "parsing/parser.ml" in # 116 "" ( Some x ) -# 26133 "parsing/parser.ml" +# 26981 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26147,7 +26995,7 @@ module Tables = struct let _v : (Parsetree.module_type option) = # 114 "" ( None ) -# 26151 "parsing/parser.ml" +# 26999 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26179,12 +27027,12 @@ module Tables = struct let _v : (Parsetree.module_type option) = let x = # 183 "" ( x ) -# 26183 "parsing/parser.ml" +# 27031 "parsing/parser.ml" in # 116 "" ( Some x ) -# 26188 "parsing/parser.ml" +# 27036 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26202,7 +27050,7 @@ module Tables = struct let _v : (Parsetree.pattern option) = # 114 "" ( None ) -# 26206 "parsing/parser.ml" +# 27054 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26234,12 +27082,12 @@ module Tables = struct let _v : (Parsetree.pattern option) = let x = # 183 "" ( x ) -# 26238 "parsing/parser.ml" +# 27086 "parsing/parser.ml" in # 116 "" ( Some x ) -# 26243 "parsing/parser.ml" +# 27091 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26257,7 +27105,7 @@ module Tables = struct let _v : (Parsetree.expression option) = # 114 "" ( None ) -# 26261 "parsing/parser.ml" +# 27109 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26289,12 +27137,12 @@ module Tables = struct let _v : (Parsetree.expression option) = let x = # 183 "" ( x ) -# 26293 "parsing/parser.ml" +# 27141 "parsing/parser.ml" in # 116 "" ( Some x ) -# 26298 "parsing/parser.ml" +# 27146 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26312,7 +27160,7 @@ module Tables = struct let _v : ((Parsetree.core_type option * Parsetree.core_type option) option) = # 114 "" ( None ) -# 26316 "parsing/parser.ml" +# 27164 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26337,7 +27185,7 @@ module Tables = struct let _v : ((Parsetree.core_type option * Parsetree.core_type option) option) = # 116 "" ( Some x ) -# 26341 "parsing/parser.ml" +# 27189 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26356,17 +27204,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 668 "parsing/parser.mly" +# 748 "parsing/parser.mly" (string) -# 26362 "parsing/parser.ml" +# 27210 "parsing/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 : (string) = -# 3696 "parsing/parser.mly" +# 3844 "parsing/parser.mly" ( _1 ) -# 26370 "parsing/parser.ml" +# 27218 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26398,18 +27246,18 @@ module Tables = struct } = _menhir_stack in let _3 : unit = Obj.magic _3 in let _2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 26404 "parsing/parser.ml" +# 27252 "parsing/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 : (string) = -# 3697 "parsing/parser.mly" +# 3845 "parsing/parser.mly" ( _2 ) -# 26413 "parsing/parser.ml" +# 27261 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26463,9 +27311,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1253 "parsing/parser.mly" +# 1333 "parsing/parser.mly" ( mkmod ~loc:_sloc (Pmod_constraint(me, mty)) ) -# 26469 "parsing/parser.ml" +# 27317 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26518,9 +27366,9 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1255 "parsing/parser.mly" +# 1335 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 26524 "parsing/parser.ml" +# 27372 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26557,9 +27405,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.module_expr) = -# 1258 "parsing/parser.mly" +# 1338 "parsing/parser.mly" ( me (* TODO consider reloc *) ) -# 26563 "parsing/parser.ml" +# 27411 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26598,9 +27446,9 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1260 "parsing/parser.mly" +# 1340 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 26604 "parsing/parser.ml" +# 27452 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26651,25 +27499,25 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Parsetree.module_expr) = let e = -# 1277 "parsing/parser.mly" +# 1357 "parsing/parser.mly" ( e ) -# 26657 "parsing/parser.ml" +# 27505 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 26664 "parsing/parser.ml" +# 27512 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1264 "parsing/parser.mly" +# 1344 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 26673 "parsing/parser.ml" +# 27521 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26740,11 +27588,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3370 "parsing/parser.mly" +# 3512 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 26748 "parsing/parser.ml" +# 27596 "parsing/parser.ml" in let _endpos_ty_ = _endpos__1_ in @@ -26752,26 +27600,26 @@ module Tables = struct let _startpos = _startpos_e_ in let _loc = (_startpos, _endpos) in -# 1279 "parsing/parser.mly" +# 1359 "parsing/parser.mly" ( ghexp ~loc:_loc (Pexp_constraint (e, ty)) ) -# 26758 "parsing/parser.ml" +# 27606 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 26766 "parsing/parser.ml" +# 27614 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1264 "parsing/parser.mly" +# 1344 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 26775 "parsing/parser.ml" +# 27623 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26857,11 +27705,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3370 "parsing/parser.mly" +# 3512 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 26865 "parsing/parser.ml" +# 27713 "parsing/parser.ml" in let _endpos_ty2_ = _endpos__1_inlined1_ in @@ -26870,37 +27718,37 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3370 "parsing/parser.mly" +# 3512 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 26878 "parsing/parser.ml" +# 27726 "parsing/parser.ml" in let _endpos = _endpos_ty2_ in let _startpos = _startpos_e_ in let _loc = (_startpos, _endpos) in -# 1281 "parsing/parser.mly" +# 1361 "parsing/parser.mly" ( ghexp ~loc:_loc (Pexp_coerce (e, Some ty1, ty2)) ) -# 26887 "parsing/parser.ml" +# 27735 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 26895 "parsing/parser.ml" +# 27743 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1264 "parsing/parser.mly" +# 1344 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 26904 "parsing/parser.ml" +# 27752 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26971,11 +27819,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3370 "parsing/parser.mly" +# 3512 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 26979 "parsing/parser.ml" +# 27827 "parsing/parser.ml" in let _endpos_ty2_ = _endpos__1_ in @@ -26983,26 +27831,26 @@ module Tables = struct let _startpos = _startpos_e_ in let _loc = (_startpos, _endpos) in -# 1283 "parsing/parser.mly" +# 1363 "parsing/parser.mly" ( ghexp ~loc:_loc (Pexp_coerce (e, None, ty2)) ) -# 26989 "parsing/parser.ml" +# 27837 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 26997 "parsing/parser.ml" +# 27845 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1264 "parsing/parser.mly" +# 1344 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 27006 "parsing/parser.ml" +# 27854 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27062,17 +27910,17 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _3 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 27068 "parsing/parser.ml" +# 27916 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1266 "parsing/parser.mly" +# 1346 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 27076 "parsing/parser.ml" +# 27924 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27132,17 +27980,17 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _3 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 27138 "parsing/parser.ml" +# 27986 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1268 "parsing/parser.mly" +# 1348 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 27146 "parsing/parser.ml" +# 27994 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27195,17 +28043,17 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _3 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 27201 "parsing/parser.ml" +# 28049 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1270 "parsing/parser.mly" +# 1350 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 27209 "parsing/parser.ml" +# 28057 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27235,9 +28083,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Longident.t) = -# 1174 "parsing/parser.mly" +# 1254 "parsing/parser.mly" ( _1 ) -# 27241 "parsing/parser.ml" +# 28089 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27267,9 +28115,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Longident.t) = -# 1159 "parsing/parser.mly" +# 1239 "parsing/parser.mly" ( _1 ) -# 27273 "parsing/parser.ml" +# 28121 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27299,9 +28147,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = -# 1134 "parsing/parser.mly" +# 1214 "parsing/parser.mly" ( _1 ) -# 27305 "parsing/parser.ml" +# 28153 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27331,9 +28179,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 1139 "parsing/parser.mly" +# 1219 "parsing/parser.mly" ( _1 ) -# 27337 "parsing/parser.ml" +# 28185 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27363,9 +28211,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Longident.t) = -# 1164 "parsing/parser.mly" +# 1244 "parsing/parser.mly" ( _1 ) -# 27369 "parsing/parser.ml" +# 28217 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27395,9 +28243,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Longident.t) = -# 1169 "parsing/parser.mly" +# 1249 "parsing/parser.mly" ( _1 ) -# 27401 "parsing/parser.ml" +# 28249 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27427,9 +28275,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Longident.t) = -# 1149 "parsing/parser.mly" +# 1229 "parsing/parser.mly" ( _1 ) -# 27433 "parsing/parser.ml" +# 28281 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27459,9 +28307,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = -# 1144 "parsing/parser.mly" +# 1224 "parsing/parser.mly" ( _1 ) -# 27465 "parsing/parser.ml" +# 28313 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27491,9 +28339,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Longident.t) = -# 1154 "parsing/parser.mly" +# 1234 "parsing/parser.mly" ( _1 ) -# 27497 "parsing/parser.ml" +# 28345 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27535,15 +28383,15 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in -# 2668 "parsing/parser.mly" +# 2780 "parsing/parser.mly" ( mkpat_cons ~loc:_sloc _loc__2_ (ghpat ~loc:_sloc (Ppat_tuple[_1;_3])) ) -# 27541 "parsing/parser.ml" +# 28389 "parsing/parser.ml" in -# 2656 "parsing/parser.mly" +# 2768 "parsing/parser.mly" ( _1 ) -# 27547 "parsing/parser.ml" +# 28395 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27573,14 +28421,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = let _1 = -# 2670 "parsing/parser.mly" +# 2782 "parsing/parser.mly" ( Pat.attr _1 _2 ) -# 27579 "parsing/parser.ml" +# 28427 "parsing/parser.ml" in -# 2656 "parsing/parser.mly" +# 2768 "parsing/parser.mly" ( _1 ) -# 27584 "parsing/parser.ml" +# 28432 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27603,14 +28451,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = -# 2672 "parsing/parser.mly" +# 2784 "parsing/parser.mly" ( _1 ) -# 27609 "parsing/parser.ml" +# 28457 "parsing/parser.ml" in -# 2656 "parsing/parser.mly" +# 2768 "parsing/parser.mly" ( _1 ) -# 27614 "parsing/parser.ml" +# 28462 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27655,15 +28503,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 27661 "parsing/parser.ml" +# 28509 "parsing/parser.ml" in -# 2675 "parsing/parser.mly" +# 2787 "parsing/parser.mly" ( Ppat_alias(_1, _3) ) -# 27667 "parsing/parser.ml" +# 28515 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -27671,21 +28519,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27677 "parsing/parser.ml" +# 28525 "parsing/parser.ml" in -# 2686 "parsing/parser.mly" +# 2798 "parsing/parser.mly" ( _1 ) -# 27683 "parsing/parser.ml" +# 28531 "parsing/parser.ml" in -# 2656 "parsing/parser.mly" +# 2768 "parsing/parser.mly" ( _1 ) -# 27689 "parsing/parser.ml" +# 28537 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27726,9 +28574,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2677 "parsing/parser.mly" +# 2789 "parsing/parser.mly" ( expecting _loc__3_ "identifier" ) -# 27732 "parsing/parser.ml" +# 28580 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -27736,21 +28584,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27742 "parsing/parser.ml" +# 28590 "parsing/parser.ml" in -# 2686 "parsing/parser.mly" +# 2798 "parsing/parser.mly" ( _1 ) -# 27748 "parsing/parser.ml" +# 28596 "parsing/parser.ml" in -# 2656 "parsing/parser.mly" +# 2768 "parsing/parser.mly" ( _1 ) -# 27754 "parsing/parser.ml" +# 28602 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27775,29 +28623,29 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _1 = -# 2679 "parsing/parser.mly" +# 2791 "parsing/parser.mly" ( Ppat_tuple(List.rev _1) ) -# 27781 "parsing/parser.ml" +# 28629 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27789 "parsing/parser.ml" +# 28637 "parsing/parser.ml" in -# 2686 "parsing/parser.mly" +# 2798 "parsing/parser.mly" ( _1 ) -# 27795 "parsing/parser.ml" +# 28643 "parsing/parser.ml" in -# 2656 "parsing/parser.mly" +# 2768 "parsing/parser.mly" ( _1 ) -# 27801 "parsing/parser.ml" +# 28649 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27838,9 +28686,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2681 "parsing/parser.mly" +# 2793 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 27844 "parsing/parser.ml" +# 28692 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -27848,21 +28696,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27854 "parsing/parser.ml" +# 28702 "parsing/parser.ml" in -# 2686 "parsing/parser.mly" +# 2798 "parsing/parser.mly" ( _1 ) -# 27860 "parsing/parser.ml" +# 28708 "parsing/parser.ml" in -# 2656 "parsing/parser.mly" +# 2768 "parsing/parser.mly" ( _1 ) -# 27866 "parsing/parser.ml" +# 28714 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27901,30 +28749,30 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _1 = -# 2683 "parsing/parser.mly" +# 2795 "parsing/parser.mly" ( Ppat_or(_1, _3) ) -# 27907 "parsing/parser.ml" +# 28755 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27916 "parsing/parser.ml" +# 28764 "parsing/parser.ml" in -# 2686 "parsing/parser.mly" +# 2798 "parsing/parser.mly" ( _1 ) -# 27922 "parsing/parser.ml" +# 28770 "parsing/parser.ml" in -# 2656 "parsing/parser.mly" +# 2768 "parsing/parser.mly" ( _1 ) -# 27928 "parsing/parser.ml" +# 28776 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27965,9 +28813,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2685 "parsing/parser.mly" +# 2797 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 27971 "parsing/parser.ml" +# 28819 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -27975,21 +28823,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27981 "parsing/parser.ml" +# 28829 "parsing/parser.ml" in -# 2686 "parsing/parser.mly" +# 2798 "parsing/parser.mly" ( _1 ) -# 27987 "parsing/parser.ml" +# 28835 "parsing/parser.ml" in -# 2656 "parsing/parser.mly" +# 2768 "parsing/parser.mly" ( _1 ) -# 27993 "parsing/parser.ml" +# 28841 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28037,24 +28885,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 28043 "parsing/parser.ml" +# 28891 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 28049 "parsing/parser.ml" +# 28897 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2658 "parsing/parser.mly" +# 2770 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_exception _3) _2) -# 28058 "parsing/parser.ml" +# 28906 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28091,9 +28939,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = -# 2782 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _3 :: _1 ) -# 28097 "parsing/parser.ml" +# 28945 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28130,9 +28978,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = -# 2783 "parsing/parser.mly" +# 2895 "parsing/parser.mly" ( [_3; _1] ) -# 28136 "parsing/parser.ml" +# 28984 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28170,9 +29018,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2784 "parsing/parser.mly" +# 2896 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 28176 "parsing/parser.ml" +# 29024 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28209,9 +29057,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = -# 2782 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _3 :: _1 ) -# 28215 "parsing/parser.ml" +# 29063 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28248,9 +29096,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = -# 2783 "parsing/parser.mly" +# 2895 "parsing/parser.mly" ( [_3; _1] ) -# 28254 "parsing/parser.ml" +# 29102 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28288,9 +29136,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2784 "parsing/parser.mly" +# 2896 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 28294 "parsing/parser.ml" +# 29142 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28313,9 +29161,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2691 "parsing/parser.mly" +# 2803 "parsing/parser.mly" ( _1 ) -# 28319 "parsing/parser.ml" +# 29167 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28351,15 +29199,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 28357 "parsing/parser.ml" +# 29205 "parsing/parser.ml" in -# 2694 "parsing/parser.mly" +# 2806 "parsing/parser.mly" ( Ppat_construct(_1, Some _2) ) -# 28363 "parsing/parser.ml" +# 29211 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -28367,15 +29215,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28373 "parsing/parser.ml" +# 29221 "parsing/parser.ml" in -# 2697 "parsing/parser.mly" +# 2809 "parsing/parser.mly" ( _1 ) -# 28379 "parsing/parser.ml" +# 29227 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28406,24 +29254,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2696 "parsing/parser.mly" +# 2808 "parsing/parser.mly" ( Ppat_variant(_1, Some _2) ) -# 28412 "parsing/parser.ml" +# 29260 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28421 "parsing/parser.ml" +# 29269 "parsing/parser.ml" in -# 2697 "parsing/parser.mly" +# 2809 "parsing/parser.mly" ( _1 ) -# 28427 "parsing/parser.ml" +# 29275 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28471,24 +29319,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 28477 "parsing/parser.ml" +# 29325 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 28483 "parsing/parser.ml" +# 29331 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2699 "parsing/parser.mly" +# 2811 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_lazy _3) _2) -# 28492 "parsing/parser.ml" +# 29340 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28530,15 +29378,15 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in -# 2668 "parsing/parser.mly" +# 2780 "parsing/parser.mly" ( mkpat_cons ~loc:_sloc _loc__2_ (ghpat ~loc:_sloc (Ppat_tuple[_1;_3])) ) -# 28536 "parsing/parser.ml" +# 29384 "parsing/parser.ml" in -# 2663 "parsing/parser.mly" +# 2775 "parsing/parser.mly" ( _1 ) -# 28542 "parsing/parser.ml" +# 29390 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28568,14 +29416,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = let _1 = -# 2670 "parsing/parser.mly" +# 2782 "parsing/parser.mly" ( Pat.attr _1 _2 ) -# 28574 "parsing/parser.ml" +# 29422 "parsing/parser.ml" in -# 2663 "parsing/parser.mly" +# 2775 "parsing/parser.mly" ( _1 ) -# 28579 "parsing/parser.ml" +# 29427 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28598,14 +29446,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = -# 2672 "parsing/parser.mly" +# 2784 "parsing/parser.mly" ( _1 ) -# 28604 "parsing/parser.ml" +# 29452 "parsing/parser.ml" in -# 2663 "parsing/parser.mly" +# 2775 "parsing/parser.mly" ( _1 ) -# 28609 "parsing/parser.ml" +# 29457 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28650,15 +29498,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 28656 "parsing/parser.ml" +# 29504 "parsing/parser.ml" in -# 2675 "parsing/parser.mly" +# 2787 "parsing/parser.mly" ( Ppat_alias(_1, _3) ) -# 28662 "parsing/parser.ml" +# 29510 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -28666,21 +29514,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28672 "parsing/parser.ml" +# 29520 "parsing/parser.ml" in -# 2686 "parsing/parser.mly" +# 2798 "parsing/parser.mly" ( _1 ) -# 28678 "parsing/parser.ml" +# 29526 "parsing/parser.ml" in -# 2663 "parsing/parser.mly" +# 2775 "parsing/parser.mly" ( _1 ) -# 28684 "parsing/parser.ml" +# 29532 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28721,9 +29569,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2677 "parsing/parser.mly" +# 2789 "parsing/parser.mly" ( expecting _loc__3_ "identifier" ) -# 28727 "parsing/parser.ml" +# 29575 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -28731,21 +29579,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28737 "parsing/parser.ml" +# 29585 "parsing/parser.ml" in -# 2686 "parsing/parser.mly" +# 2798 "parsing/parser.mly" ( _1 ) -# 28743 "parsing/parser.ml" +# 29591 "parsing/parser.ml" in -# 2663 "parsing/parser.mly" +# 2775 "parsing/parser.mly" ( _1 ) -# 28749 "parsing/parser.ml" +# 29597 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28770,29 +29618,29 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _1 = -# 2679 "parsing/parser.mly" +# 2791 "parsing/parser.mly" ( Ppat_tuple(List.rev _1) ) -# 28776 "parsing/parser.ml" +# 29624 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28784 "parsing/parser.ml" +# 29632 "parsing/parser.ml" in -# 2686 "parsing/parser.mly" +# 2798 "parsing/parser.mly" ( _1 ) -# 28790 "parsing/parser.ml" +# 29638 "parsing/parser.ml" in -# 2663 "parsing/parser.mly" +# 2775 "parsing/parser.mly" ( _1 ) -# 28796 "parsing/parser.ml" +# 29644 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28833,9 +29681,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2681 "parsing/parser.mly" +# 2793 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 28839 "parsing/parser.ml" +# 29687 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -28843,21 +29691,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28849 "parsing/parser.ml" +# 29697 "parsing/parser.ml" in -# 2686 "parsing/parser.mly" +# 2798 "parsing/parser.mly" ( _1 ) -# 28855 "parsing/parser.ml" +# 29703 "parsing/parser.ml" in -# 2663 "parsing/parser.mly" +# 2775 "parsing/parser.mly" ( _1 ) -# 28861 "parsing/parser.ml" +# 29709 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28896,30 +29744,30 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _1 = -# 2683 "parsing/parser.mly" +# 2795 "parsing/parser.mly" ( Ppat_or(_1, _3) ) -# 28902 "parsing/parser.ml" +# 29750 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28911 "parsing/parser.ml" +# 29759 "parsing/parser.ml" in -# 2686 "parsing/parser.mly" +# 2798 "parsing/parser.mly" ( _1 ) -# 28917 "parsing/parser.ml" +# 29765 "parsing/parser.ml" in -# 2663 "parsing/parser.mly" +# 2775 "parsing/parser.mly" ( _1 ) -# 28923 "parsing/parser.ml" +# 29771 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28960,9 +29808,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2685 "parsing/parser.mly" +# 2797 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 28966 "parsing/parser.ml" +# 29814 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -28970,21 +29818,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28976 "parsing/parser.ml" +# 29824 "parsing/parser.ml" in -# 2686 "parsing/parser.mly" +# 2798 "parsing/parser.mly" ( _1 ) -# 28982 "parsing/parser.ml" +# 29830 "parsing/parser.ml" in -# 2663 "parsing/parser.mly" +# 2775 "parsing/parser.mly" ( _1 ) -# 28988 "parsing/parser.ml" +# 29836 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29003,9 +29851,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 29009 "parsing/parser.ml" +# 29857 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -29017,30 +29865,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 29023 "parsing/parser.ml" +# 29871 "parsing/parser.ml" in -# 2110 "parsing/parser.mly" +# 2194 "parsing/parser.mly" ( Ppat_var _1 ) -# 29029 "parsing/parser.ml" +# 29877 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 29038 "parsing/parser.ml" +# 29886 "parsing/parser.ml" in -# 2112 "parsing/parser.mly" +# 2196 "parsing/parser.mly" ( _1 ) -# 29044 "parsing/parser.ml" +# 29892 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29064,23 +29912,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2111 "parsing/parser.mly" +# 2195 "parsing/parser.mly" ( Ppat_any ) -# 29070 "parsing/parser.ml" +# 29918 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 29078 "parsing/parser.ml" +# 29926 "parsing/parser.ml" in -# 2112 "parsing/parser.mly" +# 2196 "parsing/parser.mly" ( _1 ) -# 29084 "parsing/parser.ml" +# 29932 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29103,9 +29951,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.payload) = -# 3806 "parsing/parser.mly" +# 3956 "parsing/parser.mly" ( PStr _1 ) -# 29109 "parsing/parser.ml" +# 29957 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29135,9 +29983,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.payload) = -# 3807 "parsing/parser.mly" +# 3957 "parsing/parser.mly" ( PSig _2 ) -# 29141 "parsing/parser.ml" +# 29989 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29167,9 +30015,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.payload) = -# 3808 "parsing/parser.mly" +# 3958 "parsing/parser.mly" ( PTyp _2 ) -# 29173 "parsing/parser.ml" +# 30021 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29199,9 +30047,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.payload) = -# 3809 "parsing/parser.mly" +# 3959 "parsing/parser.mly" ( PPat (_2, None) ) -# 29205 "parsing/parser.ml" +# 30053 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29245,9 +30093,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.payload) = -# 3810 "parsing/parser.mly" +# 3960 "parsing/parser.mly" ( PPat (_2, Some _4) ) -# 29251 "parsing/parser.ml" +# 30099 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29270,9 +30118,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 3209 "parsing/parser.mly" +# 3326 "parsing/parser.mly" ( _1 ) -# 29276 "parsing/parser.ml" +# 30124 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29315,24 +30163,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 29319 "parsing/parser.ml" +# 30167 "parsing/parser.ml" in -# 919 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( xs ) -# 29324 "parsing/parser.ml" +# 30172 "parsing/parser.ml" in -# 3201 "parsing/parser.mly" +# 3318 "parsing/parser.mly" ( _1 ) -# 29330 "parsing/parser.ml" +# 30178 "parsing/parser.ml" in -# 3205 "parsing/parser.mly" +# 3322 "parsing/parser.mly" ( Ptyp_poly(_1, _3) ) -# 29336 "parsing/parser.ml" +# 30184 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_xs_) in @@ -29340,15 +30188,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 29346 "parsing/parser.ml" +# 30194 "parsing/parser.ml" in -# 3211 "parsing/parser.mly" +# 3328 "parsing/parser.mly" ( _1 ) -# 29352 "parsing/parser.ml" +# 30200 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29371,14 +30219,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = -# 3240 "parsing/parser.mly" +# 3357 "parsing/parser.mly" ( _1 ) -# 29377 "parsing/parser.ml" +# 30225 "parsing/parser.ml" in -# 3209 "parsing/parser.mly" +# 3326 "parsing/parser.mly" ( _1 ) -# 29382 "parsing/parser.ml" +# 30230 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29417,33 +30265,33 @@ module Tables = struct let _v : (Parsetree.core_type) = let _1 = let _1 = let _3 = -# 3240 "parsing/parser.mly" +# 3357 "parsing/parser.mly" ( _1 ) -# 29423 "parsing/parser.ml" +# 30271 "parsing/parser.ml" in let _1 = let _1 = let xs = # 253 "" ( List.rev xs ) -# 29430 "parsing/parser.ml" +# 30278 "parsing/parser.ml" in -# 919 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( xs ) -# 29435 "parsing/parser.ml" +# 30283 "parsing/parser.ml" in -# 3201 "parsing/parser.mly" +# 3318 "parsing/parser.mly" ( _1 ) -# 29441 "parsing/parser.ml" +# 30289 "parsing/parser.ml" in -# 3205 "parsing/parser.mly" +# 3322 "parsing/parser.mly" ( Ptyp_poly(_1, _3) ) -# 29447 "parsing/parser.ml" +# 30295 "parsing/parser.ml" in let _startpos__1_ = _startpos_xs_ in @@ -29451,15 +30299,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 29457 "parsing/parser.ml" +# 30305 "parsing/parser.ml" in -# 3211 "parsing/parser.mly" +# 3328 "parsing/parser.mly" ( _1 ) -# 29463 "parsing/parser.ml" +# 30311 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29506,9 +30354,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3769 "parsing/parser.mly" +# 3919 "parsing/parser.mly" ( Attr.mk ~loc:(make_loc _sloc) _2 _3 ) -# 29512 "parsing/parser.ml" +# 30360 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29589,9 +30437,9 @@ module Tables = struct let _v : (Parsetree.value_description * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 29595 "parsing/parser.ml" +# 30443 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -29601,30 +30449,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 29607 "parsing/parser.ml" +# 30455 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 29615 "parsing/parser.ml" +# 30463 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2846 "parsing/parser.mly" +# 2958 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Val.mk id ty ~prim ~attrs ~loc ~docs, ext ) -# 29628 "parsing/parser.ml" +# 30476 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29640,14 +30488,14 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.private_flag) = let _1 = -# 3637 "parsing/parser.mly" +# 3779 "parsing/parser.mly" ( Public ) -# 29646 "parsing/parser.ml" +# 30494 "parsing/parser.ml" in -# 3634 "parsing/parser.mly" +# 3776 "parsing/parser.mly" ( _1 ) -# 29651 "parsing/parser.ml" +# 30499 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29670,14 +30518,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = let _1 = -# 3638 "parsing/parser.mly" +# 3780 "parsing/parser.mly" ( Private ) -# 29676 "parsing/parser.ml" +# 30524 "parsing/parser.ml" in -# 3634 "parsing/parser.mly" +# 3776 "parsing/parser.mly" ( _1 ) -# 29681 "parsing/parser.ml" +# 30529 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29693,9 +30541,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3660 "parsing/parser.mly" +# 3808 "parsing/parser.mly" ( Public, Concrete ) -# 29699 "parsing/parser.ml" +# 30547 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29718,9 +30566,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3661 "parsing/parser.mly" +# 3809 "parsing/parser.mly" ( Private, Concrete ) -# 29724 "parsing/parser.ml" +# 30572 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29743,9 +30591,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3662 "parsing/parser.mly" +# 3810 "parsing/parser.mly" ( Public, Virtual ) -# 29749 "parsing/parser.ml" +# 30597 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29775,9 +30623,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3663 "parsing/parser.mly" +# 3811 "parsing/parser.mly" ( Private, Virtual ) -# 29781 "parsing/parser.ml" +# 30629 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29807,9 +30655,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3664 "parsing/parser.mly" +# 3812 "parsing/parser.mly" ( Private, Virtual ) -# 29813 "parsing/parser.ml" +# 30661 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29825,9 +30673,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.rec_flag) = -# 3617 "parsing/parser.mly" +# 3759 "parsing/parser.mly" ( Nonrecursive ) -# 29831 "parsing/parser.ml" +# 30679 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29850,9 +30698,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.rec_flag) = -# 3618 "parsing/parser.mly" +# 3760 "parsing/parser.mly" ( Recursive ) -# 29856 "parsing/parser.ml" +# 30704 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29878,12 +30726,12 @@ module Tables = struct (Longident.t Asttypes.loc * Parsetree.expression) list) = let eo = # 124 "" ( None ) -# 29882 "parsing/parser.ml" +# 30730 "parsing/parser.ml" in -# 2588 "parsing/parser.mly" +# 2700 "parsing/parser.mly" ( eo, fields ) -# 29887 "parsing/parser.ml" +# 30735 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29924,18 +30772,18 @@ module Tables = struct let x = # 191 "" ( x ) -# 29928 "parsing/parser.ml" +# 30776 "parsing/parser.ml" in # 126 "" ( Some x ) -# 29933 "parsing/parser.ml" +# 30781 "parsing/parser.ml" in -# 2588 "parsing/parser.mly" +# 2700 "parsing/parser.mly" ( eo, fields ) -# 29939 "parsing/parser.ml" +# 30787 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29960,17 +30808,17 @@ module Tables = struct let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : (Parsetree.constructor_declaration list) = let x = -# 3031 "parsing/parser.mly" +# 3143 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Type.constructor cid ~args ?res ~attrs ~loc ~info ) -# 29969 "parsing/parser.ml" +# 30817 "parsing/parser.ml" in -# 1029 "parsing/parser.mly" +# 1109 "parsing/parser.mly" ( [x] ) -# 29974 "parsing/parser.ml" +# 30822 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29995,17 +30843,17 @@ module Tables = struct let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : (Parsetree.constructor_declaration list) = let x = -# 3031 "parsing/parser.mly" +# 3143 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Type.constructor cid ~args ?res ~attrs ~loc ~info ) -# 30004 "parsing/parser.ml" +# 30852 "parsing/parser.ml" in -# 1032 "parsing/parser.mly" +# 1112 "parsing/parser.mly" ( [x] ) -# 30009 "parsing/parser.ml" +# 30857 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30037,17 +30885,17 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_d_ in let _v : (Parsetree.constructor_declaration list) = let x = -# 3031 "parsing/parser.mly" +# 3143 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Type.constructor cid ~args ?res ~attrs ~loc ~info ) -# 30046 "parsing/parser.ml" +# 30894 "parsing/parser.ml" in -# 1036 "parsing/parser.mly" +# 1116 "parsing/parser.mly" ( x :: xs ) -# 30051 "parsing/parser.ml" +# 30899 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30073,23 +30921,23 @@ module Tables = struct let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = let _1 = -# 3143 "parsing/parser.mly" +# 3260 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Te.decl cid ~args ?res ~attrs ~loc ~info ) -# 30082 "parsing/parser.ml" +# 30930 "parsing/parser.ml" in -# 3137 "parsing/parser.mly" +# 3254 "parsing/parser.mly" ( _1 ) -# 30087 "parsing/parser.ml" +# 30935 "parsing/parser.ml" in -# 1029 "parsing/parser.mly" +# 1109 "parsing/parser.mly" ( [x] ) -# 30093 "parsing/parser.ml" +# 30941 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30112,14 +30960,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3139 "parsing/parser.mly" +# 3256 "parsing/parser.mly" ( _1 ) -# 30118 "parsing/parser.ml" +# 30966 "parsing/parser.ml" in -# 1029 "parsing/parser.mly" +# 1109 "parsing/parser.mly" ( [x] ) -# 30123 "parsing/parser.ml" +# 30971 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30145,23 +30993,23 @@ module Tables = struct let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = let _1 = -# 3143 "parsing/parser.mly" +# 3260 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Te.decl cid ~args ?res ~attrs ~loc ~info ) -# 30154 "parsing/parser.ml" +# 31002 "parsing/parser.ml" in -# 3137 "parsing/parser.mly" +# 3254 "parsing/parser.mly" ( _1 ) -# 30159 "parsing/parser.ml" +# 31007 "parsing/parser.ml" in -# 1032 "parsing/parser.mly" +# 1112 "parsing/parser.mly" ( [x] ) -# 30165 "parsing/parser.ml" +# 31013 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30184,14 +31032,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3139 "parsing/parser.mly" +# 3256 "parsing/parser.mly" ( _1 ) -# 30190 "parsing/parser.ml" +# 31038 "parsing/parser.ml" in -# 1032 "parsing/parser.mly" +# 1112 "parsing/parser.mly" ( [x] ) -# 30195 "parsing/parser.ml" +# 31043 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30224,23 +31072,23 @@ module Tables = struct let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = let _1 = -# 3143 "parsing/parser.mly" +# 3260 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Te.decl cid ~args ?res ~attrs ~loc ~info ) -# 30233 "parsing/parser.ml" +# 31081 "parsing/parser.ml" in -# 3137 "parsing/parser.mly" +# 3254 "parsing/parser.mly" ( _1 ) -# 30238 "parsing/parser.ml" +# 31086 "parsing/parser.ml" in -# 1036 "parsing/parser.mly" +# 1116 "parsing/parser.mly" ( x :: xs ) -# 30244 "parsing/parser.ml" +# 31092 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30270,14 +31118,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos__1_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3139 "parsing/parser.mly" +# 3256 "parsing/parser.mly" ( _1 ) -# 30276 "parsing/parser.ml" +# 31124 "parsing/parser.ml" in -# 1036 "parsing/parser.mly" +# 1116 "parsing/parser.mly" ( x :: xs ) -# 30281 "parsing/parser.ml" +# 31129 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30302,17 +31150,17 @@ module Tables = struct let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3143 "parsing/parser.mly" +# 3260 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Te.decl cid ~args ?res ~attrs ~loc ~info ) -# 30311 "parsing/parser.ml" +# 31159 "parsing/parser.ml" in -# 1029 "parsing/parser.mly" +# 1109 "parsing/parser.mly" ( [x] ) -# 30316 "parsing/parser.ml" +# 31164 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30337,17 +31185,17 @@ module Tables = struct let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3143 "parsing/parser.mly" +# 3260 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Te.decl cid ~args ?res ~attrs ~loc ~info ) -# 30346 "parsing/parser.ml" +# 31194 "parsing/parser.ml" in -# 1032 "parsing/parser.mly" +# 1112 "parsing/parser.mly" ( [x] ) -# 30351 "parsing/parser.ml" +# 31199 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30379,17 +31227,17 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3143 "parsing/parser.mly" +# 3260 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Te.decl cid ~args ?res ~attrs ~loc ~info ) -# 30388 "parsing/parser.ml" +# 31236 "parsing/parser.ml" in -# 1036 "parsing/parser.mly" +# 1116 "parsing/parser.mly" ( x :: xs ) -# 30393 "parsing/parser.ml" +# 31241 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30405,9 +31253,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = -# 895 "parsing/parser.mly" +# 975 "parsing/parser.mly" ( [] ) -# 30411 "parsing/parser.ml" +# 31259 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30464,21 +31312,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1990 "parsing/parser.mly" +# 2070 "parsing/parser.mly" ( _1, _3, make_loc _sloc ) -# 30470 "parsing/parser.ml" +# 31318 "parsing/parser.ml" in # 183 "" ( x ) -# 30476 "parsing/parser.ml" +# 31324 "parsing/parser.ml" in -# 897 "parsing/parser.mly" +# 977 "parsing/parser.mly" ( x :: xs ) -# 30482 "parsing/parser.ml" +# 31330 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30501,9 +31349,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : ((Lexing.position * Parsetree.functor_parameter) list) = -# 909 "parsing/parser.mly" +# 989 "parsing/parser.mly" ( [ x ] ) -# 30507 "parsing/parser.ml" +# 31355 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30533,9 +31381,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : ((Lexing.position * Parsetree.functor_parameter) list) = -# 911 "parsing/parser.mly" +# 991 "parsing/parser.mly" ( x :: xs ) -# 30539 "parsing/parser.ml" +# 31387 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30558,9 +31406,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : ((Asttypes.arg_label * Parsetree.expression) list) = -# 909 "parsing/parser.mly" +# 989 "parsing/parser.mly" ( [ x ] ) -# 30564 "parsing/parser.ml" +# 31412 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30590,9 +31438,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : ((Asttypes.arg_label * Parsetree.expression) list) = -# 911 "parsing/parser.mly" +# 991 "parsing/parser.mly" ( x :: xs ) -# 30596 "parsing/parser.ml" +# 31444 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30615,9 +31463,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Asttypes.label list) = -# 909 "parsing/parser.mly" +# 989 "parsing/parser.mly" ( [ x ] ) -# 30621 "parsing/parser.ml" +# 31469 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30647,9 +31495,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Asttypes.label list) = -# 911 "parsing/parser.mly" +# 991 "parsing/parser.mly" ( x :: xs ) -# 30653 "parsing/parser.ml" +# 31501 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30685,21 +31533,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30691 "parsing/parser.ml" +# 31539 "parsing/parser.ml" in -# 3197 "parsing/parser.mly" +# 3314 "parsing/parser.mly" ( _2 ) -# 30697 "parsing/parser.ml" +# 31545 "parsing/parser.ml" in -# 909 "parsing/parser.mly" +# 989 "parsing/parser.mly" ( [ x ] ) -# 30703 "parsing/parser.ml" +# 31551 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30742,21 +31590,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30748 "parsing/parser.ml" +# 31596 "parsing/parser.ml" in -# 3197 "parsing/parser.mly" +# 3314 "parsing/parser.mly" ( _2 ) -# 30754 "parsing/parser.ml" +# 31602 "parsing/parser.ml" in -# 911 "parsing/parser.mly" +# 991 "parsing/parser.mly" ( x :: xs ) -# 30760 "parsing/parser.ml" +# 31608 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30781,12 +31629,12 @@ module Tables = struct let _v : (Parsetree.case list) = let _1 = # 124 "" ( None ) -# 30785 "parsing/parser.ml" +# 31633 "parsing/parser.ml" in -# 1000 "parsing/parser.mly" +# 1080 "parsing/parser.mly" ( [x] ) -# 30790 "parsing/parser.ml" +# 31638 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30820,13 +31668,13 @@ module Tables = struct # 126 "" ( Some x ) -# 30824 "parsing/parser.ml" +# 31672 "parsing/parser.ml" in -# 1000 "parsing/parser.mly" +# 1080 "parsing/parser.mly" ( [x] ) -# 30830 "parsing/parser.ml" +# 31678 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30863,9 +31711,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.case list) = -# 1004 "parsing/parser.mly" +# 1084 "parsing/parser.mly" ( x :: xs ) -# 30869 "parsing/parser.ml" +# 31717 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30889,20 +31737,20 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type list) = let xs = let x = -# 3240 "parsing/parser.mly" +# 3357 "parsing/parser.mly" ( _1 ) -# 30895 "parsing/parser.ml" +# 31743 "parsing/parser.ml" in -# 935 "parsing/parser.mly" +# 1015 "parsing/parser.mly" ( [ x ] ) -# 30900 "parsing/parser.ml" +# 31748 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 30906 "parsing/parser.ml" +# 31754 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30940,20 +31788,20 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type list) = let xs = let x = -# 3240 "parsing/parser.mly" +# 3357 "parsing/parser.mly" ( _1 ) -# 30946 "parsing/parser.ml" +# 31794 "parsing/parser.ml" in -# 939 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( x :: xs ) -# 30951 "parsing/parser.ml" +# 31799 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 30957 "parsing/parser.ml" +# 31805 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30976,14 +31824,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Extensions.comprehension_clause list) = let xs = -# 935 "parsing/parser.mly" +# 1015 "parsing/parser.mly" ( [ x ] ) -# 30982 "parsing/parser.ml" +# 31830 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 30987 "parsing/parser.ml" +# 31835 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31020,14 +31868,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Extensions.comprehension_clause list) = let xs = -# 939 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( x :: xs ) -# 31026 "parsing/parser.ml" +# 31874 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 31031 "parsing/parser.ml" +# 31879 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31050,14 +31898,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Parsetree.with_constraint list) = let xs = -# 935 "parsing/parser.mly" +# 1015 "parsing/parser.mly" ( [ x ] ) -# 31056 "parsing/parser.ml" +# 31904 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 31061 "parsing/parser.ml" +# 31909 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31094,14 +31942,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.with_constraint list) = let xs = -# 939 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( x :: xs ) -# 31100 "parsing/parser.ml" +# 31948 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 31105 "parsing/parser.ml" +# 31953 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31124,14 +31972,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Parsetree.row_field list) = let xs = -# 935 "parsing/parser.mly" +# 1015 "parsing/parser.mly" ( [ x ] ) -# 31130 "parsing/parser.ml" +# 31978 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 31135 "parsing/parser.ml" +# 31983 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31168,14 +32016,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.row_field list) = let xs = -# 939 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( x :: xs ) -# 31174 "parsing/parser.ml" +# 32022 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 31179 "parsing/parser.ml" +# 32027 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31198,14 +32046,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = let xs = -# 935 "parsing/parser.mly" +# 1015 "parsing/parser.mly" ( [ x ] ) -# 31204 "parsing/parser.ml" +# 32052 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 31209 "parsing/parser.ml" +# 32057 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31242,14 +32090,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = let xs = -# 939 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( x :: xs ) -# 31248 "parsing/parser.ml" +# 32096 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 31253 "parsing/parser.ml" +# 32101 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31272,14 +32120,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = -# 935 "parsing/parser.mly" +# 1015 "parsing/parser.mly" ( [ x ] ) -# 31278 "parsing/parser.ml" +# 32126 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 31283 "parsing/parser.ml" +# 32131 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31316,14 +32164,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = -# 939 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( x :: xs ) -# 31322 "parsing/parser.ml" +# 32170 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 31327 "parsing/parser.ml" +# 32175 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31346,14 +32194,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = let xs = -# 935 "parsing/parser.mly" +# 1015 "parsing/parser.mly" ( [ x ] ) -# 31352 "parsing/parser.ml" +# 32200 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 31357 "parsing/parser.ml" +# 32205 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31390,14 +32238,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = let xs = -# 939 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( x :: xs ) -# 31396 "parsing/parser.ml" +# 32244 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( xs ) -# 31401 "parsing/parser.ml" +# 32249 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31434,9 +32282,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = -# 966 "parsing/parser.mly" +# 1046 "parsing/parser.mly" ( x :: xs ) -# 31440 "parsing/parser.ml" +# 32288 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31473,9 +32321,9 @@ module Tables = struct let _startpos = _startpos_x1_ in let _endpos = _endpos_x2_ in let _v : (Parsetree.core_type list) = -# 970 "parsing/parser.mly" +# 1050 "parsing/parser.mly" ( [ x2; x1 ] ) -# 31479 "parsing/parser.ml" +# 32327 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31512,9 +32360,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.expression list) = -# 966 "parsing/parser.mly" +# 1046 "parsing/parser.mly" ( x :: xs ) -# 31518 "parsing/parser.ml" +# 32366 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31551,9 +32399,9 @@ module Tables = struct let _startpos = _startpos_x1_ in let _endpos = _endpos_x2_ in let _v : (Parsetree.expression list) = -# 970 "parsing/parser.mly" +# 1050 "parsing/parser.mly" ( [ x2; x1 ] ) -# 31557 "parsing/parser.ml" +# 32405 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31590,9 +32438,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = -# 966 "parsing/parser.mly" +# 1046 "parsing/parser.mly" ( x :: xs ) -# 31596 "parsing/parser.ml" +# 32444 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31629,9 +32477,9 @@ module Tables = struct let _startpos = _startpos_x1_ in let _endpos = _endpos_x2_ in let _v : (Parsetree.core_type list) = -# 970 "parsing/parser.mly" +# 1050 "parsing/parser.mly" ( [ x2; x1 ] ) -# 31635 "parsing/parser.ml" +# 32483 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31654,9 +32502,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.row_field) = -# 3380 "parsing/parser.mly" +# 3522 "parsing/parser.mly" ( _1 ) -# 31660 "parsing/parser.ml" +# 32508 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31682,9 +32530,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3382 "parsing/parser.mly" +# 3524 "parsing/parser.mly" ( Rf.inherit_ ~loc:(make_loc _sloc) _1 ) -# 31688 "parsing/parser.ml" +# 32536 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31709,12 +32557,12 @@ module Tables = struct let _v : (Parsetree.expression list) = let _2 = # 124 "" ( None ) -# 31713 "parsing/parser.ml" +# 32561 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1067 "parsing/parser.mly" ( [x] ) -# 31718 "parsing/parser.ml" +# 32566 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31748,13 +32596,13 @@ module Tables = struct # 126 "" ( Some x ) -# 31752 "parsing/parser.ml" +# 32600 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1067 "parsing/parser.mly" ( [x] ) -# 31758 "parsing/parser.ml" +# 32606 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31791,9 +32639,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression list) = -# 991 "parsing/parser.mly" +# 1071 "parsing/parser.mly" ( x :: xs ) -# 31797 "parsing/parser.ml" +# 32645 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31819,9 +32667,9 @@ module Tables = struct } = _menhir_stack in let oe : (Parsetree.expression option) = Obj.magic oe in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 31825 "parsing/parser.ml" +# 32673 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -31829,22 +32677,22 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = let _2 = # 124 "" ( None ) -# 31833 "parsing/parser.ml" +# 32681 "parsing/parser.ml" in let x = let label = let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 31840 "parsing/parser.ml" +# 32688 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 31848 "parsing/parser.ml" +# 32696 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -31852,7 +32700,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2611 "parsing/parser.mly" +# 2723 "parsing/parser.mly" ( let e = match oe with | None -> @@ -31862,13 +32710,13 @@ module Tables = struct e in label, e ) -# 31866 "parsing/parser.ml" +# 32714 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1067 "parsing/parser.mly" ( [x] ) -# 31872 "parsing/parser.ml" +# 32720 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31901,9 +32749,9 @@ module Tables = struct let x : unit = Obj.magic x in let oe : (Parsetree.expression option) = Obj.magic oe in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 31907 "parsing/parser.ml" +# 32755 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -31911,22 +32759,22 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = let _2 = # 126 "" ( Some x ) -# 31915 "parsing/parser.ml" +# 32763 "parsing/parser.ml" in let x = let label = let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 31922 "parsing/parser.ml" +# 32770 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 31930 "parsing/parser.ml" +# 32778 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -31934,7 +32782,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2611 "parsing/parser.mly" +# 2723 "parsing/parser.mly" ( let e = match oe with | None -> @@ -31944,13 +32792,13 @@ module Tables = struct e in label, e ) -# 31948 "parsing/parser.ml" +# 32796 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1067 "parsing/parser.mly" ( [x] ) -# 31954 "parsing/parser.ml" +# 32802 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31990,9 +32838,9 @@ module Tables = struct let _2 : unit = Obj.magic _2 in let oe : (Parsetree.expression option) = Obj.magic oe in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 31996 "parsing/parser.ml" +# 32844 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -32000,17 +32848,17 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = let x = let label = let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 32006 "parsing/parser.ml" +# 32854 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 32014 "parsing/parser.ml" +# 32862 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -32018,7 +32866,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2611 "parsing/parser.mly" +# 2723 "parsing/parser.mly" ( let e = match oe with | None -> @@ -32028,13 +32876,13 @@ module Tables = struct e in label, e ) -# 32032 "parsing/parser.ml" +# 32880 "parsing/parser.ml" in -# 991 "parsing/parser.mly" +# 1071 "parsing/parser.mly" ( x :: xs ) -# 32038 "parsing/parser.ml" +# 32886 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32059,12 +32907,12 @@ module Tables = struct let _v : (Parsetree.pattern list) = let _2 = # 124 "" ( None ) -# 32063 "parsing/parser.ml" +# 32911 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1067 "parsing/parser.mly" ( [x] ) -# 32068 "parsing/parser.ml" +# 32916 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32098,13 +32946,13 @@ module Tables = struct # 126 "" ( Some x ) -# 32102 "parsing/parser.ml" +# 32950 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1067 "parsing/parser.mly" ( [x] ) -# 32108 "parsing/parser.ml" +# 32956 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32141,9 +32989,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.pattern list) = -# 991 "parsing/parser.mly" +# 1071 "parsing/parser.mly" ( x :: xs ) -# 32147 "parsing/parser.ml" +# 32995 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32182,7 +33030,7 @@ module Tables = struct let _v : ((Longident.t Asttypes.loc * Parsetree.expression) list) = let _2 = # 124 "" ( None ) -# 32186 "parsing/parser.ml" +# 33034 "parsing/parser.ml" in let x = let label = @@ -32190,9 +33038,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 32196 "parsing/parser.ml" +# 33044 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -32200,7 +33048,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2594 "parsing/parser.mly" +# 2706 "parsing/parser.mly" ( let e = match eo with | None -> @@ -32210,13 +33058,13 @@ module Tables = struct e in label, mkexp_opt_constraint ~loc:_sloc e c ) -# 32214 "parsing/parser.ml" +# 33062 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1067 "parsing/parser.mly" ( [x] ) -# 32220 "parsing/parser.ml" +# 33068 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32262,7 +33110,7 @@ module Tables = struct let _v : ((Longident.t Asttypes.loc * Parsetree.expression) list) = let _2 = # 126 "" ( Some x ) -# 32266 "parsing/parser.ml" +# 33114 "parsing/parser.ml" in let x = let label = @@ -32270,9 +33118,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 32276 "parsing/parser.ml" +# 33124 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -32280,7 +33128,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2594 "parsing/parser.mly" +# 2706 "parsing/parser.mly" ( let e = match eo with | None -> @@ -32290,13 +33138,13 @@ module Tables = struct e in label, mkexp_opt_constraint ~loc:_sloc e c ) -# 32294 "parsing/parser.ml" +# 33142 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1067 "parsing/parser.mly" ( [x] ) -# 32300 "parsing/parser.ml" +# 33148 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32352,9 +33200,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 32358 "parsing/parser.ml" +# 33206 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -32362,7 +33210,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2594 "parsing/parser.mly" +# 2706 "parsing/parser.mly" ( let e = match eo with | None -> @@ -32372,13 +33220,13 @@ module Tables = struct e in label, mkexp_opt_constraint ~loc:_sloc e c ) -# 32376 "parsing/parser.ml" +# 33224 "parsing/parser.ml" in -# 991 "parsing/parser.mly" +# 1071 "parsing/parser.mly" ( x :: xs ) -# 32382 "parsing/parser.ml" +# 33230 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32401,9 +33249,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = -# 2079 "parsing/parser.mly" +# 2159 "parsing/parser.mly" ( _1 ) -# 32407 "parsing/parser.ml" +# 33255 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32433,9 +33281,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 2080 "parsing/parser.mly" +# 2160 "parsing/parser.mly" ( _1 ) -# 32439 "parsing/parser.ml" +# 33287 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32473,24 +33321,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2082 "parsing/parser.mly" +# 2162 "parsing/parser.mly" ( Pexp_sequence(_1, _3) ) -# 32479 "parsing/parser.ml" +# 33327 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 32488 "parsing/parser.ml" +# 33336 "parsing/parser.ml" in -# 2083 "parsing/parser.mly" +# 2163 "parsing/parser.mly" ( _1 ) -# 32494 "parsing/parser.ml" +# 33342 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32544,11 +33392,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2085 "parsing/parser.mly" +# 2165 "parsing/parser.mly" ( let seq = mkexp ~loc:_sloc (Pexp_sequence (_1, _5)) in let payload = PStr [mkstrexp seq []] in mkexp ~loc:_sloc (Pexp_extension (_4, payload)) ) -# 32552 "parsing/parser.ml" +# 33400 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32615,18 +33463,18 @@ module Tables = struct let _v : (Parsetree.type_exception * string Asttypes.loc option) = let attrs = let _1 = _1_inlined4 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 32621 "parsing/parser.ml" +# 33469 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined4_ in let attrs2 = let _1 = _1_inlined3 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 32630 "parsing/parser.ml" +# 33478 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -32636,17 +33484,17 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 32642 "parsing/parser.ml" +# 33490 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 32650 "parsing/parser.ml" +# 33498 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in @@ -32654,14 +33502,14 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3061 "parsing/parser.mly" +# 3173 "parsing/parser.mly" ( let args, res = args_res in let loc = make_loc (_startpos, _endpos_attrs2_) in let docs = symbol_docs _sloc in Te.mk_exception ~attrs (Te.decl id ~args ?res ~attrs:(attrs1 @ attrs2) ~loc ~docs) , ext ) -# 32665 "parsing/parser.ml" +# 33513 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32687,21 +33535,21 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 32691 "parsing/parser.ml" +# 33539 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 810 "parsing/parser.mly" +# 890 "parsing/parser.mly" ( extra_sig _startpos _endpos _1 ) -# 32699 "parsing/parser.ml" +# 33547 "parsing/parser.ml" in -# 1547 "parsing/parser.mly" +# 1627 "parsing/parser.mly" ( _1 ) -# 32705 "parsing/parser.ml" +# 33553 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32733,9 +33581,9 @@ module Tables = struct let _v : (Parsetree.signature_item) = let _2 = let _1 = _1_inlined1 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 32739 "parsing/parser.ml" +# 33587 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -32743,10 +33591,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1562 "parsing/parser.mly" +# 1642 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mksig ~loc:_sloc (Psig_extension (_1, (add_docs_attrs docs _2))) ) -# 32750 "parsing/parser.ml" +# 33598 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32770,23 +33618,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1566 "parsing/parser.mly" +# 1646 "parsing/parser.mly" ( Psig_attribute _1 ) -# 32776 "parsing/parser.ml" +# 33624 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 858 "parsing/parser.mly" +# 938 "parsing/parser.mly" ( mksig ~loc:_sloc _1 ) -# 32784 "parsing/parser.ml" +# 33632 "parsing/parser.ml" in -# 1568 "parsing/parser.mly" +# 1648 "parsing/parser.mly" ( _1 ) -# 32790 "parsing/parser.ml" +# 33638 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32810,23 +33658,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1571 "parsing/parser.mly" +# 1651 "parsing/parser.mly" ( psig_value _1 ) -# 32816 "parsing/parser.ml" +# 33664 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 32824 "parsing/parser.ml" +# 33672 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 32830 "parsing/parser.ml" +# 33678 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32850,23 +33698,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1573 "parsing/parser.mly" +# 1653 "parsing/parser.mly" ( psig_value _1 ) -# 32856 "parsing/parser.ml" +# 33704 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 32864 "parsing/parser.ml" +# 33712 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 32870 "parsing/parser.ml" +# 33718 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32901,26 +33749,26 @@ module Tables = struct let _1 = let _1 = let _1 = -# 1048 "parsing/parser.mly" +# 1128 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 32907 "parsing/parser.ml" +# 33755 "parsing/parser.ml" in -# 2882 "parsing/parser.mly" +# 2994 "parsing/parser.mly" ( _1 ) -# 32912 "parsing/parser.ml" +# 33760 "parsing/parser.ml" in -# 2865 "parsing/parser.mly" +# 2977 "parsing/parser.mly" ( _1 ) -# 32918 "parsing/parser.ml" +# 33766 "parsing/parser.ml" in -# 1575 "parsing/parser.mly" +# 1655 "parsing/parser.mly" ( psig_type _1 ) -# 32924 "parsing/parser.ml" +# 33772 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in @@ -32928,15 +33776,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 32934 "parsing/parser.ml" +# 33782 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 32940 "parsing/parser.ml" +# 33788 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32971,26 +33819,26 @@ module Tables = struct let _1 = let _1 = let _1 = -# 1048 "parsing/parser.mly" +# 1128 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 32977 "parsing/parser.ml" +# 33825 "parsing/parser.ml" in -# 2882 "parsing/parser.mly" +# 2994 "parsing/parser.mly" ( _1 ) -# 32982 "parsing/parser.ml" +# 33830 "parsing/parser.ml" in -# 2870 "parsing/parser.mly" +# 2982 "parsing/parser.mly" ( _1 ) -# 32988 "parsing/parser.ml" +# 33836 "parsing/parser.ml" in -# 1577 "parsing/parser.mly" +# 1657 "parsing/parser.mly" ( psig_typesubst _1 ) -# 32994 "parsing/parser.ml" +# 33842 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in @@ -32998,15 +33846,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33004 "parsing/parser.ml" +# 33852 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 33010 "parsing/parser.ml" +# 33858 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33091,16 +33939,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 33097 "parsing/parser.ml" +# 33945 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let cs = -# 1040 "parsing/parser.mly" +# 1120 "parsing/parser.mly" ( List.rev xs ) -# 33104 "parsing/parser.ml" +# 33952 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in @@ -33108,46 +33956,46 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 33114 "parsing/parser.ml" +# 33962 "parsing/parser.ml" in let _4 = -# 3625 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( Recursive ) -# 33120 "parsing/parser.ml" +# 33968 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 33127 "parsing/parser.ml" +# 33975 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3130 "parsing/parser.mly" +# 3247 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in Te.mk tid cs ~params ~priv ~attrs ~docs, ext ) -# 33139 "parsing/parser.ml" +# 33987 "parsing/parser.ml" in -# 3117 "parsing/parser.mly" +# 3234 "parsing/parser.mly" ( _1 ) -# 33145 "parsing/parser.ml" +# 33993 "parsing/parser.ml" in -# 1579 "parsing/parser.mly" +# 1659 "parsing/parser.mly" ( psig_typext _1 ) -# 33151 "parsing/parser.ml" +# 33999 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -33155,15 +34003,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33161 "parsing/parser.ml" +# 34009 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 33167 "parsing/parser.ml" +# 34015 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33255,16 +34103,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 33261 "parsing/parser.ml" +# 34109 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in let cs = -# 1040 "parsing/parser.mly" +# 1120 "parsing/parser.mly" ( List.rev xs ) -# 33268 "parsing/parser.ml" +# 34116 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in @@ -33272,9 +34120,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 33278 "parsing/parser.ml" +# 34126 "parsing/parser.ml" in let _4 = @@ -33283,41 +34131,41 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3626 "parsing/parser.mly" +# 3768 "parsing/parser.mly" ( not_expecting _loc "nonrec flag" ) -# 33289 "parsing/parser.ml" +# 34137 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 33297 "parsing/parser.ml" +# 34145 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3130 "parsing/parser.mly" +# 3247 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in Te.mk tid cs ~params ~priv ~attrs ~docs, ext ) -# 33309 "parsing/parser.ml" +# 34157 "parsing/parser.ml" in -# 3117 "parsing/parser.mly" +# 3234 "parsing/parser.mly" ( _1 ) -# 33315 "parsing/parser.ml" +# 34163 "parsing/parser.ml" in -# 1579 "parsing/parser.mly" +# 1659 "parsing/parser.mly" ( psig_typext _1 ) -# 33321 "parsing/parser.ml" +# 34169 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -33325,15 +34173,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33331 "parsing/parser.ml" +# 34179 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 33337 "parsing/parser.ml" +# 34185 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33357,23 +34205,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1581 "parsing/parser.mly" +# 1661 "parsing/parser.mly" ( psig_exception _1 ) -# 33363 "parsing/parser.ml" +# 34211 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33371 "parsing/parser.ml" +# 34219 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 33377 "parsing/parser.ml" +# 34225 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33436,9 +34284,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 33442 "parsing/parser.ml" +# 34290 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -33448,37 +34296,37 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 33454 "parsing/parser.ml" +# 34302 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 33462 "parsing/parser.ml" +# 34310 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1610 "parsing/parser.mly" +# 1690 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Md.mk name body ~attrs ~loc ~docs, ext ) -# 33476 "parsing/parser.ml" +# 34324 "parsing/parser.ml" in -# 1583 "parsing/parser.mly" +# 1663 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_module body, ext) ) -# 33482 "parsing/parser.ml" +# 34330 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -33486,15 +34334,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33492 "parsing/parser.ml" +# 34340 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 33498 "parsing/parser.ml" +# 34346 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33564,9 +34412,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 33570 "parsing/parser.ml" +# 34418 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -33577,9 +34425,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 33583 "parsing/parser.ml" +# 34431 "parsing/parser.ml" in let (_endpos_id_, _startpos_id_) = (_endpos__1_, _startpos__1_) in @@ -33587,9 +34435,9 @@ module Tables = struct let _symbolstartpos = _startpos_id_ in let _sloc = (_symbolstartpos, _endpos) in -# 1647 "parsing/parser.mly" +# 1727 "parsing/parser.mly" ( Mty.alias ~loc:(make_loc _sloc) id ) -# 33593 "parsing/parser.ml" +# 34441 "parsing/parser.ml" in let name = @@ -33598,37 +34446,37 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 33604 "parsing/parser.ml" +# 34452 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 33612 "parsing/parser.ml" +# 34460 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1638 "parsing/parser.mly" +# 1718 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Md.mk name body ~attrs ~loc ~docs, ext ) -# 33626 "parsing/parser.ml" +# 34474 "parsing/parser.ml" in -# 1585 "parsing/parser.mly" +# 1665 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_module body, ext) ) -# 33632 "parsing/parser.ml" +# 34480 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -33636,15 +34484,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33642 "parsing/parser.ml" +# 34490 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 33648 "parsing/parser.ml" +# 34496 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33668,23 +34516,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1587 "parsing/parser.mly" +# 1667 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_modsubst body, ext) ) -# 33674 "parsing/parser.ml" +# 34522 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33682 "parsing/parser.ml" +# 34530 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 33688 "parsing/parser.ml" +# 34536 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33770,9 +34618,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 33776 "parsing/parser.ml" +# 34624 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -33782,49 +34630,49 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 33788 "parsing/parser.ml" +# 34636 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 33796 "parsing/parser.ml" +# 34644 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1681 "parsing/parser.mly" +# 1761 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in ext, Md.mk name mty ~attrs ~loc ~docs ) -# 33810 "parsing/parser.ml" +# 34658 "parsing/parser.ml" in -# 1048 "parsing/parser.mly" +# 1128 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 33816 "parsing/parser.ml" +# 34664 "parsing/parser.ml" in -# 1670 "parsing/parser.mly" +# 1750 "parsing/parser.mly" ( _1 ) -# 33822 "parsing/parser.ml" +# 34670 "parsing/parser.ml" in -# 1589 "parsing/parser.mly" +# 1669 "parsing/parser.mly" ( let (ext, l) = _1 in (Psig_recmodule l, ext) ) -# 33828 "parsing/parser.ml" +# 34676 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -33832,15 +34680,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33838 "parsing/parser.ml" +# 34686 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 33844 "parsing/parser.ml" +# 34692 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33864,23 +34712,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1591 "parsing/parser.mly" +# 1671 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_modtype body, ext) ) -# 33870 "parsing/parser.ml" +# 34718 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33878 "parsing/parser.ml" +# 34726 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 33884 "parsing/parser.ml" +# 34732 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33904,23 +34752,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1593 "parsing/parser.mly" +# 1673 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_open body, ext) ) -# 33910 "parsing/parser.ml" +# 34758 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33918 "parsing/parser.ml" +# 34766 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 33924 "parsing/parser.ml" +# 34772 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33976,38 +34824,38 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 33982 "parsing/parser.ml" +# 34830 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 33991 "parsing/parser.ml" +# 34839 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1439 "parsing/parser.mly" +# 1519 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Incl.mk thing ~attrs ~loc ~docs, ext ) -# 34005 "parsing/parser.ml" +# 34853 "parsing/parser.ml" in -# 1595 "parsing/parser.mly" +# 1675 "parsing/parser.mly" ( psig_include _1 ) -# 34011 "parsing/parser.ml" +# 34859 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined2_ in @@ -34015,15 +34863,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 34021 "parsing/parser.ml" +# 34869 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 34027 "parsing/parser.ml" +# 34875 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34100,9 +34948,9 @@ module Tables = struct let cty : (Parsetree.class_type) = Obj.magic cty in let _7 : unit = Obj.magic _7 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 34106 "parsing/parser.ml" +# 34954 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -34120,9 +34968,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 34126 "parsing/parser.ml" +# 34974 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -34132,24 +34980,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 34138 "parsing/parser.ml" +# 34986 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 34146 "parsing/parser.ml" +# 34994 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2011 "parsing/parser.mly" +# 2091 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -34157,25 +35005,25 @@ module Tables = struct ext, Ci.mk id cty ~virt ~params ~attrs ~loc ~docs ) -# 34161 "parsing/parser.ml" +# 35009 "parsing/parser.ml" in -# 1048 "parsing/parser.mly" +# 1128 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 34167 "parsing/parser.ml" +# 35015 "parsing/parser.ml" in -# 1999 "parsing/parser.mly" +# 2079 "parsing/parser.mly" ( _1 ) -# 34173 "parsing/parser.ml" +# 35021 "parsing/parser.ml" in -# 1597 "parsing/parser.mly" +# 1677 "parsing/parser.mly" ( let (ext, l) = _1 in (Psig_class l, ext) ) -# 34179 "parsing/parser.ml" +# 35027 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -34183,15 +35031,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 34189 "parsing/parser.ml" +# 35037 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 34195 "parsing/parser.ml" +# 35043 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34215,23 +35063,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1599 "parsing/parser.mly" +# 1679 "parsing/parser.mly" ( let (ext, l) = _1 in (Psig_class_type l, ext) ) -# 34221 "parsing/parser.ml" +# 35069 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 34229 "parsing/parser.ml" +# 35077 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1681 "parsing/parser.mly" ( _1 ) -# 34235 "parsing/parser.ml" +# 35083 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34254,9 +35102,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 3456 "parsing/parser.mly" +# 3598 "parsing/parser.mly" ( _1 ) -# 34260 "parsing/parser.ml" +# 35108 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34281,18 +35129,18 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 637 "parsing/parser.mly" +# 715 "parsing/parser.mly" (string * char option) -# 34287 "parsing/parser.ml" +# 35135 "parsing/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 : (Parsetree.constant) = -# 3457 "parsing/parser.mly" +# 3599 "parsing/parser.mly" ( let (n, m) = _2 in Pconst_integer("-" ^ n, m) ) -# 34296 "parsing/parser.ml" +# 35144 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34317,18 +35165,18 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 616 "parsing/parser.mly" +# 693 "parsing/parser.mly" (string * char option) -# 34323 "parsing/parser.ml" +# 35171 "parsing/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 : (Parsetree.constant) = -# 3458 "parsing/parser.mly" +# 3600 "parsing/parser.mly" ( let (f, m) = _2 in Pconst_float("-" ^ f, m) ) -# 34332 "parsing/parser.ml" +# 35180 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34353,18 +35201,18 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 637 "parsing/parser.mly" +# 715 "parsing/parser.mly" (string * char option) -# 34359 "parsing/parser.ml" +# 35207 "parsing/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 : (Parsetree.constant) = -# 3459 "parsing/parser.mly" +# 3601 "parsing/parser.mly" ( let (n, m) = _2 in Pconst_integer (n, m) ) -# 34368 "parsing/parser.ml" +# 35216 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34389,18 +35237,18 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 616 "parsing/parser.mly" +# 693 "parsing/parser.mly" (string * char option) -# 34395 "parsing/parser.ml" +# 35243 "parsing/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 : (Parsetree.constant) = -# 3460 "parsing/parser.mly" +# 3602 "parsing/parser.mly" ( let (f, m) = _2 in Pconst_float(f, m) ) -# 34404 "parsing/parser.ml" +# 35252 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34441,18 +35289,18 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 2794 "parsing/parser.mly" +# 2906 "parsing/parser.mly" ( let fields, closed = _1 in let closed = match closed with Some () -> Open | None -> Closed in fields, closed ) -# 34449 "parsing/parser.ml" +# 35297 "parsing/parser.ml" in -# 2765 "parsing/parser.mly" +# 2877 "parsing/parser.mly" ( let (fields, closed) = _2 in Ppat_record(fields, closed) ) -# 34456 "parsing/parser.ml" +# 35304 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -34460,15 +35308,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 34466 "parsing/parser.ml" +# 35314 "parsing/parser.ml" in -# 2779 "parsing/parser.mly" +# 2891 "parsing/parser.mly" ( _1 ) -# 34472 "parsing/parser.ml" +# 35320 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34509,19 +35357,19 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 2794 "parsing/parser.mly" +# 2906 "parsing/parser.mly" ( let fields, closed = _1 in let closed = match closed with Some () -> Open | None -> Closed in fields, closed ) -# 34517 "parsing/parser.ml" +# 35365 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2768 "parsing/parser.mly" +# 2880 "parsing/parser.mly" ( unclosed "{" _loc__1_ "}" _loc__3_ ) -# 34525 "parsing/parser.ml" +# 35373 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -34529,15 +35377,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 34535 "parsing/parser.ml" +# 35383 "parsing/parser.ml" in -# 2779 "parsing/parser.mly" +# 2891 "parsing/parser.mly" ( _1 ) -# 34541 "parsing/parser.ml" +# 35389 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34576,15 +35424,15 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _2 = -# 2788 "parsing/parser.mly" +# 2900 "parsing/parser.mly" ( ps ) -# 34582 "parsing/parser.ml" +# 35430 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2770 "parsing/parser.mly" +# 2882 "parsing/parser.mly" ( fst (mktailpat _loc__3_ _2) ) -# 34588 "parsing/parser.ml" +# 35436 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -34592,15 +35440,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 34598 "parsing/parser.ml" +# 35446 "parsing/parser.ml" in -# 2779 "parsing/parser.mly" +# 2891 "parsing/parser.mly" ( _1 ) -# 34604 "parsing/parser.ml" +# 35452 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34639,16 +35487,16 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _2 = -# 2788 "parsing/parser.mly" +# 2900 "parsing/parser.mly" ( ps ) -# 34645 "parsing/parser.ml" +# 35493 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2772 "parsing/parser.mly" +# 2884 "parsing/parser.mly" ( unclosed "[" _loc__1_ "]" _loc__3_ ) -# 34652 "parsing/parser.ml" +# 35500 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -34656,15 +35504,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 34662 "parsing/parser.ml" +# 35510 "parsing/parser.ml" in -# 2779 "parsing/parser.mly" +# 2891 "parsing/parser.mly" ( _1 ) -# 34668 "parsing/parser.ml" +# 35516 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34703,14 +35551,14 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _2 = -# 2788 "parsing/parser.mly" +# 2900 "parsing/parser.mly" ( ps ) -# 34709 "parsing/parser.ml" +# 35557 "parsing/parser.ml" in -# 2774 "parsing/parser.mly" +# 2886 "parsing/parser.mly" ( Ppat_array _2 ) -# 34714 "parsing/parser.ml" +# 35562 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -34718,15 +35566,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 34724 "parsing/parser.ml" +# 35572 "parsing/parser.ml" in -# 2779 "parsing/parser.mly" +# 2891 "parsing/parser.mly" ( _1 ) -# 34730 "parsing/parser.ml" +# 35578 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34757,24 +35605,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2776 "parsing/parser.mly" +# 2888 "parsing/parser.mly" ( Ppat_array [] ) -# 34763 "parsing/parser.ml" +# 35611 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 34772 "parsing/parser.ml" +# 35620 "parsing/parser.ml" in -# 2779 "parsing/parser.mly" +# 2891 "parsing/parser.mly" ( _1 ) -# 34778 "parsing/parser.ml" +# 35626 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34813,16 +35661,16 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _2 = -# 2788 "parsing/parser.mly" +# 2900 "parsing/parser.mly" ( ps ) -# 34819 "parsing/parser.ml" +# 35667 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2778 "parsing/parser.mly" +# 2890 "parsing/parser.mly" ( unclosed "[|" _loc__1_ "|]" _loc__3_ ) -# 34826 "parsing/parser.ml" +# 35674 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -34830,15 +35678,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 34836 "parsing/parser.ml" +# 35684 "parsing/parser.ml" in -# 2779 "parsing/parser.mly" +# 2891 "parsing/parser.mly" ( _1 ) -# 34842 "parsing/parser.ml" +# 35690 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34878,9 +35726,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2246 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( reloc_exp ~loc:_sloc _2 ) -# 34884 "parsing/parser.ml" +# 35732 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34919,9 +35767,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2248 "parsing/parser.mly" +# 2334 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 34925 "parsing/parser.ml" +# 35773 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34968,9 +35816,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2250 "parsing/parser.mly" +# 2336 "parsing/parser.mly" ( mkexp_constraint ~loc:_sloc _2 _3 ) -# 34974 "parsing/parser.ml" +# 35822 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35024,9 +35872,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2252 "parsing/parser.mly" +# 2338 "parsing/parser.mly" ( array_get ~loc:_sloc _1 _4 ) -# 35030 "parsing/parser.ml" +# 35878 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35079,9 +35927,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2254 "parsing/parser.mly" +# 2340 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 35085 "parsing/parser.ml" +# 35933 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35135,9 +35983,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2256 "parsing/parser.mly" +# 2342 "parsing/parser.mly" ( string_get ~loc:_sloc _1 _4 ) -# 35141 "parsing/parser.ml" +# 35989 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35190,9 +36038,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2258 "parsing/parser.mly" +# 2344 "parsing/parser.mly" ( unclosed "[" _loc__3_ "]" _loc__5_ ) -# 35196 "parsing/parser.ml" +# 36044 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35238,26 +36086,26 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 35244 "parsing/parser.ml" +# 36092 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = 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 : (Parsetree.expression) = let _4 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 35253 "parsing/parser.ml" +# 36101 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2260 "parsing/parser.mly" +# 2346 "parsing/parser.mly" ( dotop_get ~loc:_sloc lident bracket _2 _1 _4 ) -# 35261 "parsing/parser.ml" +# 36109 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35303,25 +36151,25 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 35309 "parsing/parser.ml" +# 36157 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = 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 : (Parsetree.expression) = let _4 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 35318 "parsing/parser.ml" +# 36166 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2262 "parsing/parser.mly" +# 2348 "parsing/parser.mly" ( unclosed "[" _loc__3_ "]" _loc__5_ ) -# 35325 "parsing/parser.ml" +# 36173 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35367,26 +36215,26 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 35373 "parsing/parser.ml" +# 36221 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = 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 : (Parsetree.expression) = let _4 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 35382 "parsing/parser.ml" +# 36230 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2264 "parsing/parser.mly" +# 2350 "parsing/parser.mly" ( dotop_get ~loc:_sloc lident paren _2 _1 _4 ) -# 35390 "parsing/parser.ml" +# 36238 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35432,25 +36280,25 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 35438 "parsing/parser.ml" +# 36286 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = 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 : (Parsetree.expression) = let _4 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 35447 "parsing/parser.ml" +# 36295 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2266 "parsing/parser.mly" +# 2352 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 35454 "parsing/parser.ml" +# 36302 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35496,26 +36344,26 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 35502 "parsing/parser.ml" +# 36350 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = 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 : (Parsetree.expression) = let _4 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 35511 "parsing/parser.ml" +# 36359 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2268 "parsing/parser.mly" +# 2354 "parsing/parser.mly" ( dotop_get ~loc:_sloc lident brace _2 _1 _4 ) -# 35519 "parsing/parser.ml" +# 36367 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35561,9 +36409,9 @@ module Tables = struct let _4 : (Parsetree.expression) = Obj.magic _4 in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 35567 "parsing/parser.ml" +# 36415 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -35572,9 +36420,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2270 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( unclosed "{" _loc__3_ "}" _loc__5_ ) -# 35578 "parsing/parser.ml" +# 36426 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35632,9 +36480,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _5 : unit = Obj.magic _5 in let _4 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 35638 "parsing/parser.ml" +# 36486 "parsing/parser.ml" ) = Obj.magic _4 in let _3 : (Longident.t) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in @@ -35643,17 +36491,17 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__7_ in let _v : (Parsetree.expression) = let _6 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 35649 "parsing/parser.ml" +# 36497 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2272 "parsing/parser.mly" +# 2358 "parsing/parser.mly" ( dotop_get ~loc:_sloc (ldot _3) bracket _4 _1 _6 ) -# 35657 "parsing/parser.ml" +# 36505 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35711,9 +36559,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _5 : unit = Obj.magic _5 in let _4 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 35717 "parsing/parser.ml" +# 36565 "parsing/parser.ml" ) = Obj.magic _4 in let _3 : (Longident.t) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in @@ -35722,16 +36570,16 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__7_ in let _v : (Parsetree.expression) = let _6 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 35728 "parsing/parser.ml" +# 36576 "parsing/parser.ml" in let _loc__7_ = (_startpos__7_, _endpos__7_) in let _loc__5_ = (_startpos__5_, _endpos__5_) in -# 2275 "parsing/parser.mly" +# 2361 "parsing/parser.mly" ( unclosed "[" _loc__5_ "]" _loc__7_ ) -# 35735 "parsing/parser.ml" +# 36583 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35789,9 +36637,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _5 : unit = Obj.magic _5 in let _4 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 35795 "parsing/parser.ml" +# 36643 "parsing/parser.ml" ) = Obj.magic _4 in let _3 : (Longident.t) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in @@ -35800,17 +36648,17 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__7_ in let _v : (Parsetree.expression) = let _6 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 35806 "parsing/parser.ml" +# 36654 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2277 "parsing/parser.mly" +# 2363 "parsing/parser.mly" ( dotop_get ~loc:_sloc (ldot _3) paren _4 _1 _6 ) -# 35814 "parsing/parser.ml" +# 36662 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35868,9 +36716,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _5 : unit = Obj.magic _5 in let _4 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 35874 "parsing/parser.ml" +# 36722 "parsing/parser.ml" ) = Obj.magic _4 in let _3 : (Longident.t) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in @@ -35879,16 +36727,16 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__7_ in let _v : (Parsetree.expression) = let _6 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 35885 "parsing/parser.ml" +# 36733 "parsing/parser.ml" in let _loc__7_ = (_startpos__7_, _endpos__7_) in let _loc__5_ = (_startpos__5_, _endpos__5_) in -# 2280 "parsing/parser.mly" +# 2366 "parsing/parser.mly" ( unclosed "(" _loc__5_ ")" _loc__7_ ) -# 35892 "parsing/parser.ml" +# 36740 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35946,9 +36794,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _5 : unit = Obj.magic _5 in let _4 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 35952 "parsing/parser.ml" +# 36800 "parsing/parser.ml" ) = Obj.magic _4 in let _3 : (Longident.t) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in @@ -35957,17 +36805,17 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__7_ in let _v : (Parsetree.expression) = let _6 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 35963 "parsing/parser.ml" +# 36811 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2282 "parsing/parser.mly" +# 2368 "parsing/parser.mly" ( dotop_get ~loc:_sloc (ldot _3) brace _4 _1 _6 ) -# 35971 "parsing/parser.ml" +# 36819 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36025,9 +36873,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _5 : unit = Obj.magic _5 in let _4 : ( -# 632 "parsing/parser.mly" +# 710 "parsing/parser.mly" (string) -# 36031 "parsing/parser.ml" +# 36879 "parsing/parser.ml" ) = Obj.magic _4 in let _3 : (Longident.t) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in @@ -36036,16 +36884,16 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__7_ in let _v : (Parsetree.expression) = let _6 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 36042 "parsing/parser.ml" +# 36890 "parsing/parser.ml" in let _loc__7_ = (_startpos__7_, _endpos__7_) in let _loc__5_ = (_startpos__5_, _endpos__5_) in -# 2285 "parsing/parser.mly" +# 2371 "parsing/parser.mly" ( unclosed "{" _loc__5_ "}" _loc__7_ ) -# 36049 "parsing/parser.ml" +# 36897 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36099,9 +36947,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2287 "parsing/parser.mly" +# 2373 "parsing/parser.mly" ( bigarray_get ~loc:_sloc _1 _4 ) -# 36105 "parsing/parser.ml" +# 36953 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36154,9 +37002,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2289 "parsing/parser.mly" +# 2375 "parsing/parser.mly" ( unclosed "{" _loc__3_ "}" _loc__5_ ) -# 36160 "parsing/parser.ml" +# 37008 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36210,15 +37058,15 @@ module Tables = struct let attrs = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 36216 "parsing/parser.ml" +# 37064 "parsing/parser.ml" in -# 2298 "parsing/parser.mly" +# 2384 "parsing/parser.mly" ( e.pexp_desc, (ext, attrs @ e.pexp_attributes) ) -# 36222 "parsing/parser.ml" +# 37070 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -36226,10 +37074,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2377 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 36233 "parsing/parser.ml" +# 37081 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36278,24 +37126,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 36284 "parsing/parser.ml" +# 37132 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 36290 "parsing/parser.ml" +# 37138 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2300 "parsing/parser.mly" +# 2386 "parsing/parser.mly" ( Pexp_construct (mkloc (Lident "()") (make_loc _sloc), None), _2 ) -# 36299 "parsing/parser.ml" +# 37147 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -36303,10 +37151,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2377 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 36310 "parsing/parser.ml" +# 37158 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36362,23 +37210,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 36368 "parsing/parser.ml" +# 37216 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 36374 "parsing/parser.ml" +# 37222 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2302 "parsing/parser.mly" +# 2388 "parsing/parser.mly" ( unclosed "begin" _loc__1_ "end" _loc__4_ ) -# 36382 "parsing/parser.ml" +# 37230 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -36386,10 +37234,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2377 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 36393 "parsing/parser.ml" +# 37241 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36439,9 +37287,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 36445 "parsing/parser.ml" +# 37293 "parsing/parser.ml" in let _2 = @@ -36449,21 +37297,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 36455 "parsing/parser.ml" +# 37303 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 36461 "parsing/parser.ml" +# 37309 "parsing/parser.ml" in -# 2304 "parsing/parser.mly" +# 2390 "parsing/parser.mly" ( Pexp_new(_3), _2 ) -# 36467 "parsing/parser.ml" +# 37315 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -36471,10 +37319,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2377 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 36478 "parsing/parser.ml" +# 37326 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36537,21 +37385,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 36543 "parsing/parser.ml" +# 37391 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 36549 "parsing/parser.ml" +# 37397 "parsing/parser.ml" in -# 2306 "parsing/parser.mly" +# 2392 "parsing/parser.mly" ( Pexp_pack _4, _3 ) -# 36555 "parsing/parser.ml" +# 37403 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -36559,10 +37407,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2377 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 36566 "parsing/parser.ml" +# 37414 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36640,11 +37488,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3370 "parsing/parser.mly" +# 3512 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 36648 "parsing/parser.ml" +# 37496 "parsing/parser.ml" in let _3 = @@ -36652,24 +37500,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 36658 "parsing/parser.ml" +# 37506 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 36664 "parsing/parser.ml" +# 37512 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2308 "parsing/parser.mly" +# 2394 "parsing/parser.mly" ( Pexp_constraint (ghexp ~loc:_sloc (Pexp_pack _4), _6), _3 ) -# 36673 "parsing/parser.ml" +# 37521 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -36677,10 +37525,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2377 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 36684 "parsing/parser.ml" +# 37532 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36750,23 +37598,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 36756 "parsing/parser.ml" +# 37604 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 36762 "parsing/parser.ml" +# 37610 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2310 "parsing/parser.mly" +# 2396 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 36770 "parsing/parser.ml" +# 37618 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -36774,10 +37622,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2377 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 36781 "parsing/parser.ml" +# 37629 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36806,30 +37654,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 36812 "parsing/parser.ml" +# 37660 "parsing/parser.ml" in -# 2343 "parsing/parser.mly" +# 2429 "parsing/parser.mly" ( Pexp_ident (_1) ) -# 36818 "parsing/parser.ml" +# 37666 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36827 "parsing/parser.ml" +# 37675 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 36833 "parsing/parser.ml" +# 37681 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36853,23 +37701,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2345 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( Pexp_constant _1 ) -# 36859 "parsing/parser.ml" +# 37707 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36867 "parsing/parser.ml" +# 37715 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 36873 "parsing/parser.ml" +# 37721 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36898,30 +37746,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 36904 "parsing/parser.ml" +# 37752 "parsing/parser.ml" in -# 2347 "parsing/parser.mly" +# 2433 "parsing/parser.mly" ( Pexp_construct(_1, None) ) -# 36910 "parsing/parser.ml" +# 37758 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36919 "parsing/parser.ml" +# 37767 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 36925 "parsing/parser.ml" +# 37773 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36945,23 +37793,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2349 "parsing/parser.mly" +# 2435 "parsing/parser.mly" ( Pexp_variant(_1, None) ) -# 36951 "parsing/parser.ml" +# 37799 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36959 "parsing/parser.ml" +# 37807 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 36965 "parsing/parser.ml" +# 37813 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36987,9 +37835,9 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.expression) = Obj.magic _2 in let _1 : ( -# 675 "parsing/parser.mly" +# 755 "parsing/parser.mly" (string) -# 36993 "parsing/parser.ml" +# 37841 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -37001,15 +37849,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 37007 "parsing/parser.ml" +# 37855 "parsing/parser.ml" in -# 2351 "parsing/parser.mly" +# 2437 "parsing/parser.mly" ( Pexp_apply(_1, [Nolabel,_2]) ) -# 37013 "parsing/parser.ml" +# 37861 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -37017,15 +37865,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37023 "parsing/parser.ml" +# 37871 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37029 "parsing/parser.ml" +# 37877 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37058,23 +37906,23 @@ module Tables = struct let _1 = let _1 = let _1 = -# 2352 "parsing/parser.mly" +# 2438 "parsing/parser.mly" ("!") -# 37064 "parsing/parser.ml" +# 37912 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 37072 "parsing/parser.ml" +# 37920 "parsing/parser.ml" in -# 2353 "parsing/parser.mly" +# 2439 "parsing/parser.mly" ( Pexp_apply(_1, [Nolabel,_2]) ) -# 37078 "parsing/parser.ml" +# 37926 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -37082,15 +37930,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37088 "parsing/parser.ml" +# 37936 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37094 "parsing/parser.ml" +# 37942 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37129,14 +37977,14 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2606 "parsing/parser.mly" +# 2718 "parsing/parser.mly" ( xs ) -# 37135 "parsing/parser.ml" +# 37983 "parsing/parser.ml" in -# 2355 "parsing/parser.mly" +# 2441 "parsing/parser.mly" ( Pexp_override _2 ) -# 37140 "parsing/parser.ml" +# 37988 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -37144,15 +37992,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37150 "parsing/parser.ml" +# 37998 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37156 "parsing/parser.ml" +# 38004 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37191,16 +38039,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2606 "parsing/parser.mly" +# 2718 "parsing/parser.mly" ( xs ) -# 37197 "parsing/parser.ml" +# 38045 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2357 "parsing/parser.mly" +# 2443 "parsing/parser.mly" ( unclosed "{<" _loc__1_ ">}" _loc__3_ ) -# 37204 "parsing/parser.ml" +# 38052 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -37208,15 +38056,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37214 "parsing/parser.ml" +# 38062 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37220 "parsing/parser.ml" +# 38068 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37247,24 +38095,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2359 "parsing/parser.mly" +# 2445 "parsing/parser.mly" ( Pexp_override [] ) -# 37253 "parsing/parser.ml" +# 38101 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37262 "parsing/parser.ml" +# 38110 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37268 "parsing/parser.ml" +# 38116 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37308,15 +38156,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37314 "parsing/parser.ml" +# 38162 "parsing/parser.ml" in -# 2361 "parsing/parser.mly" +# 2447 "parsing/parser.mly" ( Pexp_field(_1, _3) ) -# 37320 "parsing/parser.ml" +# 38168 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -37324,15 +38172,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37330 "parsing/parser.ml" +# 38178 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37336 "parsing/parser.ml" +# 38184 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37390,24 +38238,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37396 "parsing/parser.ml" +# 38244 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1578 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 37405 "parsing/parser.ml" +# 38253 "parsing/parser.ml" in -# 2363 "parsing/parser.mly" +# 2449 "parsing/parser.mly" ( Pexp_open(od, _4) ) -# 37411 "parsing/parser.ml" +# 38259 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -37415,15 +38263,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37421 "parsing/parser.ml" +# 38269 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37427 "parsing/parser.ml" +# 38275 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37476,9 +38324,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2606 "parsing/parser.mly" +# 2718 "parsing/parser.mly" ( xs ) -# 37482 "parsing/parser.ml" +# 38330 "parsing/parser.ml" in let od = let _1 = @@ -37486,18 +38334,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37492 "parsing/parser.ml" +# 38340 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1578 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 37501 "parsing/parser.ml" +# 38349 "parsing/parser.ml" in let _startpos_od_ = _startpos__1_ in @@ -37505,10 +38353,10 @@ module Tables = struct let _symbolstartpos = _startpos_od_ in let _sloc = (_symbolstartpos, _endpos) in -# 2365 "parsing/parser.mly" +# 2451 "parsing/parser.mly" ( (* TODO: review the location of Pexp_override *) Pexp_open(od, mkexp ~loc:_sloc (Pexp_override _4)) ) -# 37512 "parsing/parser.ml" +# 38360 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -37516,15 +38364,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37522 "parsing/parser.ml" +# 38370 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37528 "parsing/parser.ml" +# 38376 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37577,16 +38425,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2606 "parsing/parser.mly" +# 2718 "parsing/parser.mly" ( xs ) -# 37583 "parsing/parser.ml" +# 38431 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2368 "parsing/parser.mly" +# 2454 "parsing/parser.mly" ( unclosed "{<" _loc__3_ ">}" _loc__5_ ) -# 37590 "parsing/parser.ml" +# 38438 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -37594,15 +38442,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37600 "parsing/parser.ml" +# 38448 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37606 "parsing/parser.ml" +# 38454 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37633,9 +38481,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 37639 "parsing/parser.ml" +# 38487 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in @@ -37647,23 +38495,23 @@ module Tables = struct let _3 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 37653 "parsing/parser.ml" +# 38501 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37661 "parsing/parser.ml" +# 38509 "parsing/parser.ml" in -# 2370 "parsing/parser.mly" +# 2456 "parsing/parser.mly" ( Pexp_send(_1, _3) ) -# 37667 "parsing/parser.ml" +# 38515 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -37671,15 +38519,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37677 "parsing/parser.ml" +# 38525 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37683 "parsing/parser.ml" +# 38531 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37711,9 +38559,9 @@ module Tables = struct } = _menhir_stack in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined1 : ( -# 686 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 37717 "parsing/parser.ml" +# 38565 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -37727,15 +38575,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 37733 "parsing/parser.ml" +# 38581 "parsing/parser.ml" in -# 2372 "parsing/parser.mly" +# 2458 "parsing/parser.mly" ( mkinfix _1 _2 _3 ) -# 37739 "parsing/parser.ml" +# 38587 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -37743,15 +38591,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37749 "parsing/parser.ml" +# 38597 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37755 "parsing/parser.ml" +# 38603 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37775,23 +38623,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2374 "parsing/parser.mly" +# 2460 "parsing/parser.mly" ( Pexp_extension _1 ) -# 37781 "parsing/parser.ml" +# 38629 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37789 "parsing/parser.ml" +# 38637 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37795 "parsing/parser.ml" +# 38643 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37839,18 +38687,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in let _1 = -# 2375 "parsing/parser.mly" +# 2461 "parsing/parser.mly" (Lident "()") -# 37845 "parsing/parser.ml" +# 38693 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37854 "parsing/parser.ml" +# 38702 "parsing/parser.ml" in let (_endpos__3_, _startpos__3_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in @@ -37860,25 +38708,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37866 "parsing/parser.ml" +# 38714 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1578 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 37875 "parsing/parser.ml" +# 38723 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2376 "parsing/parser.mly" +# 2462 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:(_loc__3_) (Pexp_construct(_3, None))) ) -# 37882 "parsing/parser.ml" +# 38730 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -37886,15 +38734,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37892 "parsing/parser.ml" +# 38740 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37898 "parsing/parser.ml" +# 38746 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37949,9 +38797,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2378 "parsing/parser.mly" +# 2464 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 37955 "parsing/parser.ml" +# 38803 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -37959,15 +38807,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37965 "parsing/parser.ml" +# 38813 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 37971 "parsing/parser.ml" +# 38819 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38006,25 +38854,25 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2380 "parsing/parser.mly" +# 2466 "parsing/parser.mly" ( let (exten, fields) = _2 in Pexp_record(fields, exten) ) -# 38013 "parsing/parser.ml" +# 38861 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38022 "parsing/parser.ml" +# 38870 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38028 "parsing/parser.ml" +# 38876 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38066,9 +38914,9 @@ module Tables = struct let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2383 "parsing/parser.mly" +# 2469 "parsing/parser.mly" ( unclosed "{" _loc__1_ "}" _loc__3_ ) -# 38072 "parsing/parser.ml" +# 38920 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -38076,15 +38924,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38082 "parsing/parser.ml" +# 38930 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38088 "parsing/parser.ml" +# 38936 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38143,27 +38991,27 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 38149 "parsing/parser.ml" +# 38997 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1578 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 38158 "parsing/parser.ml" +# 39006 "parsing/parser.ml" in let _endpos = _endpos__5_ in -# 2385 "parsing/parser.mly" +# 2471 "parsing/parser.mly" ( let (exten, fields) = _4 in Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) (Pexp_record(fields, exten))) ) -# 38167 "parsing/parser.ml" +# 39015 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -38171,15 +39019,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38177 "parsing/parser.ml" +# 39025 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38183 "parsing/parser.ml" +# 39031 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38235,9 +39083,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2389 "parsing/parser.mly" +# 2475 "parsing/parser.mly" ( unclosed "{" _loc__3_ "}" _loc__5_ ) -# 38241 "parsing/parser.ml" +# 39089 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -38245,15 +39093,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38251 "parsing/parser.ml" +# 39099 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38257 "parsing/parser.ml" +# 39105 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38292,14 +39140,14 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 38298 "parsing/parser.ml" +# 39146 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2477 "parsing/parser.mly" ( Pexp_array(_2) ) -# 38303 "parsing/parser.ml" +# 39151 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -38307,15 +39155,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38313 "parsing/parser.ml" +# 39161 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38319 "parsing/parser.ml" +# 39167 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38354,16 +39202,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 38360 "parsing/parser.ml" +# 39208 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2393 "parsing/parser.mly" +# 2479 "parsing/parser.mly" ( unclosed "[|" _loc__1_ "|]" _loc__3_ ) -# 38367 "parsing/parser.ml" +# 39215 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -38371,15 +39219,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38377 "parsing/parser.ml" +# 39225 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38383 "parsing/parser.ml" +# 39231 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38410,24 +39258,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2395 "parsing/parser.mly" +# 2481 "parsing/parser.mly" ( Pexp_array [] ) -# 38416 "parsing/parser.ml" +# 39264 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38425 "parsing/parser.ml" +# 39273 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38431 "parsing/parser.ml" +# 39279 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38480,9 +39328,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 38486 "parsing/parser.ml" +# 39334 "parsing/parser.ml" in let od = let _1 = @@ -38490,25 +39338,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 38496 "parsing/parser.ml" +# 39344 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1578 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 38505 "parsing/parser.ml" +# 39353 "parsing/parser.ml" in let _endpos = _endpos__5_ in -# 2397 "parsing/parser.mly" +# 2483 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) (Pexp_array(_4))) ) -# 38512 "parsing/parser.ml" +# 39360 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -38516,15 +39364,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38522 "parsing/parser.ml" +# 39370 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38528 "parsing/parser.ml" +# 39376 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38575,26 +39423,26 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 38581 "parsing/parser.ml" +# 39429 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1578 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 38590 "parsing/parser.ml" +# 39438 "parsing/parser.ml" in let _endpos = _endpos__4_ in -# 2399 "parsing/parser.mly" +# 2485 "parsing/parser.mly" ( (* TODO: review the location of Pexp_array *) Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) (Pexp_array [])) ) -# 38598 "parsing/parser.ml" +# 39446 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -38602,15 +39450,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38608 "parsing/parser.ml" +# 39456 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38614 "parsing/parser.ml" +# 39462 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38663,16 +39511,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 38669 "parsing/parser.ml" +# 39517 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2403 "parsing/parser.mly" +# 2489 "parsing/parser.mly" ( unclosed "[|" _loc__3_ "|]" _loc__5_ ) -# 38676 "parsing/parser.ml" +# 39524 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -38680,15 +39528,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38686 "parsing/parser.ml" +# 39534 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38692 "parsing/parser.ml" +# 39540 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38727,15 +39575,15 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 38733 "parsing/parser.ml" +# 39581 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2405 "parsing/parser.mly" +# 2491 "parsing/parser.mly" ( fst (mktailexp _loc__3_ _2) ) -# 38739 "parsing/parser.ml" +# 39587 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -38743,15 +39591,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38749 "parsing/parser.ml" +# 39597 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38755 "parsing/parser.ml" +# 39603 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38790,16 +39638,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 38796 "parsing/parser.ml" +# 39644 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2407 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( unclosed "[" _loc__1_ "]" _loc__3_ ) -# 38803 "parsing/parser.ml" +# 39651 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -38807,15 +39655,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38813 "parsing/parser.ml" +# 39661 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38819 "parsing/parser.ml" +# 39667 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38858,17 +39706,17 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2332 "parsing/parser.mly" +# 2418 "parsing/parser.mly" ( Pexp_extension( Extensions.payload_of_extension_expr ~loc:(make_loc _sloc) (Eexp_list_comprehension(_2, _3))) ) -# 38866 "parsing/parser.ml" +# 39714 "parsing/parser.ml" in -# 2408 "parsing/parser.mly" +# 2494 "parsing/parser.mly" ( _1 ) -# 38872 "parsing/parser.ml" +# 39720 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -38876,15 +39724,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38882 "parsing/parser.ml" +# 39730 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38888 "parsing/parser.ml" +# 39736 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38927,17 +39775,17 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2336 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( Pexp_extension( Extensions.payload_of_extension_expr ~loc:(make_loc _sloc) (Eexp_arr_comprehension(_2, _3))) ) -# 38935 "parsing/parser.ml" +# 39783 "parsing/parser.ml" in -# 2408 "parsing/parser.mly" +# 2494 "parsing/parser.mly" ( _1 ) -# 38941 "parsing/parser.ml" +# 39789 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -38945,15 +39793,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38951 "parsing/parser.ml" +# 39799 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 38957 "parsing/parser.ml" +# 39805 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39011,11 +39859,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2332 "parsing/parser.mly" +# 2418 "parsing/parser.mly" ( Pexp_extension( Extensions.payload_of_extension_expr ~loc:(make_loc _sloc) (Eexp_list_comprehension(_2, _3))) ) -# 39019 "parsing/parser.ml" +# 39867 "parsing/parser.ml" in let _startpos__3_ = _startpos__1_inlined1_ in @@ -39025,25 +39873,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39031 "parsing/parser.ml" +# 39879 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1578 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 39040 "parsing/parser.ml" +# 39888 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2410 "parsing/parser.mly" +# 2496 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:(_loc__3_) _3) ) -# 39047 "parsing/parser.ml" +# 39895 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -39051,15 +39899,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 39057 "parsing/parser.ml" +# 39905 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 39063 "parsing/parser.ml" +# 39911 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39117,11 +39965,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2336 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( Pexp_extension( Extensions.payload_of_extension_expr ~loc:(make_loc _sloc) (Eexp_arr_comprehension(_2, _3))) ) -# 39125 "parsing/parser.ml" +# 39973 "parsing/parser.ml" in let _startpos__3_ = _startpos__1_inlined1_ in @@ -39131,25 +39979,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39137 "parsing/parser.ml" +# 39985 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1578 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 39146 "parsing/parser.ml" +# 39994 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2410 "parsing/parser.mly" +# 2496 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:(_loc__3_) _3) ) -# 39153 "parsing/parser.ml" +# 40001 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -39157,15 +40005,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 39163 "parsing/parser.ml" +# 40011 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 39169 "parsing/parser.ml" +# 40017 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39218,9 +40066,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 39224 "parsing/parser.ml" +# 40072 "parsing/parser.ml" in let od = let _1 = @@ -39228,30 +40076,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39234 "parsing/parser.ml" +# 40082 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1578 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 39243 "parsing/parser.ml" +# 40091 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _loc__5_ = (_startpos__5_, _endpos__5_) in -# 2412 "parsing/parser.mly" +# 2498 "parsing/parser.mly" ( let list_exp = (* TODO: review the location of list_exp *) let tail_exp, _tail_loc = mktailexp _loc__5_ _4 in mkexp ~loc:(_startpos__3_, _endpos) tail_exp in Pexp_open(od, list_exp) ) -# 39255 "parsing/parser.ml" +# 40103 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -39259,15 +40107,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 39265 "parsing/parser.ml" +# 40113 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 39271 "parsing/parser.ml" +# 40119 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39315,18 +40163,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in let _1 = -# 2417 "parsing/parser.mly" +# 2503 "parsing/parser.mly" (Lident "[]") -# 39321 "parsing/parser.ml" +# 40169 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39330 "parsing/parser.ml" +# 40178 "parsing/parser.ml" in let (_endpos__3_, _startpos__3_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in @@ -39336,25 +40184,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39342 "parsing/parser.ml" +# 40190 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1578 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 39351 "parsing/parser.ml" +# 40199 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2418 "parsing/parser.mly" +# 2504 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:_loc__3_ (Pexp_construct(_3, None))) ) -# 39358 "parsing/parser.ml" +# 40206 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -39362,15 +40210,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 39368 "parsing/parser.ml" +# 40216 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 39374 "parsing/parser.ml" +# 40222 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39423,16 +40271,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2623 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( es ) -# 39429 "parsing/parser.ml" +# 40277 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2421 "parsing/parser.mly" +# 2507 "parsing/parser.mly" ( unclosed "[" _loc__3_ "]" _loc__5_ ) -# 39436 "parsing/parser.ml" +# 40284 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -39440,15 +40288,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 39446 "parsing/parser.ml" +# 40294 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 39452 "parsing/parser.ml" +# 40300 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39541,11 +40389,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3370 "parsing/parser.mly" +# 3512 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 39549 "parsing/parser.ml" +# 40397 "parsing/parser.ml" in let _5 = @@ -39553,15 +40401,15 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 39559 "parsing/parser.ml" +# 40407 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 39565 "parsing/parser.ml" +# 40413 "parsing/parser.ml" in let od = @@ -39570,18 +40418,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39576 "parsing/parser.ml" +# 40424 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1578 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 39585 "parsing/parser.ml" +# 40433 "parsing/parser.ml" in let _startpos_od_ = _startpos__1_ in @@ -39589,12 +40437,12 @@ module Tables = struct let _symbolstartpos = _startpos_od_ in let _sloc = (_symbolstartpos, _endpos) in -# 2424 "parsing/parser.mly" +# 2510 "parsing/parser.mly" ( let modexp = mkexp_attrs ~loc:(_startpos__3_, _endpos) (Pexp_constraint (ghexp ~loc:_sloc (Pexp_pack _6), _8)) _5 in Pexp_open(od, modexp) ) -# 39598 "parsing/parser.ml" +# 40446 "parsing/parser.ml" in let _endpos__1_ = _endpos__9_ in @@ -39602,15 +40450,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 39608 "parsing/parser.ml" +# 40456 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 39614 "parsing/parser.ml" +# 40462 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39695,23 +40543,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 39701 "parsing/parser.ml" +# 40549 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 39707 "parsing/parser.ml" +# 40555 "parsing/parser.ml" in let _loc__8_ = (_startpos__8_, _endpos__8_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2430 "parsing/parser.mly" +# 2516 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__8_ ) -# 39715 "parsing/parser.ml" +# 40563 "parsing/parser.ml" in let _endpos__1_ = _endpos__8_ in @@ -39719,15 +40567,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 39725 "parsing/parser.ml" +# 40573 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( _1 ) -# 39731 "parsing/parser.ml" +# 40579 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39756,30 +40604,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39762 "parsing/parser.ml" +# 40610 "parsing/parser.ml" in -# 2703 "parsing/parser.mly" +# 2815 "parsing/parser.mly" ( Ppat_var (_1) ) -# 39768 "parsing/parser.ml" +# 40616 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39777 "parsing/parser.ml" +# 40625 "parsing/parser.ml" in -# 2704 "parsing/parser.mly" +# 2816 "parsing/parser.mly" ( _1 ) -# 39783 "parsing/parser.ml" +# 40631 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39802,9 +40650,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2705 "parsing/parser.mly" +# 2817 "parsing/parser.mly" ( _1 ) -# 39808 "parsing/parser.ml" +# 40656 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39844,9 +40692,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2710 "parsing/parser.mly" +# 2822 "parsing/parser.mly" ( reloc_pat ~loc:_sloc _2 ) -# 39850 "parsing/parser.ml" +# 40698 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39869,9 +40717,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2712 "parsing/parser.mly" +# 2824 "parsing/parser.mly" ( _1 ) -# 39875 "parsing/parser.ml" +# 40723 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39934,9 +40782,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39940 "parsing/parser.ml" +# 40788 "parsing/parser.ml" in let _3 = @@ -39944,24 +40792,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 39950 "parsing/parser.ml" +# 40798 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 39956 "parsing/parser.ml" +# 40804 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2714 "parsing/parser.mly" +# 2826 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_unpack _4) _3 ) -# 39965 "parsing/parser.ml" +# 40813 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40038,11 +40886,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3370 "parsing/parser.mly" +# 3512 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 40046 "parsing/parser.ml" +# 40894 "parsing/parser.ml" in let _4 = @@ -40051,9 +40899,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 40057 "parsing/parser.ml" +# 40905 "parsing/parser.ml" in let (_endpos__4_, _startpos__4_) = (_endpos__1_inlined3_, _startpos__1_inlined3_) in @@ -40062,15 +40910,15 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 40068 "parsing/parser.ml" +# 40916 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 40074 "parsing/parser.ml" +# 40922 "parsing/parser.ml" in let _endpos = _endpos__7_ in @@ -40078,11 +40926,11 @@ module Tables = struct let _loc__4_ = (_startpos__4_, _endpos__4_) in let _sloc = (_symbolstartpos, _endpos) in -# 2716 "parsing/parser.mly" +# 2828 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_constraint(mkpat ~loc:_loc__4_ (Ppat_unpack _4), _6)) _3 ) -# 40086 "parsing/parser.ml" +# 40934 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40106,23 +40954,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2724 "parsing/parser.mly" +# 2836 "parsing/parser.mly" ( Ppat_any ) -# 40112 "parsing/parser.ml" +# 40960 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40120 "parsing/parser.ml" +# 40968 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40126 "parsing/parser.ml" +# 40974 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40146,23 +40994,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2726 "parsing/parser.mly" +# 2838 "parsing/parser.mly" ( Ppat_constant _1 ) -# 40152 "parsing/parser.ml" +# 41000 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40160 "parsing/parser.ml" +# 41008 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40166 "parsing/parser.ml" +# 41014 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40200,24 +41048,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2728 "parsing/parser.mly" +# 2840 "parsing/parser.mly" ( Ppat_interval (_1, _3) ) -# 40206 "parsing/parser.ml" +# 41054 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40215 "parsing/parser.ml" +# 41063 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40221 "parsing/parser.ml" +# 41069 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40246,30 +41094,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 40252 "parsing/parser.ml" +# 41100 "parsing/parser.ml" in -# 2730 "parsing/parser.mly" +# 2842 "parsing/parser.mly" ( Ppat_construct(_1, None) ) -# 40258 "parsing/parser.ml" +# 41106 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40267 "parsing/parser.ml" +# 41115 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40273 "parsing/parser.ml" +# 41121 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40293,23 +41141,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2732 "parsing/parser.mly" +# 2844 "parsing/parser.mly" ( Ppat_variant(_1, None) ) -# 40299 "parsing/parser.ml" +# 41147 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40307 "parsing/parser.ml" +# 41155 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40313 "parsing/parser.ml" +# 41161 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40346,15 +41194,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 40352 "parsing/parser.ml" +# 41200 "parsing/parser.ml" in -# 2734 "parsing/parser.mly" +# 2846 "parsing/parser.mly" ( Ppat_type (_2) ) -# 40358 "parsing/parser.ml" +# 41206 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -40362,15 +41210,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40368 "parsing/parser.ml" +# 41216 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40374 "parsing/parser.ml" +# 41222 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40413,15 +41261,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 40419 "parsing/parser.ml" +# 41267 "parsing/parser.ml" in -# 2736 "parsing/parser.mly" +# 2848 "parsing/parser.mly" ( Ppat_open(_1, _3) ) -# 40425 "parsing/parser.ml" +# 41273 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -40429,15 +41277,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40435 "parsing/parser.ml" +# 41283 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40441 "parsing/parser.ml" +# 41289 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40485,18 +41333,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in let _1 = -# 2737 "parsing/parser.mly" +# 2849 "parsing/parser.mly" (Lident "[]") -# 40491 "parsing/parser.ml" +# 41339 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 40500 "parsing/parser.ml" +# 41348 "parsing/parser.ml" in let _endpos__3_ = _endpos__2_inlined1_ in @@ -40505,18 +41353,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 40511 "parsing/parser.ml" +# 41359 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2738 "parsing/parser.mly" +# 2850 "parsing/parser.mly" ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) -# 40520 "parsing/parser.ml" +# 41368 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -40524,15 +41372,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40530 "parsing/parser.ml" +# 41378 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40536 "parsing/parser.ml" +# 41384 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40580,18 +41428,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in let _1 = -# 2739 "parsing/parser.mly" +# 2851 "parsing/parser.mly" (Lident "()") -# 40586 "parsing/parser.ml" +# 41434 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 40595 "parsing/parser.ml" +# 41443 "parsing/parser.ml" in let _endpos__3_ = _endpos__2_inlined1_ in @@ -40600,18 +41448,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 40606 "parsing/parser.ml" +# 41454 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2740 "parsing/parser.mly" +# 2852 "parsing/parser.mly" ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) -# 40615 "parsing/parser.ml" +# 41463 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -40619,15 +41467,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40625 "parsing/parser.ml" +# 41473 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40631 "parsing/parser.ml" +# 41479 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40684,15 +41532,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 40690 "parsing/parser.ml" +# 41538 "parsing/parser.ml" in -# 2742 "parsing/parser.mly" +# 2854 "parsing/parser.mly" ( Ppat_open (_1, _4) ) -# 40696 "parsing/parser.ml" +# 41544 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -40700,15 +41548,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40706 "parsing/parser.ml" +# 41554 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40712 "parsing/parser.ml" +# 41560 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40763,9 +41611,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2744 "parsing/parser.mly" +# 2856 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 40769 "parsing/parser.ml" +# 41617 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -40773,15 +41621,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40779 "parsing/parser.ml" +# 41627 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40785 "parsing/parser.ml" +# 41633 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40828,9 +41676,9 @@ module Tables = struct let _1 = let _loc__4_ = (_startpos__4_, _endpos__4_) in -# 2746 "parsing/parser.mly" +# 2858 "parsing/parser.mly" ( expecting _loc__4_ "pattern" ) -# 40834 "parsing/parser.ml" +# 41682 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -40838,15 +41686,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40844 "parsing/parser.ml" +# 41692 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40850 "parsing/parser.ml" +# 41698 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40887,9 +41735,9 @@ module Tables = struct let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2748 "parsing/parser.mly" +# 2860 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 40893 "parsing/parser.ml" +# 41741 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -40897,15 +41745,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40903 "parsing/parser.ml" +# 41751 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40909 "parsing/parser.ml" +# 41757 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40957,24 +41805,24 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2750 "parsing/parser.mly" +# 2862 "parsing/parser.mly" ( Ppat_constraint(_2, _4) ) -# 40963 "parsing/parser.ml" +# 41811 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40972 "parsing/parser.ml" +# 41820 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 40978 "parsing/parser.ml" +# 41826 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41029,9 +41877,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2752 "parsing/parser.mly" +# 2864 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 41035 "parsing/parser.ml" +# 41883 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -41039,15 +41887,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 41045 "parsing/parser.ml" +# 41893 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 41051 "parsing/parser.ml" +# 41899 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41094,9 +41942,9 @@ module Tables = struct let _1 = let _loc__4_ = (_startpos__4_, _endpos__4_) in -# 2754 "parsing/parser.mly" +# 2866 "parsing/parser.mly" ( expecting _loc__4_ "type" ) -# 41100 "parsing/parser.ml" +# 41948 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -41104,15 +41952,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 41110 "parsing/parser.ml" +# 41958 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 41116 "parsing/parser.ml" +# 41964 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41191,11 +42039,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3370 "parsing/parser.mly" +# 3512 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 41199 "parsing/parser.ml" +# 42047 "parsing/parser.ml" in let _3 = @@ -41203,23 +42051,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 41209 "parsing/parser.ml" +# 42057 "parsing/parser.ml" in -# 3793 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( _1, _2 ) -# 41215 "parsing/parser.ml" +# 42063 "parsing/parser.ml" in let _loc__7_ = (_startpos__7_, _endpos__7_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2757 "parsing/parser.mly" +# 2869 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__7_ ) -# 41223 "parsing/parser.ml" +# 42071 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -41227,15 +42075,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 41233 "parsing/parser.ml" +# 42081 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 41239 "parsing/parser.ml" +# 42087 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41259,23 +42107,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2759 "parsing/parser.mly" +# 2871 "parsing/parser.mly" ( Ppat_extension _1 ) -# 41265 "parsing/parser.ml" +# 42113 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 41273 "parsing/parser.ml" +# 42121 "parsing/parser.ml" in -# 2720 "parsing/parser.mly" +# 2832 "parsing/parser.mly" ( _1 ) -# 41279 "parsing/parser.ml" +# 42127 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41294,17 +42142,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 41300 "parsing/parser.ml" +# 42148 "parsing/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 : (string) = -# 3703 "parsing/parser.mly" +# 3851 "parsing/parser.mly" ( _1 ) -# 41308 "parsing/parser.ml" +# 42156 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41323,17 +42171,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 701 "parsing/parser.mly" +# 781 "parsing/parser.mly" (string) -# 41329 "parsing/parser.ml" +# 42177 "parsing/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 : (string) = -# 3704 "parsing/parser.mly" +# 3852 "parsing/parser.mly" ( _1 ) -# 41337 "parsing/parser.ml" +# 42185 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41356,9 +42204,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3705 "parsing/parser.mly" +# 3853 "parsing/parser.mly" ( "and" ) -# 41362 "parsing/parser.ml" +# 42210 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41381,9 +42229,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3706 "parsing/parser.mly" +# 3854 "parsing/parser.mly" ( "as" ) -# 41387 "parsing/parser.ml" +# 42235 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41406,9 +42254,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3707 "parsing/parser.mly" +# 3855 "parsing/parser.mly" ( "assert" ) -# 41412 "parsing/parser.ml" +# 42260 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41431,9 +42279,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3708 "parsing/parser.mly" +# 3856 "parsing/parser.mly" ( "begin" ) -# 41437 "parsing/parser.ml" +# 42285 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41456,9 +42304,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3709 "parsing/parser.mly" +# 3857 "parsing/parser.mly" ( "class" ) -# 41462 "parsing/parser.ml" +# 42310 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41481,9 +42329,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3710 "parsing/parser.mly" +# 3858 "parsing/parser.mly" ( "constraint" ) -# 41487 "parsing/parser.ml" +# 42335 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41506,9 +42354,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3711 "parsing/parser.mly" +# 3859 "parsing/parser.mly" ( "do" ) -# 41512 "parsing/parser.ml" +# 42360 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41531,9 +42379,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3712 "parsing/parser.mly" +# 3860 "parsing/parser.mly" ( "done" ) -# 41537 "parsing/parser.ml" +# 42385 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41556,9 +42404,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3713 "parsing/parser.mly" +# 3861 "parsing/parser.mly" ( "downto" ) -# 41562 "parsing/parser.ml" +# 42410 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41581,9 +42429,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3714 "parsing/parser.mly" +# 3862 "parsing/parser.mly" ( "else" ) -# 41587 "parsing/parser.ml" +# 42435 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41606,9 +42454,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3715 "parsing/parser.mly" +# 3863 "parsing/parser.mly" ( "end" ) -# 41612 "parsing/parser.ml" +# 42460 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41631,9 +42479,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3716 "parsing/parser.mly" +# 3864 "parsing/parser.mly" ( "exception" ) -# 41637 "parsing/parser.ml" +# 42485 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41656,9 +42504,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3717 "parsing/parser.mly" +# 3865 "parsing/parser.mly" ( "external" ) -# 41662 "parsing/parser.ml" +# 42510 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41681,9 +42529,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3718 "parsing/parser.mly" +# 3866 "parsing/parser.mly" ( "false" ) -# 41687 "parsing/parser.ml" +# 42535 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41706,9 +42554,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3719 "parsing/parser.mly" +# 3867 "parsing/parser.mly" ( "for" ) -# 41712 "parsing/parser.ml" +# 42560 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41731,9 +42579,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3720 "parsing/parser.mly" +# 3868 "parsing/parser.mly" ( "fun" ) -# 41737 "parsing/parser.ml" +# 42585 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41756,9 +42604,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3721 "parsing/parser.mly" +# 3869 "parsing/parser.mly" ( "function" ) -# 41762 "parsing/parser.ml" +# 42610 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41781,9 +42629,34 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3722 "parsing/parser.mly" +# 3870 "parsing/parser.mly" ( "functor" ) -# 41787 "parsing/parser.ml" +# 42635 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + 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 : (string) = +# 3871 "parsing/parser.mly" + ( "nonlocal_" ) +# 42660 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41806,9 +42679,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3723 "parsing/parser.mly" +# 3872 "parsing/parser.mly" ( "if" ) -# 41812 "parsing/parser.ml" +# 42685 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41831,9 +42704,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3724 "parsing/parser.mly" +# 3873 "parsing/parser.mly" ( "in" ) -# 41837 "parsing/parser.ml" +# 42710 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41856,9 +42729,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3725 "parsing/parser.mly" +# 3874 "parsing/parser.mly" ( "include" ) -# 41862 "parsing/parser.ml" +# 42735 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41881,9 +42754,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3726 "parsing/parser.mly" +# 3875 "parsing/parser.mly" ( "inherit" ) -# 41887 "parsing/parser.ml" +# 42760 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41906,9 +42779,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3727 "parsing/parser.mly" +# 3876 "parsing/parser.mly" ( "initializer" ) -# 41912 "parsing/parser.ml" +# 42785 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41931,9 +42804,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3728 "parsing/parser.mly" +# 3877 "parsing/parser.mly" ( "lazy" ) -# 41937 "parsing/parser.ml" +# 42810 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41956,9 +42829,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3729 "parsing/parser.mly" +# 3878 "parsing/parser.mly" ( "let" ) -# 41962 "parsing/parser.ml" +# 42835 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41981,9 +42854,34 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3730 "parsing/parser.mly" +# 3879 "parsing/parser.mly" + ( "local_" ) +# 42860 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + 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 : (string) = +# 3880 "parsing/parser.mly" ( "match" ) -# 41987 "parsing/parser.ml" +# 42885 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42006,9 +42904,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3731 "parsing/parser.mly" +# 3881 "parsing/parser.mly" ( "method" ) -# 42012 "parsing/parser.ml" +# 42910 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42031,9 +42929,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3732 "parsing/parser.mly" +# 3882 "parsing/parser.mly" ( "module" ) -# 42037 "parsing/parser.ml" +# 42935 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42056,9 +42954,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3733 "parsing/parser.mly" +# 3883 "parsing/parser.mly" ( "mutable" ) -# 42062 "parsing/parser.ml" +# 42960 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42081,9 +42979,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3734 "parsing/parser.mly" +# 3884 "parsing/parser.mly" ( "new" ) -# 42087 "parsing/parser.ml" +# 42985 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42106,9 +43004,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3735 "parsing/parser.mly" +# 3885 "parsing/parser.mly" ( "nonrec" ) -# 42112 "parsing/parser.ml" +# 43010 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42131,9 +43029,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3736 "parsing/parser.mly" +# 3886 "parsing/parser.mly" ( "object" ) -# 42137 "parsing/parser.ml" +# 43035 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42156,9 +43054,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3737 "parsing/parser.mly" +# 3887 "parsing/parser.mly" ( "of" ) -# 42162 "parsing/parser.ml" +# 43060 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42181,9 +43079,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3738 "parsing/parser.mly" +# 3888 "parsing/parser.mly" ( "open" ) -# 42187 "parsing/parser.ml" +# 43085 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42206,9 +43104,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3739 "parsing/parser.mly" +# 3889 "parsing/parser.mly" ( "or" ) -# 42212 "parsing/parser.ml" +# 43110 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42231,9 +43129,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3740 "parsing/parser.mly" +# 3890 "parsing/parser.mly" ( "private" ) -# 42237 "parsing/parser.ml" +# 43135 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42256,9 +43154,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3741 "parsing/parser.mly" +# 3891 "parsing/parser.mly" ( "rec" ) -# 42262 "parsing/parser.ml" +# 43160 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42281,9 +43179,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3742 "parsing/parser.mly" +# 3892 "parsing/parser.mly" ( "sig" ) -# 42287 "parsing/parser.ml" +# 43185 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42306,9 +43204,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3743 "parsing/parser.mly" +# 3893 "parsing/parser.mly" ( "struct" ) -# 42312 "parsing/parser.ml" +# 43210 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42331,9 +43229,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3744 "parsing/parser.mly" +# 3894 "parsing/parser.mly" ( "then" ) -# 42337 "parsing/parser.ml" +# 43235 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42356,9 +43254,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3745 "parsing/parser.mly" +# 3895 "parsing/parser.mly" ( "to" ) -# 42362 "parsing/parser.ml" +# 43260 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42381,9 +43279,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3746 "parsing/parser.mly" +# 3896 "parsing/parser.mly" ( "true" ) -# 42387 "parsing/parser.ml" +# 43285 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42406,9 +43304,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3747 "parsing/parser.mly" +# 3897 "parsing/parser.mly" ( "try" ) -# 42412 "parsing/parser.ml" +# 43310 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42431,9 +43329,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3748 "parsing/parser.mly" +# 3898 "parsing/parser.mly" ( "type" ) -# 42437 "parsing/parser.ml" +# 43335 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42456,9 +43354,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3749 "parsing/parser.mly" +# 3899 "parsing/parser.mly" ( "val" ) -# 42462 "parsing/parser.ml" +# 43360 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42481,9 +43379,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3750 "parsing/parser.mly" +# 3900 "parsing/parser.mly" ( "virtual" ) -# 42487 "parsing/parser.ml" +# 43385 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42506,9 +43404,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3751 "parsing/parser.mly" +# 3901 "parsing/parser.mly" ( "when" ) -# 42512 "parsing/parser.ml" +# 43410 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42531,9 +43429,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3752 "parsing/parser.mly" +# 3902 "parsing/parser.mly" ( "while" ) -# 42537 "parsing/parser.ml" +# 43435 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42556,9 +43454,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3753 "parsing/parser.mly" +# 3903 "parsing/parser.mly" ( "with" ) -# 42562 "parsing/parser.ml" +# 43460 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42581,9 +43479,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.type_exception * string Asttypes.loc option) = -# 3038 "parsing/parser.mly" +# 3150 "parsing/parser.mly" ( _1 ) -# 42587 "parsing/parser.ml" +# 43485 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42606,36 +43504,1484 @@ module Tables = struct 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.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + 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_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 = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined5 : (Parsetree.attributes) = Obj.magic _1_inlined5 in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + 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_inlined5_ in + let _v : (Parsetree.type_exception * string Asttypes.loc option) = let attrs = + let _1 = _1_inlined5 in + +# 3928 "parsing/parser.mly" + ( _1 ) +# 43561 "parsing/parser.ml" + + in + let _endpos_attrs_ = _endpos__1_inlined5_ in + let attrs2 = + let _1 = _1_inlined4 in + +# 3932 "parsing/parser.mly" + ( _1 ) +# 43570 "parsing/parser.ml" + + in + let lid = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 897 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 43581 "parsing/parser.ml" + + in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 897 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 43592 "parsing/parser.ml" + + in + let attrs1 = + let _1 = _1_inlined1 in + +# 3932 "parsing/parser.mly" + ( _1 ) +# 43600 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3159 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Te.mk_exception ~attrs + (Te.rebind id lid ~attrs:(attrs1 @ attrs2) ~loc ~docs) + , ext ) +# 43613 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 : (Parsetree.expression) = 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 : (Parsetree.expression) = +# 2646 "parsing/parser.mly" + ( _2 ) +# 43645 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 : (Parsetree.expression) = Obj.magic _2 in + let _1 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.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 : (Parsetree.expression) = let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2648 "parsing/parser.mly" + ( let (l, o, p) = _1 in ghexp ~loc:_sloc (Pexp_fun(l, o, p, _2)) ) +# 43680 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + 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 = 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 _5 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let xs : (string Asttypes.loc list) = Obj.magic xs 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 : (Parsetree.expression) = let _3 = +# 2537 "parsing/parser.mly" + ( xs ) +# 43733 "parsing/parser.ml" + in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2650 "parsing/parser.mly" + ( mk_newtypes ~loc:_sloc _3 _5 ) +# 43741 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : unit = Obj.magic _4 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain = +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 43789 "parsing/parser.ml" + in + let local = +# 3422 "parsing/parser.mly" + ( false ) +# 43794 "parsing/parser.ml" + in + let label = +# 3414 "parsing/parser.mly" + ( Optional label ) +# 43799 "parsing/parser.ml" + in + +# 3395 "parsing/parser.mly" + ( Ptyp_arrow(label, mktyp_local_if local domain, codomain) ) +# 43804 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 43814 "parsing/parser.ml" + + in + +# 3397 "parsing/parser.mly" + ( _1 ) +# 43820 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain = + let (_endpos__1_, _1) = (_endpos__1_inlined1_, _1_inlined1) in + +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 43877 "parsing/parser.ml" + + in + let local = +# 3424 "parsing/parser.mly" + ( true ) +# 43883 "parsing/parser.ml" + in + let label = +# 3414 "parsing/parser.mly" + ( Optional label ) +# 43888 "parsing/parser.ml" + in + +# 3395 "parsing/parser.mly" + ( Ptyp_arrow(label, mktyp_local_if local domain, codomain) ) +# 43893 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 43903 "parsing/parser.ml" + + in + +# 3397 "parsing/parser.mly" + ( _1 ) +# 43909 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : unit = Obj.magic _4 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 729 "parsing/parser.mly" + (string) +# 43958 "parsing/parser.ml" + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain = +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 43968 "parsing/parser.ml" + in + let local = +# 3422 "parsing/parser.mly" + ( false ) +# 43973 "parsing/parser.ml" + in + let label = +# 3416 "parsing/parser.mly" + ( Labelled label ) +# 43978 "parsing/parser.ml" + in + +# 3395 "parsing/parser.mly" + ( Ptyp_arrow(label, mktyp_local_if local domain, codomain) ) +# 43983 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 43993 "parsing/parser.ml" + + in + +# 3397 "parsing/parser.mly" + ( _1 ) +# 43999 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _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 = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 729 "parsing/parser.mly" + (string) +# 44055 "parsing/parser.ml" + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain = + let (_endpos__1_, _1) = (_endpos__1_inlined1_, _1_inlined1) in + +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 44067 "parsing/parser.ml" + + in + let local = +# 3424 "parsing/parser.mly" + ( true ) +# 44073 "parsing/parser.ml" + in + let label = +# 3416 "parsing/parser.mly" + ( Labelled label ) +# 44078 "parsing/parser.ml" + in + +# 3395 "parsing/parser.mly" + ( Ptyp_arrow(label, mktyp_local_if local domain, codomain) ) +# 44083 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 44093 "parsing/parser.ml" + + in + +# 3397 "parsing/parser.mly" + ( _1 ) +# 44099 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : unit = Obj.magic _4 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain = +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 44140 "parsing/parser.ml" + in + let local = +# 3422 "parsing/parser.mly" + ( false ) +# 44145 "parsing/parser.ml" + in + let label = +# 3418 "parsing/parser.mly" + ( Nolabel ) +# 44150 "parsing/parser.ml" + in + +# 3395 "parsing/parser.mly" + ( Ptyp_arrow(label, mktyp_local_if local domain, codomain) ) +# 44155 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos_codomain_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 44165 "parsing/parser.ml" + + in + +# 3397 "parsing/parser.mly" + ( _1 ) +# 44171 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Parsetree.core_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_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let domain = + let (_endpos__1_, _1) = (_endpos__1_inlined1_, _1_inlined1) in + +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 44221 "parsing/parser.ml" + + in + let local = +# 3424 "parsing/parser.mly" + ( true ) +# 44227 "parsing/parser.ml" + in + let label = +# 3418 "parsing/parser.mly" + ( Nolabel ) +# 44232 "parsing/parser.ml" + in + +# 3395 "parsing/parser.mly" + ( Ptyp_arrow(label, mktyp_local_if local domain, codomain) ) +# 44237 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos_codomain_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 44247 "parsing/parser.ml" + + in + +# 3397 "parsing/parser.mly" + ( _1 ) +# 44253 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : unit = Obj.magic _4 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let ret_local = +# 3422 "parsing/parser.mly" + ( false ) +# 44301 "parsing/parser.ml" + in + let domain = +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 44306 "parsing/parser.ml" + in + let arg_local = +# 3422 "parsing/parser.mly" + ( false ) +# 44311 "parsing/parser.ml" + in + let label = +# 3414 "parsing/parser.mly" + ( Optional label ) +# 44316 "parsing/parser.ml" + in + +# 3406 "parsing/parser.mly" + ( Ptyp_arrow(label, + mktyp_local_if arg_local domain, + mktyp_local_if ret_local (maybe_curry_typ codomain)) ) +# 44323 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 44333 "parsing/parser.ml" + + in + +# 3410 "parsing/parser.mly" + ( _1 ) +# 44339 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _4 : unit = Obj.magic _4 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let ret_local = +# 3424 "parsing/parser.mly" + ( true ) +# 44394 "parsing/parser.ml" + in + let domain = +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 44399 "parsing/parser.ml" + in + let arg_local = +# 3422 "parsing/parser.mly" + ( false ) +# 44404 "parsing/parser.ml" + in + let label = +# 3414 "parsing/parser.mly" + ( Optional label ) +# 44409 "parsing/parser.ml" + in + +# 3406 "parsing/parser.mly" + ( Ptyp_arrow(label, + mktyp_local_if arg_local domain, + mktyp_local_if ret_local (maybe_curry_typ codomain)) ) +# 44416 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 44426 "parsing/parser.ml" + + in + +# 3410 "parsing/parser.mly" + ( _1 ) +# 44432 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let ret_local = +# 3422 "parsing/parser.mly" + ( false ) +# 44487 "parsing/parser.ml" + in + let domain = + let (_endpos__1_, _1) = (_endpos__1_inlined1_, _1_inlined1) in + +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 44494 "parsing/parser.ml" + + in + let arg_local = +# 3424 "parsing/parser.mly" + ( true ) +# 44500 "parsing/parser.ml" + in + let label = +# 3414 "parsing/parser.mly" + ( Optional label ) +# 44505 "parsing/parser.ml" + in + +# 3406 "parsing/parser.mly" + ( Ptyp_arrow(label, + mktyp_local_if arg_local domain, + mktyp_local_if ret_local (maybe_curry_typ codomain)) ) +# 44512 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 44522 "parsing/parser.ml" + + in + +# 3410 "parsing/parser.mly" + ( _1 ) +# 44528 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _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 = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let label : (string) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let ret_local = +# 3424 "parsing/parser.mly" + ( true ) +# 44590 "parsing/parser.ml" + in + let domain = + let (_endpos__1_, _1) = (_endpos__1_inlined1_, _1_inlined1) in + +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 44597 "parsing/parser.ml" + + in + let arg_local = +# 3424 "parsing/parser.mly" + ( true ) +# 44603 "parsing/parser.ml" + in + let label = +# 3414 "parsing/parser.mly" + ( Optional label ) +# 44608 "parsing/parser.ml" + in + +# 3406 "parsing/parser.mly" + ( Ptyp_arrow(label, + mktyp_local_if arg_local domain, + mktyp_local_if ret_local (maybe_curry_typ codomain)) ) +# 44615 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 44625 "parsing/parser.ml" + + in + +# 3410 "parsing/parser.mly" + ( _1 ) +# 44631 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : unit = Obj.magic _4 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 729 "parsing/parser.mly" + (string) +# 44680 "parsing/parser.ml" + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let ret_local = +# 3422 "parsing/parser.mly" + ( false ) +# 44690 "parsing/parser.ml" + in + let domain = +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 44695 "parsing/parser.ml" + in + let arg_local = +# 3422 "parsing/parser.mly" + ( false ) +# 44700 "parsing/parser.ml" + in + let label = +# 3416 "parsing/parser.mly" + ( Labelled label ) +# 44705 "parsing/parser.ml" + in + +# 3406 "parsing/parser.mly" + ( Ptyp_arrow(label, + mktyp_local_if arg_local domain, + mktyp_local_if ret_local (maybe_curry_typ codomain)) ) +# 44712 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 44722 "parsing/parser.ml" + + in + +# 3410 "parsing/parser.mly" + ( _1 ) +# 44728 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _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 = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _4 : unit = Obj.magic _4 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 729 "parsing/parser.mly" + (string) +# 44784 "parsing/parser.ml" + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let ret_local = +# 3424 "parsing/parser.mly" + ( true ) +# 44794 "parsing/parser.ml" + in + let domain = +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 44799 "parsing/parser.ml" + in + let arg_local = +# 3422 "parsing/parser.mly" + ( false ) +# 44804 "parsing/parser.ml" + in + let label = +# 3416 "parsing/parser.mly" + ( Labelled label ) +# 44809 "parsing/parser.ml" + in + +# 3406 "parsing/parser.mly" + ( Ptyp_arrow(label, + mktyp_local_if arg_local domain, + mktyp_local_if ret_local (maybe_curry_typ codomain)) ) +# 44816 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 44826 "parsing/parser.ml" + + in + +# 3410 "parsing/parser.mly" + ( _1 ) +# 44832 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _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 = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 729 "parsing/parser.mly" + (string) +# 44888 "parsing/parser.ml" + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let ret_local = +# 3422 "parsing/parser.mly" + ( false ) +# 44898 "parsing/parser.ml" + in + let domain = + let (_endpos__1_, _1) = (_endpos__1_inlined1_, _1_inlined1) in + +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 44905 "parsing/parser.ml" + + in + let arg_local = +# 3424 "parsing/parser.mly" + ( true ) +# 44911 "parsing/parser.ml" + in + let label = +# 3416 "parsing/parser.mly" + ( Labelled label ) +# 44916 "parsing/parser.ml" + in + +# 3406 "parsing/parser.mly" + ( Ptyp_arrow(label, + mktyp_local_if arg_local domain, + mktyp_local_if ret_local (maybe_curry_typ codomain)) ) +# 44923 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 44933 "parsing/parser.ml" + + in + +# 3410 "parsing/parser.mly" + ( _1 ) +# 44939 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + 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_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; 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.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -42643,75 +44989,146 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined5 : (Parsetree.attributes) = Obj.magic _1_inlined5 in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Asttypes.loc option) = Obj.magic ext in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 729 "parsing/parser.mly" + (string) +# 45002 "parsing/parser.ml" + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined5_ in - let _v : (Parsetree.type_exception * string Asttypes.loc option) = let attrs = - let _1 = _1_inlined5 in - -# 3778 "parsing/parser.mly" - ( _1 ) -# 42663 "parsing/parser.ml" - - in - let _endpos_attrs_ = _endpos__1_inlined5_ in - let attrs2 = - let _1 = _1_inlined4 in - -# 3782 "parsing/parser.mly" - ( _1 ) -# 42672 "parsing/parser.ml" - - in - let lid = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let ret_local = +# 3424 "parsing/parser.mly" + ( true ) +# 45012 "parsing/parser.ml" + in + let domain = + let (_endpos__1_, _1) = (_endpos__1_inlined1_, _1_inlined1) in + +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 45019 "parsing/parser.ml" + + in + let arg_local = +# 3424 "parsing/parser.mly" + ( true ) +# 45025 "parsing/parser.ml" + in + let label = +# 3416 "parsing/parser.mly" + ( Labelled label ) +# 45030 "parsing/parser.ml" + in + +# 3406 "parsing/parser.mly" + ( Ptyp_arrow(label, + mktyp_local_if arg_local domain, + mktyp_local_if ret_local (maybe_curry_typ codomain)) ) +# 45037 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 42683 "parsing/parser.ml" +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 45047 "parsing/parser.ml" in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + +# 3410 "parsing/parser.mly" + ( _1 ) +# 45053 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + 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 = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : unit = Obj.magic _4 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let ret_local = +# 3422 "parsing/parser.mly" + ( false ) +# 45094 "parsing/parser.ml" + in + let domain = +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 45099 "parsing/parser.ml" + in + let arg_local = +# 3422 "parsing/parser.mly" + ( false ) +# 45104 "parsing/parser.ml" + in + let label = +# 3418 "parsing/parser.mly" + ( Nolabel ) +# 45109 "parsing/parser.ml" + in + +# 3406 "parsing/parser.mly" + ( Ptyp_arrow(label, + mktyp_local_if arg_local domain, + mktyp_local_if ret_local (maybe_curry_typ codomain)) ) +# 45116 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos_codomain_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 42694 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 3782 "parsing/parser.mly" - ( _1 ) -# 42702 "parsing/parser.ml" +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 45126 "parsing/parser.ml" in - let _endpos = _endpos_attrs_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 3047 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Te.mk_exception ~attrs - (Te.rebind id lid ~attrs:(attrs1 @ attrs2) ~loc ~docs) - , ext ) -# 42715 "parsing/parser.ml" +# 3410 "parsing/parser.mly" + ( _1 ) +# 45132 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42724,26 +45141,80 @@ module Tables = struct 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.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + 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 = _menhir_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 : (Parsetree.expression) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _4 : unit = Obj.magic _4 in + let _1 : (Parsetree.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 : (Parsetree.expression) = -# 2548 "parsing/parser.mly" - ( _2 ) -# 42747 "parsing/parser.ml" + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let ret_local = +# 3424 "parsing/parser.mly" + ( true ) +# 45180 "parsing/parser.ml" + in + let domain = +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 45185 "parsing/parser.ml" + in + let arg_local = +# 3422 "parsing/parser.mly" + ( false ) +# 45190 "parsing/parser.ml" + in + let label = +# 3418 "parsing/parser.mly" + ( Nolabel ) +# 45195 "parsing/parser.ml" + in + +# 3406 "parsing/parser.mly" + ( Ptyp_arrow(label, + mktyp_local_if arg_local domain, + mktyp_local_if ret_local (maybe_curry_typ codomain)) ) +# 45202 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos_codomain_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 45212 "parsing/parser.ml" + + in + +# 3410 "parsing/parser.mly" + ( _1 ) +# 45218 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42756,29 +45227,83 @@ module Tables = struct 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.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + 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 _2 : (Parsetree.expression) = Obj.magic _2 in - let _1 : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = Obj.magic _1 in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Parsetree.core_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__2_ in - let _v : (Parsetree.expression) = let _endpos = _endpos__2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let ret_local = +# 3422 "parsing/parser.mly" + ( false ) +# 45266 "parsing/parser.ml" + in + let domain = + let (_endpos__1_, _1) = (_endpos__1_inlined1_, _1_inlined1) in + +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 45273 "parsing/parser.ml" + + in + let arg_local = +# 3424 "parsing/parser.mly" + ( true ) +# 45279 "parsing/parser.ml" + in + let label = +# 3418 "parsing/parser.mly" + ( Nolabel ) +# 45284 "parsing/parser.ml" + in + +# 3406 "parsing/parser.mly" + ( Ptyp_arrow(label, + mktyp_local_if arg_local domain, + mktyp_local_if ret_local (maybe_curry_typ codomain)) ) +# 45291 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos_codomain_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 45301 "parsing/parser.ml" + + in -# 2550 "parsing/parser.mly" - ( let (l, o, p) = _1 in ghexp ~loc:_sloc (Pexp_fun(l, o, p, _2)) ) -# 42782 "parsing/parser.ml" +# 3410 "parsing/parser.mly" + ( _1 ) +# 45307 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42791,24 +45316,24 @@ module Tables = struct 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.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + 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 = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + 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.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; @@ -42820,26 +45345,61 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : (Parsetree.expression) = Obj.magic _5 in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in let _4 : unit = Obj.magic _4 in - let xs : (string Asttypes.loc list) = Obj.magic xs in - let _2 : unit = Obj.magic _2 in + let _1_inlined1 : (Parsetree.core_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__5_ in - let _v : (Parsetree.expression) = let _3 = -# 2451 "parsing/parser.mly" - ( xs ) -# 42835 "parsing/parser.ml" - in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos_codomain_ in + let _v : (Parsetree.core_type) = let _1 = + let _1 = + let ret_local = +# 3424 "parsing/parser.mly" + ( true ) +# 45362 "parsing/parser.ml" + in + let domain = + let (_endpos__1_, _1) = (_endpos__1_inlined1_, _1_inlined1) in + +# 895 "parsing/parser.mly" + ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) +# 45369 "parsing/parser.ml" + + in + let arg_local = +# 3424 "parsing/parser.mly" + ( true ) +# 45375 "parsing/parser.ml" + in + let label = +# 3418 "parsing/parser.mly" + ( Nolabel ) +# 45380 "parsing/parser.ml" + in + +# 3406 "parsing/parser.mly" + ( Ptyp_arrow(label, + mktyp_local_if arg_local domain, + mktyp_local_if ret_local (maybe_curry_typ codomain)) ) +# 45387 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos_codomain_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 934 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 45397 "parsing/parser.ml" + + in -# 2552 "parsing/parser.mly" - ( mk_newtypes ~loc:_sloc _3 _5 ) -# 42843 "parsing/parser.ml" +# 3410 "parsing/parser.mly" + ( _1 ) +# 45403 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42866,39 +45426,39 @@ module Tables = struct let ys = # 260 "" ( List.flatten xss ) -# 42870 "parsing/parser.ml" +# 45430 "parsing/parser.ml" in let xs = let items = -# 887 "parsing/parser.mly" +# 967 "parsing/parser.mly" ( [] ) -# 42876 "parsing/parser.ml" +# 45436 "parsing/parser.ml" in -# 1301 "parsing/parser.mly" +# 1381 "parsing/parser.mly" ( items ) -# 42881 "parsing/parser.ml" +# 45441 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 42887 "parsing/parser.ml" +# 45447 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 809 "parsing/parser.mly" +# 889 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 42896 "parsing/parser.ml" +# 45456 "parsing/parser.ml" in -# 1294 "parsing/parser.mly" +# 1374 "parsing/parser.mly" ( _1 ) -# 42902 "parsing/parser.ml" +# 45462 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42939,7 +45499,7 @@ module Tables = struct let ys = # 260 "" ( List.flatten xss ) -# 42943 "parsing/parser.ml" +# 45503 "parsing/parser.ml" in let xs = let items = @@ -42947,65 +45507,65 @@ module Tables = struct let _1 = let _1 = let attrs = -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 42953 "parsing/parser.ml" +# 45513 "parsing/parser.ml" in -# 1308 "parsing/parser.mly" +# 1388 "parsing/parser.mly" ( mkstrexp e attrs ) -# 42958 "parsing/parser.ml" +# 45518 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 821 "parsing/parser.mly" +# 901 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 42966 "parsing/parser.ml" +# 45526 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 840 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mark_rhs_docs _startpos _endpos; _1 ) -# 42976 "parsing/parser.ml" +# 45536 "parsing/parser.ml" in -# 889 "parsing/parser.mly" +# 969 "parsing/parser.mly" ( x ) -# 42982 "parsing/parser.ml" +# 45542 "parsing/parser.ml" in -# 1301 "parsing/parser.mly" +# 1381 "parsing/parser.mly" ( items ) -# 42988 "parsing/parser.ml" +# 45548 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 42994 "parsing/parser.ml" +# 45554 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_e_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 809 "parsing/parser.mly" +# 889 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 43003 "parsing/parser.ml" +# 45563 "parsing/parser.ml" in -# 1294 "parsing/parser.mly" +# 1374 "parsing/parser.mly" ( _1 ) -# 43009 "parsing/parser.ml" +# 45569 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43031,9 +45591,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1323 "parsing/parser.mly" +# 1403 "parsing/parser.mly" ( val_of_let_bindings ~loc:_sloc _1 ) -# 43037 "parsing/parser.ml" +# 45597 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43067,9 +45627,9 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 43073 "parsing/parser.ml" +# 45633 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -43077,10 +45637,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1326 "parsing/parser.mly" +# 1406 "parsing/parser.mly" ( let docs = symbol_docs _sloc in Pstr_extension (_1, add_docs_attrs docs _2) ) -# 43084 "parsing/parser.ml" +# 45644 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -43088,15 +45648,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 856 "parsing/parser.mly" +# 936 "parsing/parser.mly" ( mkstr ~loc:_sloc _1 ) -# 43094 "parsing/parser.ml" +# 45654 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 43100 "parsing/parser.ml" +# 45660 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43120,23 +45680,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1329 "parsing/parser.mly" +# 1409 "parsing/parser.mly" ( Pstr_attribute _1 ) -# 43126 "parsing/parser.ml" +# 45686 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 856 "parsing/parser.mly" +# 936 "parsing/parser.mly" ( mkstr ~loc:_sloc _1 ) -# 43134 "parsing/parser.ml" +# 45694 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 43140 "parsing/parser.ml" +# 45700 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43160,23 +45720,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1333 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( pstr_primitive _1 ) -# 43166 "parsing/parser.ml" +# 45726 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 43174 "parsing/parser.ml" +# 45734 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 43180 "parsing/parser.ml" +# 45740 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43200,23 +45760,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1335 "parsing/parser.mly" +# 1415 "parsing/parser.mly" ( pstr_primitive _1 ) -# 43206 "parsing/parser.ml" +# 45766 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 43214 "parsing/parser.ml" +# 45774 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 43220 "parsing/parser.ml" +# 45780 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43251,26 +45811,26 @@ module Tables = struct let _1 = let _1 = let _1 = -# 1048 "parsing/parser.mly" +# 1128 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 43257 "parsing/parser.ml" +# 45817 "parsing/parser.ml" in -# 2882 "parsing/parser.mly" +# 2994 "parsing/parser.mly" ( _1 ) -# 43262 "parsing/parser.ml" +# 45822 "parsing/parser.ml" in -# 2865 "parsing/parser.mly" +# 2977 "parsing/parser.mly" ( _1 ) -# 43268 "parsing/parser.ml" +# 45828 "parsing/parser.ml" in -# 1337 "parsing/parser.mly" +# 1417 "parsing/parser.mly" ( pstr_type _1 ) -# 43274 "parsing/parser.ml" +# 45834 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in @@ -43278,15 +45838,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 43284 "parsing/parser.ml" +# 45844 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 43290 "parsing/parser.ml" +# 45850 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43371,16 +45931,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 43377 "parsing/parser.ml" +# 45937 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let cs = -# 1040 "parsing/parser.mly" +# 1120 "parsing/parser.mly" ( List.rev xs ) -# 43384 "parsing/parser.ml" +# 45944 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in @@ -43388,46 +45948,46 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43394 "parsing/parser.ml" +# 45954 "parsing/parser.ml" in let _4 = -# 3625 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( Recursive ) -# 43400 "parsing/parser.ml" +# 45960 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 43407 "parsing/parser.ml" +# 45967 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3130 "parsing/parser.mly" +# 3247 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in Te.mk tid cs ~params ~priv ~attrs ~docs, ext ) -# 43419 "parsing/parser.ml" +# 45979 "parsing/parser.ml" in -# 3113 "parsing/parser.mly" +# 3230 "parsing/parser.mly" ( _1 ) -# 43425 "parsing/parser.ml" +# 45985 "parsing/parser.ml" in -# 1339 "parsing/parser.mly" +# 1419 "parsing/parser.mly" ( pstr_typext _1 ) -# 43431 "parsing/parser.ml" +# 45991 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -43435,15 +45995,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 43441 "parsing/parser.ml" +# 46001 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 43447 "parsing/parser.ml" +# 46007 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43535,16 +46095,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 43541 "parsing/parser.ml" +# 46101 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in let cs = -# 1040 "parsing/parser.mly" +# 1120 "parsing/parser.mly" ( List.rev xs ) -# 43548 "parsing/parser.ml" +# 46108 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in @@ -43552,9 +46112,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43558 "parsing/parser.ml" +# 46118 "parsing/parser.ml" in let _4 = @@ -43563,41 +46123,41 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3626 "parsing/parser.mly" +# 3768 "parsing/parser.mly" ( not_expecting _loc "nonrec flag" ) -# 43569 "parsing/parser.ml" +# 46129 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 43577 "parsing/parser.ml" +# 46137 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3130 "parsing/parser.mly" +# 3247 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in Te.mk tid cs ~params ~priv ~attrs ~docs, ext ) -# 43589 "parsing/parser.ml" +# 46149 "parsing/parser.ml" in -# 3113 "parsing/parser.mly" +# 3230 "parsing/parser.mly" ( _1 ) -# 43595 "parsing/parser.ml" +# 46155 "parsing/parser.ml" in -# 1339 "parsing/parser.mly" +# 1419 "parsing/parser.mly" ( pstr_typext _1 ) -# 43601 "parsing/parser.ml" +# 46161 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -43605,15 +46165,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 43611 "parsing/parser.ml" +# 46171 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 43617 "parsing/parser.ml" +# 46177 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43637,23 +46197,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1341 "parsing/parser.mly" +# 1421 "parsing/parser.mly" ( pstr_exception _1 ) -# 43643 "parsing/parser.ml" +# 46203 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 43651 "parsing/parser.ml" +# 46211 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 43657 "parsing/parser.ml" +# 46217 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43716,9 +46276,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 43722 "parsing/parser.ml" +# 46282 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -43728,36 +46288,36 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43734 "parsing/parser.ml" +# 46294 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 43742 "parsing/parser.ml" +# 46302 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1367 "parsing/parser.mly" +# 1447 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let loc = make_loc _sloc in let attrs = attrs1 @ attrs2 in let body = Mb.mk name body ~attrs ~loc ~docs in Pstr_module body, ext ) -# 43755 "parsing/parser.ml" +# 46315 "parsing/parser.ml" in -# 1343 "parsing/parser.mly" +# 1423 "parsing/parser.mly" ( _1 ) -# 43761 "parsing/parser.ml" +# 46321 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -43765,15 +46325,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 43771 "parsing/parser.ml" +# 46331 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 43777 "parsing/parser.ml" +# 46337 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43852,9 +46412,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 43858 "parsing/parser.ml" +# 46418 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -43864,24 +46424,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43870 "parsing/parser.ml" +# 46430 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 43878 "parsing/parser.ml" +# 46438 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1402 "parsing/parser.mly" +# 1482 "parsing/parser.mly" ( let loc = make_loc _sloc in let attrs = attrs1 @ attrs2 in @@ -43889,25 +46449,25 @@ module Tables = struct ext, Mb.mk name body ~attrs ~loc ~docs ) -# 43893 "parsing/parser.ml" +# 46453 "parsing/parser.ml" in -# 1048 "parsing/parser.mly" +# 1128 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 43899 "parsing/parser.ml" +# 46459 "parsing/parser.ml" in -# 1390 "parsing/parser.mly" +# 1470 "parsing/parser.mly" ( _1 ) -# 43905 "parsing/parser.ml" +# 46465 "parsing/parser.ml" in -# 1345 "parsing/parser.mly" +# 1425 "parsing/parser.mly" ( pstr_recmodule _1 ) -# 43911 "parsing/parser.ml" +# 46471 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -43915,15 +46475,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 43921 "parsing/parser.ml" +# 46481 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 43927 "parsing/parser.ml" +# 46487 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43947,23 +46507,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1347 "parsing/parser.mly" +# 1427 "parsing/parser.mly" ( let (body, ext) = _1 in (Pstr_modtype body, ext) ) -# 43953 "parsing/parser.ml" +# 46513 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 43961 "parsing/parser.ml" +# 46521 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 43967 "parsing/parser.ml" +# 46527 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43987,23 +46547,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1349 "parsing/parser.mly" +# 1429 "parsing/parser.mly" ( let (body, ext) = _1 in (Pstr_open body, ext) ) -# 43993 "parsing/parser.ml" +# 46553 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 44001 "parsing/parser.ml" +# 46561 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 44007 "parsing/parser.ml" +# 46567 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44073,9 +46633,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in let body : (Parsetree.class_expr) = Obj.magic body in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 44079 "parsing/parser.ml" +# 46639 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -44093,9 +46653,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 44099 "parsing/parser.ml" +# 46659 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -44105,24 +46665,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44111 "parsing/parser.ml" +# 46671 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 44119 "parsing/parser.ml" +# 46679 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1721 "parsing/parser.mly" +# 1801 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -44130,25 +46690,25 @@ module Tables = struct ext, Ci.mk id body ~virt ~params ~attrs ~loc ~docs ) -# 44134 "parsing/parser.ml" +# 46694 "parsing/parser.ml" in -# 1048 "parsing/parser.mly" +# 1128 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 44140 "parsing/parser.ml" +# 46700 "parsing/parser.ml" in -# 1710 "parsing/parser.mly" +# 1790 "parsing/parser.mly" ( _1 ) -# 44146 "parsing/parser.ml" +# 46706 "parsing/parser.ml" in -# 1351 "parsing/parser.mly" +# 1431 "parsing/parser.mly" ( let (ext, l) = _1 in (Pstr_class l, ext) ) -# 44152 "parsing/parser.ml" +# 46712 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -44156,15 +46716,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 44162 "parsing/parser.ml" +# 46722 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 44168 "parsing/parser.ml" +# 46728 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44188,23 +46748,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1353 "parsing/parser.mly" +# 1433 "parsing/parser.mly" ( let (ext, l) = _1 in (Pstr_class_type l, ext) ) -# 44194 "parsing/parser.ml" +# 46754 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 44202 "parsing/parser.ml" +# 46762 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 44208 "parsing/parser.ml" +# 46768 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44260,38 +46820,38 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 44266 "parsing/parser.ml" +# 46826 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 44275 "parsing/parser.ml" +# 46835 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1439 "parsing/parser.mly" +# 1519 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Incl.mk thing ~attrs ~loc ~docs, ext ) -# 44289 "parsing/parser.ml" +# 46849 "parsing/parser.ml" in -# 1355 "parsing/parser.mly" +# 1435 "parsing/parser.mly" ( pstr_include _1 ) -# 44295 "parsing/parser.ml" +# 46855 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined2_ in @@ -44299,15 +46859,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 44305 "parsing/parser.ml" +# 46865 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1437 "parsing/parser.mly" ( _1 ) -# 44311 "parsing/parser.ml" +# 46871 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44330,9 +46890,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3688 "parsing/parser.mly" +# 3836 "parsing/parser.mly" ( "-" ) -# 44336 "parsing/parser.ml" +# 46896 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44355,9 +46915,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3689 "parsing/parser.mly" +# 3837 "parsing/parser.mly" ( "-." ) -# 44361 "parsing/parser.ml" +# 46921 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44410,9 +46970,9 @@ module Tables = struct let _v : (Parsetree.row_field) = let _5 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 44416 "parsing/parser.ml" +# 46976 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined1_ in @@ -44421,18 +46981,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 44425 "parsing/parser.ml" +# 46985 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 44430 "parsing/parser.ml" +# 46990 "parsing/parser.ml" in -# 3400 "parsing/parser.mly" +# 3542 "parsing/parser.mly" ( _1 ) -# 44436 "parsing/parser.ml" +# 46996 "parsing/parser.ml" in let _1 = @@ -44440,20 +47000,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44446 "parsing/parser.ml" +# 47006 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3386 "parsing/parser.mly" +# 3528 "parsing/parser.mly" ( let info = symbol_info _endpos in let attrs = add_info_attrs info _5 in Rf.tag ~loc:(make_loc _sloc) ~attrs _1 _3 _4 ) -# 44457 "parsing/parser.ml" +# 47017 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44485,9 +47045,9 @@ module Tables = struct let _v : (Parsetree.row_field) = let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 44491 "parsing/parser.ml" +# 47051 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -44496,20 +47056,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44502 "parsing/parser.ml" +# 47062 "parsing/parser.ml" in let _endpos = _endpos__2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3390 "parsing/parser.mly" +# 3532 "parsing/parser.mly" ( let info = symbol_info _endpos in let attrs = add_info_attrs info _2 in Rf.tag ~loc:(make_loc _sloc) ~attrs _1 true [] ) -# 44513 "parsing/parser.ml" +# 47073 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44541,7 +47101,7 @@ module Tables = struct let _v : (Parsetree.toplevel_phrase) = let arg = # 124 "" ( None ) -# 44545 "parsing/parser.ml" +# 47105 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined1_ in let dir = @@ -44550,18 +47110,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44556 "parsing/parser.ml" +# 47116 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3588 "parsing/parser.mly" +# 3730 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 44565 "parsing/parser.ml" +# 47125 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44592,9 +47152,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : ( -# 689 "parsing/parser.mly" +# 769 "parsing/parser.mly" (string * Location.t * string option) -# 44598 "parsing/parser.ml" +# 47158 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in @@ -44605,23 +47165,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3592 "parsing/parser.mly" +# 3734 "parsing/parser.mly" ( let (s, _, _) = _1 in Pdir_string s ) -# 44611 "parsing/parser.ml" +# 47171 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 878 "parsing/parser.mly" +# 958 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 44619 "parsing/parser.ml" +# 47179 "parsing/parser.ml" in # 126 "" ( Some x ) -# 44625 "parsing/parser.ml" +# 47185 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -44631,18 +47191,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44637 "parsing/parser.ml" +# 47197 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3588 "parsing/parser.mly" +# 3730 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 44646 "parsing/parser.ml" +# 47206 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44673,9 +47233,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : ( -# 637 "parsing/parser.mly" +# 715 "parsing/parser.mly" (string * char option) -# 44679 "parsing/parser.ml" +# 47239 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in @@ -44686,23 +47246,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3593 "parsing/parser.mly" +# 3735 "parsing/parser.mly" ( let (n, m) = _1 in Pdir_int (n ,m) ) -# 44692 "parsing/parser.ml" +# 47252 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 878 "parsing/parser.mly" +# 958 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 44700 "parsing/parser.ml" +# 47260 "parsing/parser.ml" in # 126 "" ( Some x ) -# 44706 "parsing/parser.ml" +# 47266 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -44712,18 +47272,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44718 "parsing/parser.ml" +# 47278 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3588 "parsing/parser.mly" +# 3730 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 44727 "parsing/parser.ml" +# 47287 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44763,23 +47323,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3594 "parsing/parser.mly" +# 3736 "parsing/parser.mly" ( Pdir_ident _1 ) -# 44769 "parsing/parser.ml" +# 47329 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 878 "parsing/parser.mly" +# 958 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 44777 "parsing/parser.ml" +# 47337 "parsing/parser.ml" in # 126 "" ( Some x ) -# 44783 "parsing/parser.ml" +# 47343 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -44789,18 +47349,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44795 "parsing/parser.ml" +# 47355 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3588 "parsing/parser.mly" +# 3730 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 44804 "parsing/parser.ml" +# 47364 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44840,23 +47400,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3595 "parsing/parser.mly" +# 3737 "parsing/parser.mly" ( Pdir_ident _1 ) -# 44846 "parsing/parser.ml" +# 47406 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 878 "parsing/parser.mly" +# 958 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 44854 "parsing/parser.ml" +# 47414 "parsing/parser.ml" in # 126 "" ( Some x ) -# 44860 "parsing/parser.ml" +# 47420 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -44866,18 +47426,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44872 "parsing/parser.ml" +# 47432 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3588 "parsing/parser.mly" +# 3730 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 44881 "parsing/parser.ml" +# 47441 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44917,23 +47477,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in let x = let _1 = -# 3596 "parsing/parser.mly" +# 3738 "parsing/parser.mly" ( Pdir_bool false ) -# 44923 "parsing/parser.ml" +# 47483 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 878 "parsing/parser.mly" +# 958 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 44931 "parsing/parser.ml" +# 47491 "parsing/parser.ml" in # 126 "" ( Some x ) -# 44937 "parsing/parser.ml" +# 47497 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -44943,18 +47503,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44949 "parsing/parser.ml" +# 47509 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3588 "parsing/parser.mly" +# 3730 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 44958 "parsing/parser.ml" +# 47518 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44994,23 +47554,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in let x = let _1 = -# 3597 "parsing/parser.mly" +# 3739 "parsing/parser.mly" ( Pdir_bool true ) -# 45000 "parsing/parser.ml" +# 47560 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 878 "parsing/parser.mly" +# 958 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 45008 "parsing/parser.ml" +# 47568 "parsing/parser.ml" in # 126 "" ( Some x ) -# 45014 "parsing/parser.ml" +# 47574 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -45020,18 +47580,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 45026 "parsing/parser.ml" +# 47586 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3588 "parsing/parser.mly" +# 3730 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 45035 "parsing/parser.ml" +# 47595 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45071,37 +47631,37 @@ module Tables = struct let _1 = let _1 = let attrs = -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 45077 "parsing/parser.ml" +# 47637 "parsing/parser.ml" in -# 1308 "parsing/parser.mly" +# 1388 "parsing/parser.mly" ( mkstrexp e attrs ) -# 45082 "parsing/parser.ml" +# 47642 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 821 "parsing/parser.mly" +# 901 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 45090 "parsing/parser.ml" +# 47650 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 809 "parsing/parser.mly" +# 889 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 45099 "parsing/parser.ml" +# 47659 "parsing/parser.ml" in -# 1086 "parsing/parser.mly" +# 1166 "parsing/parser.mly" ( Ptop_def _1 ) -# 45105 "parsing/parser.ml" +# 47665 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45134,21 +47694,21 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 45138 "parsing/parser.ml" +# 47698 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 809 "parsing/parser.mly" +# 889 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 45146 "parsing/parser.ml" +# 47706 "parsing/parser.ml" in -# 1090 "parsing/parser.mly" +# 1170 "parsing/parser.mly" ( Ptop_def _1 ) -# 45152 "parsing/parser.ml" +# 47712 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45178,9 +47738,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.toplevel_phrase) = -# 1094 "parsing/parser.mly" +# 1174 "parsing/parser.mly" ( _1 ) -# 45184 "parsing/parser.ml" +# 47744 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45203,9 +47763,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.toplevel_phrase) = -# 1097 "parsing/parser.mly" +# 1177 "parsing/parser.mly" ( raise End_of_file ) -# 45209 "parsing/parser.ml" +# 47769 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45228,9 +47788,9 @@ module Tables = struct let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.core_type) = -# 3292 "parsing/parser.mly" +# 3434 "parsing/parser.mly" ( ty ) -# 45234 "parsing/parser.ml" +# 47794 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45258,18 +47818,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 45262 "parsing/parser.ml" +# 47822 "parsing/parser.ml" in -# 979 "parsing/parser.mly" +# 1059 "parsing/parser.mly" ( xs ) -# 45267 "parsing/parser.ml" +# 47827 "parsing/parser.ml" in -# 3295 "parsing/parser.mly" +# 3437 "parsing/parser.mly" ( Ptyp_tuple tys ) -# 45273 "parsing/parser.ml" +# 47833 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_xs_) in @@ -45277,15 +47837,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 45283 "parsing/parser.ml" +# 47843 "parsing/parser.ml" in -# 3297 "parsing/parser.mly" +# 3439 "parsing/parser.mly" ( _1 ) -# 45289 "parsing/parser.ml" +# 47849 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45315,9 +47875,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type option * Parsetree.core_type option) = -# 2626 "parsing/parser.mly" +# 2738 "parsing/parser.mly" ( (Some _2, None) ) -# 45321 "parsing/parser.ml" +# 47881 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45361,9 +47921,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.core_type option * Parsetree.core_type option) = -# 2627 "parsing/parser.mly" +# 2739 "parsing/parser.mly" ( (Some _2, Some _4) ) -# 45367 "parsing/parser.ml" +# 47927 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45393,9 +47953,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type option * Parsetree.core_type option) = -# 2628 "parsing/parser.mly" +# 2740 "parsing/parser.mly" ( (None, Some _2) ) -# 45399 "parsing/parser.ml" +# 47959 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45425,9 +47985,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type option * Parsetree.core_type option) = -# 2629 "parsing/parser.mly" +# 2741 "parsing/parser.mly" ( syntax_error() ) -# 45431 "parsing/parser.ml" +# 47991 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45457,9 +48017,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type option * Parsetree.core_type option) = -# 2630 "parsing/parser.mly" +# 2742 "parsing/parser.mly" ( syntax_error() ) -# 45463 "parsing/parser.ml" +# 48023 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45475,9 +48035,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = -# 2956 "parsing/parser.mly" +# 3068 "parsing/parser.mly" ( (Ptype_abstract, Public, None) ) -# 45481 "parsing/parser.ml" +# 48041 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45507,9 +48067,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = -# 2958 "parsing/parser.mly" +# 3070 "parsing/parser.mly" ( _2 ) -# 45513 "parsing/parser.ml" +# 48073 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45532,9 +48092,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3551 "parsing/parser.mly" +# 3693 "parsing/parser.mly" ( _1 ) -# 45538 "parsing/parser.ml" +# 48098 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45564,9 +48124,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = -# 2973 "parsing/parser.mly" +# 3085 "parsing/parser.mly" ( _2, _1 ) -# 45570 "parsing/parser.ml" +# 48130 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45582,9 +48142,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = -# 2966 "parsing/parser.mly" +# 3078 "parsing/parser.mly" ( [] ) -# 45588 "parsing/parser.ml" +# 48148 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45607,9 +48167,9 @@ module Tables = struct let _startpos = _startpos_p_ in let _endpos = _endpos_p_ in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = -# 2968 "parsing/parser.mly" +# 3080 "parsing/parser.mly" ( [p] ) -# 45613 "parsing/parser.ml" +# 48173 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45649,18 +48209,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 45653 "parsing/parser.ml" +# 48213 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1031 "parsing/parser.mly" ( xs ) -# 45658 "parsing/parser.ml" +# 48218 "parsing/parser.ml" in -# 2970 "parsing/parser.mly" +# 3082 "parsing/parser.mly" ( ps ) -# 45664 "parsing/parser.ml" +# 48224 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45691,24 +48251,24 @@ module Tables = struct let _endpos = _endpos_tyvar_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 2978 "parsing/parser.mly" +# 3090 "parsing/parser.mly" ( Ptyp_var tyvar ) -# 45697 "parsing/parser.ml" +# 48257 "parsing/parser.ml" in let _endpos__1_ = _endpos_tyvar_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 45706 "parsing/parser.ml" +# 48266 "parsing/parser.ml" in -# 2981 "parsing/parser.mly" +# 3093 "parsing/parser.mly" ( _1 ) -# 45712 "parsing/parser.ml" +# 48272 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45732,23 +48292,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 2980 "parsing/parser.mly" +# 3092 "parsing/parser.mly" ( Ptyp_any ) -# 45738 "parsing/parser.ml" +# 48298 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 45746 "parsing/parser.ml" +# 48306 "parsing/parser.ml" in -# 2981 "parsing/parser.mly" +# 3093 "parsing/parser.mly" ( _1 ) -# 45752 "parsing/parser.ml" +# 48312 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45764,9 +48324,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2985 "parsing/parser.mly" +# 3097 "parsing/parser.mly" ( NoVariance, NoInjectivity ) -# 45770 "parsing/parser.ml" +# 48330 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45789,9 +48349,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2986 "parsing/parser.mly" +# 3098 "parsing/parser.mly" ( Covariant, NoInjectivity ) -# 45795 "parsing/parser.ml" +# 48355 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45814,9 +48374,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2987 "parsing/parser.mly" +# 3099 "parsing/parser.mly" ( Contravariant, NoInjectivity ) -# 45820 "parsing/parser.ml" +# 48380 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45839,9 +48399,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2988 "parsing/parser.mly" +# 3100 "parsing/parser.mly" ( NoVariance, Injective ) -# 45845 "parsing/parser.ml" +# 48405 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45871,9 +48431,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2989 "parsing/parser.mly" +# 3101 "parsing/parser.mly" ( Covariant, Injective ) -# 45877 "parsing/parser.ml" +# 48437 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45903,9 +48463,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2989 "parsing/parser.mly" +# 3101 "parsing/parser.mly" ( Covariant, Injective ) -# 45909 "parsing/parser.ml" +# 48469 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45935,9 +48495,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2990 "parsing/parser.mly" +# 3102 "parsing/parser.mly" ( Contravariant, Injective ) -# 45941 "parsing/parser.ml" +# 48501 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45967,9 +48527,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2990 "parsing/parser.mly" +# 3102 "parsing/parser.mly" ( Contravariant, Injective ) -# 45973 "parsing/parser.ml" +# 48533 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45988,20 +48548,20 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 629 "parsing/parser.mly" +# 707 "parsing/parser.mly" (string) -# 45994 "parsing/parser.ml" +# 48554 "parsing/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 : (Asttypes.variance * Asttypes.injectivity) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2992 "parsing/parser.mly" +# 3104 "parsing/parser.mly" ( if _1 = "+!" then Covariant, Injective else if _1 = "-!" then Contravariant, Injective else expecting _loc__1_ "type_variance" ) -# 46005 "parsing/parser.ml" +# 48565 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46020,20 +48580,20 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 675 "parsing/parser.mly" +# 755 "parsing/parser.mly" (string) -# 46026 "parsing/parser.ml" +# 48586 "parsing/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 : (Asttypes.variance * Asttypes.injectivity) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2996 "parsing/parser.mly" +# 3108 "parsing/parser.mly" ( if _1 = "!+" then Covariant, Injective else if _1 = "!-" then Contravariant, Injective else expecting _loc__1_ "type_variance" ) -# 46037 "parsing/parser.ml" +# 48597 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46067,39 +48627,39 @@ module Tables = struct let ys = # 260 "" ( List.flatten xss ) -# 46071 "parsing/parser.ml" +# 48631 "parsing/parser.ml" in let xs = let _1 = -# 887 "parsing/parser.mly" +# 967 "parsing/parser.mly" ( [] ) -# 46077 "parsing/parser.ml" +# 48637 "parsing/parser.ml" in -# 1117 "parsing/parser.mly" +# 1197 "parsing/parser.mly" ( _1 ) -# 46082 "parsing/parser.ml" +# 48642 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 46088 "parsing/parser.ml" +# 48648 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 813 "parsing/parser.mly" +# 893 "parsing/parser.mly" ( extra_def _startpos _endpos _1 ) -# 46097 "parsing/parser.ml" +# 48657 "parsing/parser.ml" in -# 1110 "parsing/parser.mly" +# 1190 "parsing/parser.mly" ( _1 ) -# 46103 "parsing/parser.ml" +# 48663 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46147,7 +48707,7 @@ module Tables = struct let ys = # 260 "" ( List.flatten xss ) -# 46151 "parsing/parser.ml" +# 48711 "parsing/parser.ml" in let xs = let _1 = @@ -46155,61 +48715,61 @@ module Tables = struct let _1 = let _1 = let attrs = -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 46161 "parsing/parser.ml" +# 48721 "parsing/parser.ml" in -# 1308 "parsing/parser.mly" +# 1388 "parsing/parser.mly" ( mkstrexp e attrs ) -# 46166 "parsing/parser.ml" +# 48726 "parsing/parser.ml" in -# 831 "parsing/parser.mly" +# 911 "parsing/parser.mly" ( Ptop_def [_1] ) -# 46172 "parsing/parser.ml" +# 48732 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 829 "parsing/parser.mly" +# 909 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 46180 "parsing/parser.ml" +# 48740 "parsing/parser.ml" in -# 889 "parsing/parser.mly" +# 969 "parsing/parser.mly" ( x ) -# 46186 "parsing/parser.ml" +# 48746 "parsing/parser.ml" in -# 1117 "parsing/parser.mly" +# 1197 "parsing/parser.mly" ( _1 ) -# 46192 "parsing/parser.ml" +# 48752 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 46198 "parsing/parser.ml" +# 48758 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_e_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 813 "parsing/parser.mly" +# 893 "parsing/parser.mly" ( extra_def _startpos _endpos _1 ) -# 46207 "parsing/parser.ml" +# 48767 "parsing/parser.ml" in -# 1110 "parsing/parser.mly" +# 1190 "parsing/parser.mly" ( _1 ) -# 46213 "parsing/parser.ml" +# 48773 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46246,9 +48806,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Asttypes.label) = -# 3470 "parsing/parser.mly" +# 3612 "parsing/parser.mly" ( _2 ) -# 46252 "parsing/parser.ml" +# 48812 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46287,9 +48847,9 @@ module Tables = struct let _v : (Asttypes.label) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3471 "parsing/parser.mly" +# 3613 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 46293 "parsing/parser.ml" +# 48853 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46320,9 +48880,9 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Asttypes.label) = let _loc__2_ = (_startpos__2_, _endpos__2_) in -# 3472 "parsing/parser.mly" +# 3614 "parsing/parser.mly" ( expecting _loc__2_ "operator" ) -# 46326 "parsing/parser.ml" +# 48886 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46360,9 +48920,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Asttypes.label) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 3473 "parsing/parser.mly" +# 3615 "parsing/parser.mly" ( expecting _loc__3_ "module-expr" ) -# 46366 "parsing/parser.ml" +# 48926 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46381,17 +48941,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 46387 "parsing/parser.ml" +# 48947 "parsing/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 : (Asttypes.label) = -# 3476 "parsing/parser.mly" +# 3618 "parsing/parser.mly" ( _1 ) -# 46395 "parsing/parser.ml" +# 48955 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46414,9 +48974,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3477 "parsing/parser.mly" +# 3619 "parsing/parser.mly" ( _1 ) -# 46420 "parsing/parser.ml" +# 48980 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46439,9 +48999,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3545 "parsing/parser.mly" +# 3687 "parsing/parser.mly" ( _1 ) -# 46445 "parsing/parser.ml" +# 49005 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46486,9 +49046,9 @@ module Tables = struct let ty : (Parsetree.core_type) = Obj.magic ty in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 46492 "parsing/parser.ml" +# 49052 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let mutable_ : (Asttypes.mutable_flag) = Obj.magic mutable_ in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -46500,33 +49060,33 @@ module Tables = struct Parsetree.attributes) = let label = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 46506 "parsing/parser.ml" +# 49066 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 46514 "parsing/parser.ml" +# 49074 "parsing/parser.ml" in let attrs = -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 46520 "parsing/parser.ml" +# 49080 "parsing/parser.ml" in let _1 = -# 3681 "parsing/parser.mly" +# 3829 "parsing/parser.mly" ( Fresh ) -# 46525 "parsing/parser.ml" +# 49085 "parsing/parser.ml" in -# 1861 "parsing/parser.mly" +# 1941 "parsing/parser.mly" ( (label, mutable_, Cfk_virtual ty), attrs ) -# 46530 "parsing/parser.ml" +# 49090 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46571,9 +49131,9 @@ module Tables = struct let _6 : (Parsetree.expression) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 46577 "parsing/parser.ml" +# 49137 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -46585,33 +49145,33 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 46591 "parsing/parser.ml" +# 49151 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 46599 "parsing/parser.ml" +# 49159 "parsing/parser.ml" in let _2 = -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 46605 "parsing/parser.ml" +# 49165 "parsing/parser.ml" in let _1 = -# 3684 "parsing/parser.mly" +# 3832 "parsing/parser.mly" ( Fresh ) -# 46610 "parsing/parser.ml" +# 49170 "parsing/parser.ml" in -# 1863 "parsing/parser.mly" +# 1943 "parsing/parser.mly" ( (_4, _3, Cfk_concrete (_1, _6)), _2 ) -# 46615 "parsing/parser.ml" +# 49175 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46662,9 +49222,9 @@ module Tables = struct let _6 : (Parsetree.expression) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 46668 "parsing/parser.ml" +# 49228 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -46677,36 +49237,36 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 46683 "parsing/parser.ml" +# 49243 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 46691 "parsing/parser.ml" +# 49251 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 46699 "parsing/parser.ml" +# 49259 "parsing/parser.ml" in let _1 = -# 3685 "parsing/parser.mly" +# 3833 "parsing/parser.mly" ( Override ) -# 46705 "parsing/parser.ml" +# 49265 "parsing/parser.ml" in -# 1863 "parsing/parser.mly" +# 1943 "parsing/parser.mly" ( (_4, _3, Cfk_concrete (_1, _6)), _2 ) -# 46710 "parsing/parser.ml" +# 49270 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46758,9 +49318,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : (Parsetree.core_type option * Parsetree.core_type option) = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 46764 "parsing/parser.ml" +# 49324 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -46772,30 +49332,30 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 46778 "parsing/parser.ml" +# 49338 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 46786 "parsing/parser.ml" +# 49346 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined1_ in let _2 = -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 46793 "parsing/parser.ml" +# 49353 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in let _1 = -# 3684 "parsing/parser.mly" +# 3832 "parsing/parser.mly" ( Fresh ) -# 46799 "parsing/parser.ml" +# 49359 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in let _endpos = _endpos__7_ in @@ -46811,11 +49371,11 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 1866 "parsing/parser.mly" +# 1946 "parsing/parser.mly" ( let e = mkexp_constraint ~loc:_sloc _7 _5 in (_4, _3, Cfk_concrete (_1, e)), _2 ) -# 46819 "parsing/parser.ml" +# 49379 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46873,9 +49433,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : (Parsetree.core_type option * Parsetree.core_type option) = Obj.magic _5 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 46879 "parsing/parser.ml" +# 49439 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -46888,33 +49448,33 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3444 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( _1 ) -# 46894 "parsing/parser.ml" +# 49454 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 46902 "parsing/parser.ml" +# 49462 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 46911 "parsing/parser.ml" +# 49471 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in let _1 = -# 3685 "parsing/parser.mly" +# 3833 "parsing/parser.mly" ( Override ) -# 46918 "parsing/parser.ml" +# 49478 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = if _startpos__1_ != _endpos__1_ then @@ -46929,11 +49489,11 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 1866 "parsing/parser.mly" +# 1946 "parsing/parser.mly" ( let e = mkexp_constraint ~loc:_sloc _7 _5 in (_4, _3, Cfk_concrete (_1, e)), _2 ) -# 46937 "parsing/parser.ml" +# 49497 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47000,9 +49560,9 @@ module Tables = struct let _v : (Parsetree.value_description * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 3778 "parsing/parser.mly" +# 3928 "parsing/parser.mly" ( _1 ) -# 47006 "parsing/parser.ml" +# 49566 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -47012,30 +49572,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 47018 "parsing/parser.ml" +# 49578 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3782 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( _1 ) -# 47026 "parsing/parser.ml" +# 49586 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2827 "parsing/parser.mly" +# 2939 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Val.mk id ty ~attrs ~loc ~docs, ext ) -# 47039 "parsing/parser.ml" +# 49599 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47051,9 +49611,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.virtual_flag) = -# 3645 "parsing/parser.mly" +# 3793 "parsing/parser.mly" ( Concrete ) -# 47057 "parsing/parser.ml" +# 49617 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47076,9 +49636,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.virtual_flag) = -# 3646 "parsing/parser.mly" +# 3794 "parsing/parser.mly" ( Virtual ) -# 47082 "parsing/parser.ml" +# 49642 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47101,9 +49661,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag) = -# 3669 "parsing/parser.mly" +# 3817 "parsing/parser.mly" ( Immutable ) -# 47107 "parsing/parser.ml" +# 49667 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47133,9 +49693,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag) = -# 3670 "parsing/parser.mly" +# 3818 "parsing/parser.mly" ( Mutable ) -# 47139 "parsing/parser.ml" +# 49699 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47165,9 +49725,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag) = -# 3671 "parsing/parser.mly" +# 3819 "parsing/parser.mly" ( Mutable ) -# 47171 "parsing/parser.ml" +# 49731 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47190,9 +49750,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = -# 3676 "parsing/parser.mly" +# 3824 "parsing/parser.mly" ( Public ) -# 47196 "parsing/parser.ml" +# 49756 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47222,9 +49782,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 3677 "parsing/parser.mly" +# 3825 "parsing/parser.mly" ( Private ) -# 47228 "parsing/parser.ml" +# 49788 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47254,9 +49814,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 3678 "parsing/parser.mly" +# 3826 "parsing/parser.mly" ( Private ) -# 47260 "parsing/parser.ml" +# 49820 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47318,27 +49878,27 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 47322 "parsing/parser.ml" +# 49882 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 981 "parsing/parser.mly" ( xs ) -# 47327 "parsing/parser.ml" +# 49887 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 3039 "parsing/parser.mly" ( _1 ) -# 47333 "parsing/parser.ml" +# 49893 "parsing/parser.ml" in let _endpos__6_ = _endpos_xs_ in let _5 = let _1 = _1_inlined2 in -# 3240 "parsing/parser.mly" +# 3357 "parsing/parser.mly" ( _1 ) -# 47342 "parsing/parser.ml" +# 49902 "parsing/parser.ml" in let _3 = @@ -47347,16 +49907,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 47353 "parsing/parser.ml" +# 49913 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3163 "parsing/parser.mly" +# 3280 "parsing/parser.mly" ( let lident = loc_last _3 in Pwith_type (_3, @@ -47366,7 +49926,7 @@ module Tables = struct ~manifest:_5 ~priv:_4 ~loc:(make_loc _sloc))) ) -# 47370 "parsing/parser.ml" +# 49930 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47419,9 +49979,9 @@ module Tables = struct let _v : (Parsetree.with_constraint) = let _5 = let _1 = _1_inlined2 in -# 3240 "parsing/parser.mly" +# 3357 "parsing/parser.mly" ( _1 ) -# 47425 "parsing/parser.ml" +# 49985 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in @@ -47431,16 +49991,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 47437 "parsing/parser.ml" +# 49997 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3176 "parsing/parser.mly" +# 3293 "parsing/parser.mly" ( let lident = loc_last _3 in Pwith_typesubst (_3, @@ -47448,7 +50008,7 @@ module Tables = struct ~params:_2 ~manifest:_5 ~loc:(make_loc _sloc))) ) -# 47452 "parsing/parser.ml" +# 50012 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47497,9 +50057,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 47503 "parsing/parser.ml" +# 50063 "parsing/parser.ml" in let _2 = @@ -47508,15 +50068,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 47514 "parsing/parser.ml" +# 50074 "parsing/parser.ml" in -# 3184 "parsing/parser.mly" +# 3301 "parsing/parser.mly" ( Pwith_module (_2, _4) ) -# 47520 "parsing/parser.ml" +# 50080 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47565,9 +50125,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 47571 "parsing/parser.ml" +# 50131 "parsing/parser.ml" in let _2 = @@ -47576,15 +50136,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 47582 "parsing/parser.ml" +# 50142 "parsing/parser.ml" in -# 3186 "parsing/parser.mly" +# 3303 "parsing/parser.mly" ( Pwith_modsubst (_2, _4) ) -# 47588 "parsing/parser.ml" +# 50148 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47607,9 +50167,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = -# 3189 "parsing/parser.mly" +# 3306 "parsing/parser.mly" ( Public ) -# 47613 "parsing/parser.ml" +# 50173 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47639,9 +50199,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 3190 "parsing/parser.mly" +# 3307 "parsing/parser.mly" ( Private ) -# 47645 "parsing/parser.ml" +# 50205 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47669,51 +50229,51 @@ end let use_file = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Legacy 1849 lexer lexbuf) : (Parsetree.toplevel_phrase list)) + (Obj.magic (MenhirInterpreter.entry `Legacy 1931 lexer lexbuf) : (Parsetree.toplevel_phrase list)) and toplevel_phrase = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Legacy 1829 lexer lexbuf) : (Parsetree.toplevel_phrase)) + (Obj.magic (MenhirInterpreter.entry `Legacy 1911 lexer lexbuf) : (Parsetree.toplevel_phrase)) and parse_val_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Legacy 1823 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Legacy 1905 lexer lexbuf) : (Longident.t)) and parse_pattern = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Legacy 1819 lexer lexbuf) : (Parsetree.pattern)) + (Obj.magic (MenhirInterpreter.entry `Legacy 1901 lexer lexbuf) : (Parsetree.pattern)) and parse_mty_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Legacy 1815 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Legacy 1897 lexer lexbuf) : (Longident.t)) and parse_mod_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Legacy 1811 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Legacy 1893 lexer lexbuf) : (Longident.t)) and parse_mod_ext_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Legacy 1807 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Legacy 1889 lexer lexbuf) : (Longident.t)) and parse_expression = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Legacy 1803 lexer lexbuf) : (Parsetree.expression)) + (Obj.magic (MenhirInterpreter.entry `Legacy 1885 lexer lexbuf) : (Parsetree.expression)) and parse_core_type = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Legacy 1799 lexer lexbuf) : (Parsetree.core_type)) + (Obj.magic (MenhirInterpreter.entry `Legacy 1881 lexer lexbuf) : (Parsetree.core_type)) and parse_constr_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Legacy 1795 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Legacy 1877 lexer lexbuf) : (Longident.t)) and parse_any_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Legacy 1777 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Legacy 1859 lexer lexbuf) : (Longident.t)) and interface = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Legacy 1773 lexer lexbuf) : (Parsetree.signature)) + (Obj.magic (MenhirInterpreter.entry `Legacy 1855 lexer lexbuf) : (Parsetree.signature)) and implementation = fun lexer lexbuf -> @@ -47723,51 +50283,51 @@ module Incremental = struct let use_file = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1849 initial_position) : (Parsetree.toplevel_phrase list) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1931 initial_position) : (Parsetree.toplevel_phrase list) MenhirInterpreter.checkpoint) and toplevel_phrase = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1829 initial_position) : (Parsetree.toplevel_phrase) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1911 initial_position) : (Parsetree.toplevel_phrase) MenhirInterpreter.checkpoint) and parse_val_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1823 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1905 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_pattern = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1819 initial_position) : (Parsetree.pattern) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1901 initial_position) : (Parsetree.pattern) MenhirInterpreter.checkpoint) and parse_mty_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1815 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1897 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_mod_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1811 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1893 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_mod_ext_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1807 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1889 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_expression = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1803 initial_position) : (Parsetree.expression) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1885 initial_position) : (Parsetree.expression) MenhirInterpreter.checkpoint) and parse_core_type = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1799 initial_position) : (Parsetree.core_type) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1881 initial_position) : (Parsetree.core_type) MenhirInterpreter.checkpoint) and parse_constr_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1795 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1877 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_any_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1777 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1859 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and interface = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1773 initial_position) : (Parsetree.signature) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1855 initial_position) : (Parsetree.signature) MenhirInterpreter.checkpoint) and implementation = fun initial_position -> @@ -47775,12 +50335,12 @@ module Incremental = struct end -# 3812 "parsing/parser.mly" +# 3962 "parsing/parser.mly" -# 47782 "parsing/parser.ml" +# 50342 "parsing/parser.ml" # 269 "" -# 47787 "parsing/parser.ml" +# 50347 "parsing/parser.ml" diff --git a/boot/menhir/parser.mli b/boot/menhir/parser.mli index dd3f68ee8ec..2a30fae5024 100644 --- a/boot/menhir/parser.mli +++ b/boot/menhir/parser.mli @@ -41,6 +41,7 @@ type token = | OF | OBJECT | NONREC + | NONLOCAL | NEW | MUTABLE | MODULE @@ -50,6 +51,7 @@ type token = | METHOD | MATCH | LPAREN + | LOCAL | LIDENT of (string) | LETOP of (string) | LET @@ -84,6 +86,7 @@ type token = | GREATERRBRACKET | GREATERRBRACE | GREATER + | GLOBAL | FUNCTOR | FUNCTION | FUN diff --git a/boot/ocamlc b/boot/ocamlc index fe3265044d9b51eb4576b7380641b3816d4410da..3ed6664e4a080fda02745e3a8a9ce6537ba508f5 100755 GIT binary patch delta 469675 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 z%0D#IS?!(R9(ede=M>1m`ExQ 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�`!y4tW@yDu-Muj)I>5 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 delta 425499 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�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 diff --git a/boot/ocamllex b/boot/ocamllex index 23534c67fe7600e10078a311f598df084caf4e58..b5578d03ec7d7ec8a0144532fff8985c2d5203f0 100755 GIT binary patch delta 11787 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 delta 11795 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/dev/null)" + err=$? + set -e + if [ $err = 2 ]; then + git remote add "$name" "$url" + elif [ "$curr" != "$url" ]; then + { + echo "Error: remote $name should point to $url, not $curr" + echo "Try 'git remote rm $name'." + } 1>&2 + exit 1 + fi +} + +configure_remote origin 'git@github.com:ocaml-flambda/ocaml-jst' +configure_remote flambda-backend 'git@github.com:ocaml-flambda/flambda-backend' +configure_remote ocaml 'git@github.com:ocaml/ocaml' + +git fetch -q origin +git fetch -q flambda-backend + +git checkout -q flambda-backend/main +rev=$(git subtree split -P ocaml --annotate='flambda-backend: ' flambda-backend/main) +git push -q origin $rev:refs/heads/flambda-patches |& sed '/^remote: /d' +git checkout -q - + +count=$(git rev-list HEAD..origin/flambda-patches | wc -l) +echo "$count new patches:" +git --no-pager log --oneline HEAD..origin/flambda-patches +git merge --no-ff -m 'Merge flambda-backend changes' origin/flambda-patches diff --git a/lambda/lambda.ml b/lambda/lambda.ml index 1f6e04e5dfb..b5f6388b50e 100644 --- a/lambda/lambda.ml +++ b/lambda/lambda.ml @@ -51,8 +51,8 @@ type alloc_mode = | Alloc_local type region_close = - | Rc_close_at_apply | Rc_normal + | Rc_close_at_apply type primitive = | Pidentity diff --git a/lambda/lambda.mli b/lambda/lambda.mli index 7aef9829af3..d444b93628f 100644 --- a/lambda/lambda.mli +++ b/lambda/lambda.mli @@ -57,9 +57,10 @@ type alloc_mode = | Alloc_heap | Alloc_local +(* Tail calls can close their enclosing region early *) type region_close = - | Rc_close_at_apply | Rc_normal + | Rc_close_at_apply type primitive = | Pidentity diff --git a/lambda/translcore.ml b/lambda/translcore.ml index 59a7481b654..48100cdc528 100644 --- a/lambda/translcore.ml +++ b/lambda/translcore.ml @@ -94,6 +94,69 @@ let extract_float = function Const_base(Const_float f) -> f | _ -> fatal_error "Translcore.extract_float" +let transl_alloc_mode alloc_mode : Lambda.alloc_mode = + match Btype.Alloc_mode.constrain_lower alloc_mode with + | Global -> Alloc_heap + | Local -> Alloc_local + +let transl_value_mode mode = + let alloc_mode = Btype.Value_mode.regional_to_global_alloc mode in + transl_alloc_mode alloc_mode + +let transl_apply_position position = + match position with + | Nontail -> Rc_normal + | Tail -> Rc_close_at_apply + +let may_allocate_in_region lam = + let rec loop = function + | Lvar _ | Lconst _ -> () + + | Lfunction {mode=Alloc_heap} -> () + | Lfunction {mode=Alloc_local} -> raise Exit + + | Lapply {ap_mode=Alloc_local} + | Lsend (_,_,_,_,_,Alloc_local,_) -> raise Exit + + | Lprim (prim, args, _) -> + begin match Lambda.primitive_may_allocate prim with + | Some Alloc_local -> raise Exit + | None | Some Alloc_heap -> + List.iter loop args + end + | Lregion _body -> + (* [_body] might do local allocations, but not in the current region *) + () + | Lwhile (cond, _body) -> + (* [_body] already has a region *) + loop cond + | Lfor (_var, l, u, _dir, _body) -> + (* [_body] already has a region *) + loop l; loop u + + | ( Lapply _ | Llet _ | Lletrec _ | Lswitch _ | Lstringswitch _ + | Lstaticraise _ | Lstaticcatch _ | Ltrywith _ + | Lifthenelse _ | Lsequence _ | Lassign _ | Lsend _ + | Levent _ | Lifused _) as lam -> + Lambda.iter_head_constructor loop lam + in + match loop lam with + | () -> false + | exception Exit -> true + +let maybe_region lam = + let rec remove_tail_markers = function + | Lapply ({ap_region_close = Rc_close_at_apply} as ap) -> + Lapply ({ap with ap_region_close = Rc_normal}) + | Lsend (k, lmet, lobj, largs, Rc_close_at_apply, mode, loc) -> + Lsend (k, lmet, lobj, largs, Rc_normal, mode, loc) + | Lregion _ as lam -> lam + | lam -> + Lambda.shallow_map ~tail:remove_tail_markers ~non_tail:Fun.id lam + in + if may_allocate_in_region lam then Lregion lam + else remove_tail_markers lam + (* Push the default values under the functional abstractions *) (* Also push bindings of module patterns, since this sound *) @@ -104,12 +167,13 @@ type binding = let rec push_defaults loc bindings cases partial = match cases with [{c_lhs=pat; c_guard=None; - c_rhs={exp_desc = Texp_function { arg_label; param; cases; partial; } } + c_rhs={exp_desc = + Texp_function { arg_label; param; cases; partial; region }} as exp}] -> let cases = push_defaults exp.exp_loc bindings cases partial in [{c_lhs=pat; c_guard=None; c_rhs={exp with exp_desc = Texp_function { arg_label; param; cases; - partial; }}}] + partial; region; }}}] | [{c_lhs=pat; c_guard=None; c_rhs={exp_attributes=[{Parsetree.attr_name = {txt="#default"};_}]; exp_desc = Texp_let @@ -155,7 +219,8 @@ let rec push_defaults loc bindings cases partial = Texp_match ({exp with exp_type = pat.pat_type; exp_env = env; exp_desc = Texp_ident - (Path.Pident param, mknoloc (Longident.Lident name), desc)}, + (Path.Pident param, mknoloc (Longident.Lident name), + desc, Id_value)}, cases, partial) } in push_defaults loc bindings @@ -221,16 +286,34 @@ let rec iter_exn_names f pat = iter_exn_names f p | _ -> () -let transl_ident loc env ty path desc = - match desc.val_kind with - | Val_prim p -> - Translprim.transl_primitive loc p env ty ~poly_mode:Alloc_heap (Some path) - | Val_anc _ -> +let transl_ident loc env ty path desc kind = + match desc.val_kind, kind with + | Val_prim p, Id_prim pmode -> + let poly_mode = transl_alloc_mode pmode in + Translprim.transl_primitive loc p env ty ~poly_mode (Some path) + | Val_anc _, Id_value -> raise(Error(to_location loc, Free_super_var)) - | Val_reg | Val_self _ -> + | (Val_reg | Val_self _), Id_value -> transl_value_path loc env path | _ -> fatal_error "Translcore.transl_exp: bad Texp_ident" +let can_apply_primitive p pmode pos args = + let is_omitted = function + | Arg _ -> false + | Omitted _ -> true + in + if List.exists (fun (_, arg) -> is_omitted arg) args then false + else begin + let nargs = List.length args in + if nargs = p.prim_arity then true + else if nargs < p.prim_arity then false + else if pos = Typedtree.Nontail then true + else begin + let return_mode = Ctype.prim_mode pmode p.prim_native_repr_res in + (transl_alloc_mode return_mode = Alloc_heap) + end + end + let rec transl_exp ~scopes e = transl_exp1 ~scopes ~in_new_scope:false e @@ -252,34 +335,39 @@ and transl_exp1 ~scopes ~in_new_scope e = and transl_exp0 ~in_new_scope ~scopes e = match e.exp_desc with - | Texp_ident(path, _, desc) -> + | Texp_ident(path, _, desc, kind) -> transl_ident (of_location ~scopes e.exp_loc) - e.exp_env e.exp_type path desc + e.exp_env e.exp_type path desc kind | Texp_constant cst -> Lconst(Const_base cst) | Texp_let(rec_flag, pat_expr_list, body) -> transl_let ~scopes rec_flag pat_expr_list (event_before ~scopes body (transl_exp ~scopes body)) - | Texp_function { arg_label = _; param; cases; partial; } -> + | Texp_function { arg_label = _; param; cases; partial; region } -> let scopes = if in_new_scope then scopes else enter_anonymous_function ~scopes in - transl_function ~scopes e param cases partial - | Texp_apply({ exp_desc = Texp_ident(path, _, {val_kind = Val_prim p}); - exp_type = prim_type } as funct, oargs) - when List.length oargs >= p.prim_arity - && List.for_all (fun (_, arg) -> arg <> None) oargs -> + transl_function ~scopes e param cases partial region + | Texp_apply({ exp_desc = Texp_ident(path, _, {val_kind = Val_prim p}, + Id_prim pmode); + exp_type = prim_type } as funct, oargs, pos) + when can_apply_primitive p pmode pos oargs -> let argl, extra_args = cut p.prim_arity oargs in let arg_exps = - List.map (function _, Some x -> x | _ -> assert false) argl + List.map (function _, Arg x -> x | _ -> assert false) argl in let args = transl_list ~scopes arg_exps in let prim_exp = if extra_args = [] then Some e else None in + let position = + if extra_args = [] then transl_apply_position pos + else Rc_normal + in + let prim_mode = transl_alloc_mode pmode in let lam = Translprim.transl_primitive_application - (of_location ~scopes e.exp_loc) p e.exp_env prim_type Alloc_heap - path prim_exp args arg_exps Rc_normal + (of_location ~scopes e.exp_loc) p e.exp_env prim_type prim_mode + path prim_exp args arg_exps position in if extra_args = [] then lam else begin @@ -292,12 +380,14 @@ and transl_exp0 ~in_new_scope ~scopes e = let specialised, funct = Translattribute.get_and_remove_specialised_attribute funct in - let e = { e with exp_desc = Texp_apply(funct, oargs) } in + let e = { e with exp_desc = Texp_apply(funct, oargs, pos) } in + let position = transl_apply_position pos in + let mode = transl_value_mode e.exp_mode in event_after ~scopes e - (transl_apply ~scopes ~tailcall ~inlined ~specialised + (transl_apply ~scopes ~tailcall ~inlined ~specialised ~position ~mode lam extra_args (of_location ~scopes e.exp_loc)) end - | Texp_apply(funct, oargs) -> + | Texp_apply(funct, oargs, position) -> let tailcall, funct = Translattribute.get_tailcall_attribute funct in @@ -307,10 +397,13 @@ and transl_exp0 ~in_new_scope ~scopes e = let specialised, funct = Translattribute.get_and_remove_specialised_attribute funct in - let e = { e with exp_desc = Texp_apply(funct, oargs) } in + let e = { e with exp_desc = Texp_apply(funct, oargs, position) } in + let position = transl_apply_position position in + let mode = transl_value_mode e.exp_mode in event_after ~scopes e (transl_apply ~scopes ~tailcall ~inlined ~specialised - (transl_exp ~scopes funct) oargs (of_location ~scopes e.exp_loc)) + ~position ~mode (transl_exp ~scopes funct) + oargs (of_location ~scopes e.exp_loc)) | Texp_match(arg, pat_expr_list, partial) -> transl_match ~scopes e arg pat_expr_list partial | Texp_try(body, pat_expr_list) -> @@ -324,7 +417,7 @@ and transl_exp0 ~in_new_scope ~scopes e = Lconst(Const_block(0, List.map extract_constant ll)) with Not_constant -> Lprim(Pmakeblock(0, Immutable, Some shape, - Alloc_heap), + transl_value_mode e.exp_mode), ll, (of_location ~scopes e.exp_loc)) end @@ -343,7 +436,7 @@ and transl_exp0 ~in_new_scope ~scopes e = Lconst(Const_block(n, List.map extract_constant ll)) with Not_constant -> Lprim(Pmakeblock(n, Immutable, Some shape, - Alloc_heap), + transl_value_mode e.exp_mode), ll, of_location ~scopes e.exp_loc) end @@ -353,7 +446,7 @@ and transl_exp0 ~in_new_scope ~scopes e = if is_const then lam else Lprim(Pmakeblock(0, Immutable, Some (Pgenval :: shape), - Alloc_heap), + transl_value_mode e.exp_mode), lam :: ll, of_location ~scopes e.exp_loc) end | Texp_extension_constructor (_, path) -> @@ -369,12 +462,13 @@ and transl_exp0 ~in_new_scope ~scopes e = extract_constant lam])) with Not_constant -> Lprim(Pmakeblock(0, Immutable, None, - Alloc_heap), + transl_value_mode e.exp_mode), [Lconst(const_int tag); lam], of_location ~scopes e.exp_loc) end | Texp_record {fields; representation; extended_expression} -> transl_record ~scopes e.exp_loc e.exp_env + (transl_value_mode e.exp_mode) fields representation extended_expression | Texp_field(arg, _, lbl) -> let targ = transl_exp ~scopes arg in @@ -389,28 +483,36 @@ and transl_exp0 ~in_new_scope ~scopes e = of_location ~scopes e.exp_loc) | Record_unboxed _ -> targ | Record_float -> - Lprim (Pfloatfield (lbl.lbl_pos, sem, Alloc_heap), [targ], + let mode = transl_value_mode e.exp_mode in + Lprim (Pfloatfield (lbl.lbl_pos, sem, mode), [targ], of_location ~scopes e.exp_loc) | Record_extension _ -> Lprim (Pfield (lbl.lbl_pos + 1, sem), [targ], of_location ~scopes e.exp_loc) end | Texp_setfield(arg, _, lbl, newval) -> + let mode = + let arg_mode = Btype.Value_mode.regional_to_local_alloc arg.exp_mode in + match Btype.Alloc_mode.constrain_lower arg_mode with + | Global -> Assignment + | Local -> Local_assignment + in let access = match lbl.lbl_repres with Record_regular | Record_inlined _ -> - Psetfield(lbl.lbl_pos, maybe_pointer newval, Assignment) + Psetfield(lbl.lbl_pos, maybe_pointer newval, mode) | Record_unboxed _ -> assert false - | Record_float -> Psetfloatfield (lbl.lbl_pos, Assignment) + | Record_float -> Psetfloatfield (lbl.lbl_pos, mode) | Record_extension _ -> - Psetfield (lbl.lbl_pos + 1, maybe_pointer newval, Assignment) + Psetfield (lbl.lbl_pos + 1, maybe_pointer newval, mode) in Lprim(access, [transl_exp ~scopes arg; transl_exp ~scopes newval], of_location ~scopes e.exp_loc) | Texp_array expr_list -> let kind = array_kind e in let ll = transl_list ~scopes expr_list in + let mode = transl_value_mode e.exp_mode in begin try (* For native code the decision as to which compilation strategy to use is made later. This enables the Flambda passes to lift certain @@ -420,6 +522,8 @@ and transl_exp0 ~in_new_scope ~scopes e = then begin raise Not_constant end; + (* Pduparray only works in Alloc_heap mode *) + if mode <> Alloc_heap then raise Not_constant; begin match List.map extract_constant ll with | exception Not_constant when kind = Pfloatarray -> (* We cannot currently lift [Pintarray] arrays safely in Flambda @@ -435,7 +539,7 @@ and transl_exp0 ~in_new_scope ~scopes e = When not [Pfloatarray], the exception propagates to the handler below. *) let imm_array = - Lprim (Pmakearray (kind, Immutable, Alloc_heap), ll, + Lprim (Pmakearray (kind, Immutable, mode), ll, of_location ~scopes e.exp_loc) in Lprim (Pduparray (kind, Mutable), [imm_array], @@ -454,7 +558,7 @@ and transl_exp0 ~in_new_scope ~scopes e = of_location ~scopes e.exp_loc) end with Not_constant -> - Lprim(Pmakearray (kind, Mutable, Alloc_heap), ll, + Lprim(Pmakearray (kind, Mutable, mode), ll, of_location ~scopes e.exp_loc) end | Texp_ifthenelse(cond, ifso, Some ifnot) -> @@ -469,8 +573,8 @@ and transl_exp0 ~in_new_scope ~scopes e = Lsequence(transl_exp ~scopes expr1, event_before ~scopes expr2 (transl_exp ~scopes expr2)) | Texp_while(cond, body) -> - Lwhile(transl_exp ~scopes cond, - event_before ~scopes body (transl_exp ~scopes body)) + Lwhile(maybe_region (transl_exp ~scopes cond), + event_before ~scopes body (maybe_region (transl_exp ~scopes body))) | Texp_arr_comprehension (body, blocks) -> (*One block consists of comprehension statements connected by "and".*) let loc = of_location ~scopes e.exp_loc in @@ -482,14 +586,15 @@ and transl_exp0 ~in_new_scope ~scopes e = Translcomprehension.transl_list_comprehension body blocks ~scopes ~loc ~transl_exp | Texp_for(param, _, low, high, dir, body) -> - Lfor(param, transl_exp ~scopes low, transl_exp ~scopes high, dir, - event_before ~scopes body (transl_exp ~scopes body)) - | Texp_send(_, _, Some exp) -> transl_exp ~scopes exp - | Texp_send(expr, met, None) -> + Lfor(param, transl_exp ~scopes low, + transl_exp ~scopes high, dir, + event_before ~scopes body (maybe_region (transl_exp ~scopes body))) + | Texp_send(_, _, Some exp, _) -> transl_exp ~scopes exp + | Texp_send(expr, met, None, pos) -> let obj = transl_exp ~scopes expr in let loc = of_location ~scopes e.exp_loc in - let pos = Lambda.Rc_normal in - let mode = Lambda.Alloc_heap in + let pos = transl_apply_position pos in + let mode = transl_value_mode e.exp_mode in let lam = match met with Tmeth_val id -> Lsend (Self, Lvar id, obj, [], pos, mode, loc) @@ -499,15 +604,16 @@ and transl_exp0 ~in_new_scope ~scopes e = Lsend (kind, tag, obj, cache, pos, mode, loc) in event_after ~scopes e lam - | Texp_new (cl, {Location.loc=loc}, _) -> + | Texp_new (cl, {Location.loc=loc}, _, pos) -> let loc = of_location ~scopes loc in + let pos = transl_apply_position pos in Lapply{ ap_loc=loc; ap_func= Lprim(Pfield (0, Reads_vary), [transl_class_path loc e.exp_env cl], loc); ap_args=[lambda_unit]; - ap_region_close=Rc_normal; + ap_region_close=pos; ap_mode=Alloc_heap; ap_tailcall=Default_tailcall; ap_inlined=Default_inlined; @@ -554,7 +660,8 @@ and transl_exp0 ~in_new_scope ~scopes e = | Texp_letmodule(Some id, loc, Mp_present, modl, body) -> let defining_expr = let mod_scopes = enter_module_definition ~scopes id in - Levent (!transl_module ~scopes:mod_scopes Tcoerce_none None modl, { + let lam = !transl_module ~scopes:mod_scopes Tcoerce_none None modl in + Levent (lam, { lev_loc = of_location ~scopes loc.loc; lev_kind = Lev_module_definition id; lev_repr = None; @@ -575,12 +682,16 @@ and transl_exp0 ~in_new_scope ~scopes e = | Texp_assert (cond) -> if !Clflags.noassert then lambda_unit - else Lifthenelse (transl_exp ~scopes cond, lambda_unit, - assert_failed ~scopes e) + else begin + Lifthenelse + (transl_exp ~scopes cond, + lambda_unit, assert_failed ~scopes e) + end | Texp_lazy e -> (* when e needs no computation (constants, identifiers, ...), we optimize the translation just as Lazy.lazy_from_val would do *) + assert (transl_value_mode e.exp_mode = Alloc_heap); begin match Typeopt.classify_lazy_argument e with | `Constant_or_function -> (* A constant expr (of type <> float if [Config.flat_float_array] is @@ -590,7 +701,8 @@ and transl_exp0 ~in_new_scope ~scopes e = (* We don't need to wrap with Popaque: this forward block will never be shortcutted since it points to a float and Config.flat_float_array is true. *) - Lprim(Pmakeblock(Obj.forward_tag, Immutable, None, Alloc_heap), + Lprim(Pmakeblock(Obj.forward_tag, Immutable, None, + Alloc_heap), [transl_exp ~scopes e], of_location ~scopes e.exp_loc) | `Identifier `Forward_value -> (* CR-someday mshinwell: Consider adding a new primitive @@ -600,7 +712,8 @@ and transl_exp0 ~in_new_scope ~scopes e = block doesn't really match what is going on here. This value may subsequently turn into an immediate... *) Lprim (Popaque, - [Lprim(Pmakeblock(Obj.forward_tag, Immutable, None, Alloc_heap), + [Lprim(Pmakeblock(Obj.forward_tag, Immutable, None, + Alloc_heap), [transl_exp ~scopes e], of_location ~scopes e.exp_loc)], of_location ~scopes e.exp_loc) @@ -616,7 +729,7 @@ and transl_exp0 ~in_new_scope ~scopes e = loc = of_location ~scopes e.exp_loc; mode = Alloc_heap; region = true; - body = transl_exp ~scopes e} in + body = maybe_region (transl_exp ~scopes e)} in Lprim(Pmakeblock(Config.lazy_tag, Mutable, None, Alloc_heap), [fn], of_location ~scopes e.exp_loc) @@ -776,31 +889,47 @@ and transl_apply ~scopes ?(tailcall=Default_tailcall) ?(inlined = Default_inlined) ?(specialised = Default_specialise) + ?(position=Rc_normal) + ?(mode=Alloc_heap) lam sargs loc = - let lapply loc funct args = - match funct with - Lsend(k, lmet, lobj, largs, _, _, _) -> - Lsend(k, lmet, lobj, largs @ args, Rc_normal, Alloc_heap, loc) - | Levent(Lsend(k, lmet, lobj, largs, _, _, _), _) -> - Lsend(k, lmet, lobj, largs @ args, Rc_normal, Alloc_heap, loc) - | Lapply ap -> - Lapply {ap with ap_args = ap.ap_args @ args; ap_loc = loc} - | lexp -> + let lapply funct args loc pos mode = + match funct, pos with + | Lsend((Self | Public) as k, lmet, lobj, [], _, _, _), _ -> + Lsend(k, lmet, lobj, args, pos, mode, loc) + | Lsend(Cached, lmet, lobj, ([_; _] as largs), _, _, _), _ -> + Lsend(Cached, lmet, lobj, largs @ args, pos, mode, loc) + | Lsend(k, lmet, lobj, largs, Rc_normal, _, _), Rc_normal -> + Lsend(k, lmet, lobj, largs @ args, pos, mode, loc) + | Levent( + Lsend((Self | Public) as k, lmet, lobj, [], _, _, _), _), _ -> + Lsend(k, lmet, lobj, args, pos, mode, loc) + | Levent( + Lsend(Cached, lmet, lobj, ([_; _] as largs), _, _, _), _), _ -> + Lsend(Cached, lmet, lobj, largs @ args, pos, mode, loc) + | Levent( + Lsend(k, lmet, lobj, largs, Rc_normal, _, _), _), Rc_normal -> + Lsend(k, lmet, lobj, largs @ args, pos, mode, loc) + | Lapply ({ ap_region_close = Rc_normal } as ap), Rc_normal -> + Lapply + {ap with ap_args = ap.ap_args @ args; ap_loc = loc; + ap_region_close = pos; ap_mode = mode} + | lexp, _ -> Lapply { ap_loc=loc; ap_func=lexp; ap_args=args; - ap_region_close=Rc_normal; - ap_mode=Alloc_heap; + ap_region_close=pos; + ap_mode=mode; ap_tailcall=tailcall; ap_inlined=inlined; ap_specialised=specialised; ap_probe=None; } in - let rec build_apply lam args loc = function - (None, optional) :: l -> + let rec build_apply lam args loc pos ap_mode = function + | Omitted { mode_closure; mode_arg; mode_ret } :: l -> + assert (pos = Rc_normal); let defs = ref [] in let protect name lam = match lam with @@ -810,78 +939,97 @@ and transl_apply ~scopes defs := (id, lam) :: !defs; Lvar id in - let args, args' = - if List.for_all (fun (_,opt) -> opt) args then [], args - else args, [] - in let lam = - if args = [] then lam else lapply loc lam (List.rev_map fst args) + if args = [] then lam else lapply lam (List.rev args) loc pos ap_mode in let handle = protect "func" lam in let l = - List.map (fun (arg, opt) -> Option.map (protect "arg") arg, opt) l + List.map + (fun arg -> + match arg with + | Omitted _ -> arg + | Arg arg -> Arg (protect "arg" arg)) + l in let id_arg = Ident.create_local "param" in let body = let loc = map_scopes enter_partial_or_eta_wrapper loc in - match build_apply handle ((Lvar id_arg, optional)::args') loc l with - Lfunction{kind = Curried {nlocal=0}; params = ids; return; - body = lam; attr; loc} - when List.length ids < Lambda.max_arity () -> - Lfunction{kind = Curried {nlocal=0}; - params = (id_arg, Pgenval)::ids; - return; - body = lam; attr; - mode = Alloc_heap; region = true; - loc} - | Levent(Lfunction{kind = Curried {nlocal=0}; params = ids; return; - body = lam; attr; loc}, _) -> - Lfunction{kind = Curried {nlocal=0}; params = (id_arg, Pgenval)::ids; - return; - body = lam; attr; - mode = Alloc_heap; region = true; - loc} - | lam -> - Lfunction{kind = Curried {nlocal=0}; params = [id_arg, Pgenval]; - return = Pgenval; body = lam; - attr = default_stub_attribute; loc = loc; - mode = Alloc_heap; region = true} + let mode = transl_alloc_mode mode_closure in + let arg_mode = transl_alloc_mode mode_arg in + let ret_mode = transl_alloc_mode mode_ret in + let body = build_apply handle [Lvar id_arg] loc Rc_normal ret_mode l in + let nlocal = + match join_mode mode (join_mode arg_mode ret_mode) with + | Alloc_local -> 1 + | Alloc_heap -> 0 + in + let region = + match ret_mode with + | Alloc_local -> false + | Alloc_heap -> true + in + Lfunction{kind = Curried {nlocal}; params = [id_arg, Pgenval]; + return = Pgenval; body; mode; region; + attr = default_stub_attribute; loc = loc} in - List.fold_left - (fun body (id, lam) -> Llet(Strict, Pgenval, id, lam, body)) - body !defs - | (Some arg, optional) :: l -> - build_apply lam ((arg, optional) :: args) loc l - | [] -> - lapply loc lam (List.rev_map fst args) + List.fold_right + (fun (id, lam) body -> Llet(Strict, Pgenval, id, lam, body)) + !defs body + | Arg arg :: l -> build_apply lam (arg :: args) loc pos ap_mode l + | [] -> lapply lam (List.rev args) loc pos ap_mode in - (build_apply lam [] loc (List.map (fun (l, x) -> - Option.map (transl_exp ~scopes) x, - Btype.is_optional l) - sargs) - : Lambda.lambda) + let args = + List.map + (fun (_, arg) -> + match arg with + | Omitted _ as arg -> arg + | Arg exp -> Arg (transl_exp ~scopes exp)) + sargs + in + build_apply lam [] loc position mode args and transl_curried_function ~scopes loc return - repr partial (param:Ident.t) cases = + repr ~mode ~region partial (param:Ident.t) cases = let max_arity = Lambda.max_arity () in - let rec loop ~scopes loc return ~arity partial (param:Ident.t) cases = + let rec loop ~scopes loc return ~arity ~mode ~region partial + (param:Ident.t) cases = match cases with [{c_lhs=pat; c_guard=None; c_rhs={exp_desc = Texp_function { arg_label = _; param = param'; cases = cases'; - partial = partial'; }; exp_env; exp_type;exp_loc}}] - when arity < max_arity -> - if Parmatch.inactive ~partial pat + partial = partial'; region = region' }; + exp_env; exp_type; exp_loc; exp_mode}}] + when arity < max_arity -> + let arg_mode = transl_value_mode pat.pat_mode in + let curry_mode = transl_value_mode exp_mode in + (* Lfunctions must have local returns after the first local arg/ret *) + if not (sub_mode mode curry_mode && sub_mode arg_mode curry_mode) then + (* Cannot curry here *) + transl_tupled_function ~scopes ~arity ~mode ~region + loc return repr partial param cases + else if Parmatch.inactive ~partial pat then let kind = value_kind pat.pat_env pat.pat_type in let return_kind = function_return_value_kind exp_env exp_type in - let ((_, params, return), body) = - loop ~scopes exp_loc return_kind ~arity:(arity + 1) + let ((fnkind, params, return, region), body) = + loop ~scopes exp_loc return_kind + ~arity:(arity + 1) ~mode:curry_mode ~region:region' partial' param' cases' in - ((Curried {nlocal=0}, (param, kind) :: params, return), + let fnkind = + match curry_mode, fnkind with + | _, Tupled -> + (* arity > 1 prevents this *) + assert false + | Alloc_heap, (Curried _ as c) -> c + | Alloc_local, Curried {nlocal} -> + (* all subsequent curried arrows should be local *) + assert (nlocal = List.length params); + Curried {nlocal = nlocal + 1} + in + ((fnkind, (param, kind) :: params, return, region), Matching.for_function ~scopes loc None (Lvar param) [pat, body] partial) else begin @@ -891,22 +1039,24 @@ and transl_curried_function Match_on_mutable_state_prevent_uncurry | Partial -> () end; - transl_tupled_function ~scopes ~arity + transl_tupled_function ~scopes ~arity ~mode ~region loc return repr partial param cases end | cases -> - transl_tupled_function ~scopes ~arity + transl_tupled_function ~scopes ~arity ~mode ~region loc return repr partial param cases in - loop ~scopes loc return ~arity:1 partial param cases + loop ~scopes loc return ~arity:1 ~mode ~region partial param cases and transl_tupled_function - ~scopes ~arity loc return + ~scopes ~arity ~mode ~region loc return repr partial (param:Ident.t) cases = match cases with - | {c_lhs={pat_desc = Tpat_tuple pl}} :: _ + | {c_lhs={pat_desc = Tpat_tuple pl; pat_mode }} :: _ when !Clflags.native_code && arity = 1 + && mode = Alloc_heap + && transl_value_mode pat_mode = Alloc_heap && List.length pl <= (Lambda.max_arity ()) -> begin try let size = List.length pl in @@ -936,46 +1086,64 @@ and transl_tupled_function List.map (fun kind -> Ident.create_local "param", kind) kinds in let params = List.map fst tparams in - ((Tupled, tparams, return), + ((Tupled, tparams, return, region), Matching.for_tupled_function ~scopes loc params (transl_tupled_cases ~scopes pats_expr_list) partial) with Matching.Cannot_flatten -> - transl_function0 ~scopes loc return repr partial param cases + transl_function0 ~scopes loc ~mode ~region + return repr partial param cases end - | _ -> transl_function0 ~scopes loc return repr partial param cases + | _ -> transl_function0 ~scopes loc ~mode ~region + return repr partial param cases and transl_function0 - ~scopes loc return + ~scopes loc ~mode ~region return repr partial (param:Ident.t) cases = - let kind = + let arg_mode, kind = match cases with | [] -> (* With Camlp4, a pattern matching might be empty *) - Pgenval + Alloc_heap, Pgenval | {c_lhs=pat} :: other_cases -> (* All the patterns might not share the same types. We must take the union of the patterns types *) + let arg_mode = transl_value_mode pat.pat_mode in + arg_mode, List.fold_left (fun k {c_lhs=pat} -> + assert (transl_value_mode pat.pat_mode = arg_mode); Typeopt.value_kind_union k (value_kind pat.pat_env pat.pat_type)) (value_kind pat.pat_env pat.pat_type) other_cases in - ((Curried {nlocal=0}, [param, kind], return), - Matching.for_function ~scopes loc repr (Lvar param) - (transl_cases ~scopes cases) partial) + let body = + Matching.for_function ~scopes loc repr (Lvar param) + (transl_cases ~scopes cases) partial + in + let region = region || not (may_allocate_in_region body) in + let nlocal = + if not region then 1 + else match join_mode mode arg_mode with + | Alloc_local -> 1 + | Alloc_heap -> 0 + in + ((Curried {nlocal}, [param, kind], return, region), body) -and transl_function ~scopes e param cases partial = - let ((kind, params, return), body) = +and transl_function ~scopes e param cases partial region = + let mode = transl_value_mode e.exp_mode in + let ((kind, params, return, region), body) = event_function ~scopes e (function repr -> let pl = push_defaults e.exp_loc [] cases partial in let return_kind = function_return_value_kind e.exp_env e.exp_type in transl_curried_function ~scopes e.exp_loc return_kind - repr partial param pl) + repr ~mode ~region partial param pl) in let attr = default_function_attribute in let loc = of_location ~scopes e.exp_loc in - let lam = Lfunction{kind; params; return; body; attr; loc; mode=Alloc_heap; region=true} in + let body = if region then maybe_region body else body in + let lfunc = {kind; params; return; body; attr; loc; mode; region} in + Lambda.check_lfunction lfunc; + let lam = Lfunction lfunc in Translattribute.add_function_attributes lam e.exp_loc e.exp_attributes (* Like transl_exp, but used when a new scope was just introduced. *) @@ -1000,7 +1168,8 @@ and transl_bound_exp ~scopes ~in_structure pat expr = This complication allows choosing any compilation order for the bindings and body of let constructs. *) -and transl_let ~scopes ?(in_structure=false) rec_flag pat_expr_list = +and transl_let ~scopes ?(add_regions=false) ?(in_structure=false) + rec_flag pat_expr_list = match rec_flag with Nonrecursive -> let rec transl = function @@ -1009,10 +1178,12 @@ and transl_let ~scopes ?(in_structure=false) rec_flag pat_expr_list = | {vb_pat=pat; vb_expr=expr; vb_attributes=attr; vb_loc} :: rem -> let lam = transl_bound_exp ~scopes ~in_structure pat expr in let lam = Translattribute.add_function_attributes lam vb_loc attr in + let lam = if add_regions then maybe_region lam else lam in let mk_body = transl rem in fun body -> Matching.for_let ~scopes pat.pat_loc lam pat (mk_body body) - in transl pat_expr_list + in + transl pat_expr_list | Recursive -> let idlist = List.map @@ -1026,6 +1197,12 @@ and transl_let ~scopes ?(in_structure=false) rec_flag pat_expr_list = let lam = Translattribute.add_function_attributes lam vb_loc vb_attributes in + let lam = if add_regions then maybe_region lam else lam in + begin match transl_value_mode expr.exp_mode, lam with + | Alloc_heap, _ -> () + | Alloc_local, Lfunction _ -> () + | _ -> Misc.fatal_error "transl_let: local recursive non-function" + end; (id, lam) in let lam_bds = List.map2 transl_case pat_expr_list idlist in fun body -> Lletrec(lam_bds, body) @@ -1034,12 +1211,12 @@ and transl_setinstvar ~scopes loc self var expr = Lprim(Psetfield_computed (maybe_pointer expr, Assignment), [self; var; transl_exp ~scopes expr], loc) -and transl_record ~scopes loc env fields repres opt_init_expr = +and transl_record ~scopes loc env mode fields repres opt_init_expr = let size = Array.length fields in (* Determine if there are "enough" fields (only relevant if this is a functional-style record update *) let no_init = match opt_init_expr with None -> true | _ -> false in - if no_init || size < Config.max_young_wosize + if no_init || size < Config.max_young_wosize || mode = Lambda.Alloc_local then begin (* Allocate new record with given fields (and remaining fields taken from init_expr if any *) @@ -1060,7 +1237,10 @@ and transl_record ~scopes loc env fields repres opt_init_expr = Record_regular | Record_inlined _ -> Pfield (i, sem) | Record_unboxed _ -> assert false | Record_extension _ -> Pfield (i + 1, sem) - | Record_float -> Pfloatfield (i, sem, Alloc_heap) in + | Record_float -> + (* This allocation is always deleted, + so it's simpler to leave it Alloc_heap *) + Pfloatfield (i, sem, Alloc_heap) in Lprim(access, [Lvar init_id], of_location ~scopes loc), field_kind @@ -1090,15 +1270,16 @@ and transl_record ~scopes loc env fields repres opt_init_expr = let loc = of_location ~scopes loc in match repres with Record_regular -> - Lprim(Pmakeblock(0, mut, Some shape, Alloc_heap), ll, loc) + Lprim(Pmakeblock(0, mut, Some shape, mode), ll, loc) | Record_inlined tag -> - Lprim(Pmakeblock(tag, mut, Some shape, Alloc_heap), ll, loc) + Lprim(Pmakeblock(tag, mut, Some shape, mode), ll, loc) | Record_unboxed _ -> (match ll with [v] -> v | _ -> assert false) | Record_float -> - Lprim(Pmakefloatblock (mut, Alloc_heap), ll, loc) + Lprim(Pmakefloatblock (mut, mode), ll, loc) | Record_extension path -> let slot = transl_extension_path loc env path in - Lprim(Pmakeblock(0, mut, Some (Pgenval :: shape), Alloc_heap), slot :: ll, loc) + Lprim(Pmakeblock(0, mut, Some (Pgenval :: shape), mode), + slot :: ll, loc) in begin match opt_init_expr with None -> lam @@ -1130,6 +1311,7 @@ and transl_record ~scopes loc env fields repres opt_init_expr = begin match opt_init_expr with None -> assert false | Some init_expr -> + assert (mode = Lambda.Alloc_heap); (* Pduprecord must be Alloc_heap *) Llet(Strict, Pgenval, copy_id, Lprim(Pduprecord (repres, size), [transl_exp ~scopes init_expr], of_location ~scopes loc), @@ -1198,8 +1380,9 @@ and transl_match ~scopes e arg pat_expr_list partial = match arg, exn_cases with | {exp_desc = Texp_tuple argl}, [] -> assert (static_handlers = []); + let mode = transl_value_mode arg.exp_mode in Matching.for_multiple_match ~scopes e.exp_loc - (transl_list ~scopes argl) Alloc_heap val_cases partial + (transl_list ~scopes argl) mode val_cases partial | {exp_desc = Texp_tuple argl}, _ :: _ -> let val_ids = List.map @@ -1210,9 +1393,10 @@ and transl_match ~scopes e arg pat_expr_list partial = argl in let lvars = List.map (fun (id, _) -> Lvar id) val_ids in + let mode = transl_value_mode arg.exp_mode in static_catch (transl_list ~scopes argl) val_ids (Matching.for_multiple_match ~scopes e.exp_loc - lvars Alloc_heap val_cases partial) + lvars mode val_cases partial) | arg, [] -> assert (static_handlers = []); Matching.for_function ~scopes e.exp_loc @@ -1236,7 +1420,7 @@ and transl_letop ~scopes loc env let_ ands param case partial = let right_id = Ident.create_local "right" in let op = transl_ident (of_location ~scopes and_.bop_op_name.loc) env - and_.bop_op_type and_.bop_op_path and_.bop_op_val + and_.bop_op_type and_.bop_op_path and_.bop_op_val Id_value in let exp = transl_exp ~scopes and_.bop_exp in let lam = @@ -1257,19 +1441,20 @@ and transl_letop ~scopes loc env let_ ands param case partial = in let op = transl_ident (of_location ~scopes let_.bop_op_name.loc) env - let_.bop_op_type let_.bop_op_path let_.bop_op_val + let_.bop_op_type let_.bop_op_path let_.bop_op_val Id_value in let exp = loop (transl_exp ~scopes let_.bop_exp) ands in let func = let return_kind = value_kind case.c_rhs.exp_env case.c_rhs.exp_type in - let (kind, params, return), body = + let (kind, params, return, _region), body = event_function ~scopes case.c_rhs (function repr -> transl_curried_function ~scopes case.c_rhs.exp_loc return_kind - repr partial param [case]) + repr ~mode:Alloc_heap ~region:true partial param [case]) in let attr = default_function_attribute in let loc = of_location ~scopes case.c_rhs.exp_loc in + let body = maybe_region body in Lfunction{kind; params; return; body; attr; loc; mode=Alloc_heap; region=true} in @@ -1285,18 +1470,22 @@ and transl_letop ~scopes loc env let_ ands param case partial = ap_probe=None; } -(* Wrapper for class compilation *) +(* Wrapper for class/module compilation, + that can only return global values *) -(* -let transl_exp = transl_exp_wrap - -let transl_let rec_flag pat_expr_list body = - match pat_expr_list with - [] -> body - | (_, expr) :: _ -> - Translobj.oo_wrap expr.exp_env false - (transl_let rec_flag pat_expr_list) body -*) +let transl_exp ~scopes exp = + maybe_region (transl_exp ~scopes exp) + +let transl_let ~scopes ?in_structure rec_flag pat_expr_list = + transl_let ~scopes ~add_regions:true ?in_structure rec_flag pat_expr_list + +let transl_scoped_exp ~scopes exp = + maybe_region (transl_scoped_exp ~scopes exp) + +let transl_apply + ~scopes ?tailcall ?inlined ?specialised ?position ?mode fn args loc = + maybe_region (transl_apply + ~scopes ?tailcall ?inlined ?specialised ?position ?mode fn args loc) (* Error report *) diff --git a/lambda/translcore.mli b/lambda/translcore.mli index c27fd04036b..2cd9847f64b 100644 --- a/lambda/translcore.mli +++ b/lambda/translcore.mli @@ -23,15 +23,19 @@ open Debuginfo.Scoped_location val pure_module : module_expr -> let_kind +(* Used for translating Alloc_heap values in classes and modules *) val transl_exp: scopes:scopes -> expression -> lambda val transl_apply: scopes:scopes -> ?tailcall:tailcall_attribute -> ?inlined:inlined_attribute -> ?specialised:specialise_attribute - -> lambda -> (arg_label * expression option) list + -> ?position:region_close + -> ?mode:alloc_mode + -> lambda + -> (arg_label * apply_arg) list -> scoped_location -> lambda -val transl_let: scopes:scopes -> ?in_structure:bool -> rec_flag - -> value_binding list -> lambda -> lambda +val transl_let: scopes:scopes -> ?in_structure:bool + -> rec_flag -> value_binding list -> lambda -> lambda val transl_extension_constructor: scopes:scopes -> Env.t -> Path.t option -> @@ -39,6 +43,8 @@ val transl_extension_constructor: scopes:scopes -> val transl_scoped_exp : scopes:scopes -> expression -> lambda +val transl_alloc_mode : Types.alloc_mode -> Lambda.alloc_mode + type error = Free_super_var | Unreachable_reached diff --git a/lambda/translmod.ml b/lambda/translmod.ml index cb78911a5c3..9e870992002 100644 --- a/lambda/translmod.ml +++ b/lambda/translmod.ml @@ -96,8 +96,8 @@ let rec apply_coercion loc strict restr arg = let param = Ident.create_local "funarg" in let carg = apply_coercion loc Alias cc_arg (Lvar param) in apply_coercion_result loc strict arg [param, Pgenval] [carg] cc_res - | Tcoerce_primitive { pc_loc = _; pc_desc; pc_env; pc_type } -> - let poly_mode = Lambda.Alloc_heap in + | Tcoerce_primitive { pc_loc = _; pc_desc; pc_env; pc_type; pc_poly_mode } -> + let poly_mode = Translcore.transl_alloc_mode pc_poly_mode in Translprim.transl_primitive loc pc_desc pc_env pc_type ~poly_mode None | Tcoerce_alias (env, path, cc) -> let lam = transl_module_path loc env path in @@ -614,7 +614,7 @@ and transl_structure ~scopes loc fields cc rootpath final_env = function Translprim.transl_primitive (of_location ~scopes p.pc_loc) p.pc_desc p.pc_env p.pc_type - ~poly_mode:Lambda.Alloc_heap + ~poly_mode:(Translcore.transl_alloc_mode p.pc_poly_mode) None | _ -> apply_coercion loc Strict cc (get_field pos)) pos_cc_list, loc) @@ -1035,8 +1035,8 @@ let field_of_str loc str = let ids = Array.of_list (defined_idents str.str_items) in fun (pos, cc) -> match cc with - | Tcoerce_primitive { pc_loc = _; pc_desc; pc_env; pc_type } -> - let poly_mode = Lambda.Alloc_heap in + | Tcoerce_primitive { pc_loc = _; pc_desc; pc_env; pc_type; pc_poly_mode } -> + let poly_mode = Translcore.transl_alloc_mode pc_poly_mode in Translprim.transl_primitive loc pc_desc pc_env pc_type ~poly_mode None | Tcoerce_alias (env, path, cc) -> let lam = transl_module_path loc env path in @@ -1367,7 +1367,7 @@ let transl_store_structure ~scopes glob map prims aliases str = List.fold_right (add_ident may_coerce) idlist subst and store_primitive (pos, prim) cont = - let poly_mode = Lambda.Alloc_heap in + let poly_mode = Translcore.transl_alloc_mode prim.pc_poly_mode in Lsequence(Lprim(mod_setfield pos, [Lprim(Pgetglobal glob, [], Loc_unknown); Translprim.transl_primitive Loc_unknown diff --git a/middle_end/clambda.ml b/middle_end/clambda.ml index c8ea80fd2d4..71530ad3e2a 100644 --- a/middle_end/clambda.ml +++ b/middle_end/clambda.ml @@ -20,6 +20,8 @@ open Asttypes open Lambda type function_label = string +type arity = Lambda.function_kind * int +type apply_kind = Lambda.region_close * Lambda.alloc_mode type ustructured_constant = | Uconst_float of float @@ -46,8 +48,10 @@ and uphantom_defining_expr = and ulambda = Uvar of Backend_var.t | Uconst of uconstant - | Udirect_apply of function_label * ulambda list * Lambda.probe * Debuginfo.t - | Ugeneric_apply of ulambda * ulambda list * Debuginfo.t + | Udirect_apply of + function_label * ulambda list * Lambda.probe * apply_kind * Debuginfo.t + | Ugeneric_apply of + ulambda * ulambda list * apply_kind * Debuginfo.t | Uclosure of ufunction list * ulambda list | Uoffset of ulambda * int | Ulet of mutable_flag * value_kind * Backend_var.With_provenance.t @@ -71,17 +75,22 @@ and ulambda = | Ufor of Backend_var.With_provenance.t * ulambda * ulambda * direction_flag * ulambda | Uassign of Backend_var.t * ulambda - | Usend of meth_kind * ulambda * ulambda * ulambda list * Debuginfo.t + | Usend of + meth_kind * ulambda * ulambda * ulambda list + * apply_kind * Debuginfo.t | Uunreachable + | Uregion of ulambda + | Utail of ulambda and ufunction = { label : function_label; - arity : int; + arity : arity; params : (Backend_var.With_provenance.t * value_kind) list; return : value_kind; body : ulambda; dbg : Debuginfo.t; env : Backend_var.t option; + mode : Lambda.alloc_mode; } and ulambda_switch = @@ -94,17 +103,19 @@ and ulambda_switch = type function_description = { fun_label: function_label; (* Label of direct entry point *) - fun_arity: int; (* Number of arguments *) + fun_arity: arity; (* Number of (curried/tupled) arguments *) mutable fun_closed: bool; (* True if environment not used *) mutable fun_inline: (Backend_var.With_provenance.t list * ulambda) option; - mutable fun_float_const_prop: bool (* Can propagate FP consts *) + mutable fun_float_const_prop: bool; (* Can propagate FP consts *) + fun_region: bool; (* If false, may locally allocate + in caller's region *) } (* Approximation of values *) type value_approximation = - Value_closure of function_description * value_approximation - | Value_tuple of value_approximation array + Value_closure of alloc_mode * function_description * value_approximation + | Value_tuple of alloc_mode * value_approximation array | Value_unknown | Value_const of uconstant | Value_global_field of string * int diff --git a/middle_end/clambda.mli b/middle_end/clambda.mli index f4fad913706..de1c31d04df 100644 --- a/middle_end/clambda.mli +++ b/middle_end/clambda.mli @@ -20,6 +20,8 @@ open Asttypes open Lambda type function_label = string +type arity = Lambda.function_kind * int +type apply_kind = Lambda.region_close * Lambda.alloc_mode type ustructured_constant = | Uconst_float of float @@ -57,8 +59,10 @@ and uphantom_defining_expr = and ulambda = Uvar of Backend_var.t | Uconst of uconstant - | Udirect_apply of function_label * ulambda list * Lambda.probe * Debuginfo.t - | Ugeneric_apply of ulambda * ulambda list * Debuginfo.t + | Udirect_apply of + function_label * ulambda list * Lambda.probe * apply_kind * Debuginfo.t + | Ugeneric_apply of + ulambda * ulambda list * apply_kind * Debuginfo.t | Uclosure of ufunction list * ulambda list | Uoffset of ulambda * int | Ulet of mutable_flag * value_kind * Backend_var.With_provenance.t @@ -82,17 +86,22 @@ and ulambda = | Ufor of Backend_var.With_provenance.t * ulambda * ulambda * direction_flag * ulambda | Uassign of Backend_var.t * ulambda - | Usend of meth_kind * ulambda * ulambda * ulambda list * Debuginfo.t + | Usend of + meth_kind * ulambda * ulambda * ulambda list + * apply_kind * Debuginfo.t | Uunreachable + | Uregion of ulambda + | Utail of ulambda and ufunction = { label : function_label; - arity : int; + arity : arity; params : (Backend_var.With_provenance.t * value_kind) list; return : value_kind; body : ulambda; dbg : Debuginfo.t; env : Backend_var.t option; + mode : Lambda.alloc_mode; } and ulambda_switch = @@ -105,17 +114,19 @@ and ulambda_switch = type function_description = { fun_label: function_label; (* Label of direct entry point *) - fun_arity: int; (* Number of arguments *) + fun_arity: arity; (* Number of (curried/tupled) arguments *) mutable fun_closed: bool; (* True if environment not used *) mutable fun_inline: (Backend_var.With_provenance.t list * ulambda) option; - mutable fun_float_const_prop: bool (* Can propagate FP consts *) + mutable fun_float_const_prop: bool; (* Can propagate FP consts *) + fun_region: bool; (* If false, may locally allocate + in caller's region *) } (* Approximation of values *) type value_approximation = - Value_closure of function_description * value_approximation - | Value_tuple of value_approximation array + Value_closure of alloc_mode * function_description * value_approximation + | Value_tuple of alloc_mode * value_approximation array | Value_unknown | Value_const of uconstant | Value_global_field of string * int diff --git a/middle_end/clambda_primitives.ml b/middle_end/clambda_primitives.ml index 3f755795a07..f3b89ee931f 100644 --- a/middle_end/clambda_primitives.ml +++ b/middle_end/clambda_primitives.ml @@ -30,15 +30,17 @@ type memory_access_size = | Thirty_two | Sixty_four +type alloc_mode = Lambda.alloc_mode + type primitive = | Pread_symbol of string (* Operations on heap blocks *) - | Pmakeblock of int * mutable_flag * block_shape + | Pmakeblock of int * mutable_flag * block_shape * alloc_mode | Pfield of int | Pfield_computed | Psetfield of int * immediate_or_pointer * initialization_or_assignment | Psetfield_computed of immediate_or_pointer * initialization_or_assignment - | Pfloatfield of int + | Pfloatfield of int * alloc_mode | Psetfloatfield of int * initialization_or_assignment | Pduprecord of Types.record_representation * int (* External call *) @@ -57,15 +59,16 @@ type primitive = | Poffsetint of int | Poffsetref of int (* Float operations *) - | Pintoffloat | Pfloatofint - | Pnegfloat | Pabsfloat - | Paddfloat | Psubfloat | Pmulfloat | Pdivfloat + | Pintoffloat | Pfloatofint of alloc_mode + | Pnegfloat of alloc_mode | Pabsfloat of alloc_mode + | Paddfloat of alloc_mode | Psubfloat of alloc_mode + | Pmulfloat of alloc_mode | Pdivfloat of alloc_mode | Pfloatcomp of float_comparison (* String operations *) | Pstringlength | Pstringrefu | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets (* Array operations *) - | Pmakearray of array_kind * mutable_flag + | Pmakearray of array_kind * mutable_flag * alloc_mode | Pduparray of array_kind * mutable_flag (** For [Pduparray], the argument must be an immutable array. The arguments of [Pduparray] give the kind and mutability of the @@ -80,21 +83,22 @@ type primitive = (* Test if the (integer) argument is outside an interval *) | Pisout (* Operations on boxed integers (Nativeint.t, Int32.t, Int64.t) *) - | Pbintofint of boxed_integer + | Pbintofint of boxed_integer * alloc_mode | Pintofbint of boxed_integer | Pcvtbint of boxed_integer (*source*) * boxed_integer (*destination*) - | Pnegbint of boxed_integer - | Paddbint of boxed_integer - | Psubbint of boxed_integer - | Pmulbint of boxed_integer - | Pdivbint of { size : boxed_integer; is_safe : is_safe } - | Pmodbint of { size : boxed_integer; is_safe : is_safe } - | Pandbint of boxed_integer - | Porbint of boxed_integer - | Pxorbint of boxed_integer - | Plslbint of boxed_integer - | Plsrbint of boxed_integer - | Pasrbint of boxed_integer + * alloc_mode + | Pnegbint of boxed_integer * alloc_mode + | Paddbint of boxed_integer * alloc_mode + | Psubbint of boxed_integer * alloc_mode + | Pmulbint of boxed_integer * alloc_mode + | Pdivbint of { size : boxed_integer; is_safe : is_safe; mode: alloc_mode } + | Pmodbint of { size : boxed_integer; is_safe : is_safe; mode: alloc_mode } + | Pandbint of boxed_integer * alloc_mode + | Porbint of boxed_integer * alloc_mode + | Pxorbint of boxed_integer * alloc_mode + | Plslbint of boxed_integer * alloc_mode + | Plsrbint of boxed_integer * alloc_mode + | Pasrbint of boxed_integer * alloc_mode | Pbintcomp of boxed_integer * integer_comparison (* Operations on big arrays: (unsafe, #dimensions, kind, layout) *) | Pbigarrayref of bool * int * bigarray_kind * bigarray_layout @@ -102,16 +106,16 @@ type primitive = (* size of the nth dimension of a big array *) | Pbigarraydim of int (* load/set 16,32,64 bits from a string: (unsafe)*) - | Pstring_load of (memory_access_size * is_safe) - | Pbytes_load of (memory_access_size * is_safe) + | Pstring_load of (memory_access_size * is_safe * alloc_mode) + | Pbytes_load of (memory_access_size * is_safe * alloc_mode) | Pbytes_set of (memory_access_size * is_safe) (* load/set 16,32,64 bits from a (char, int8_unsigned_elt, c_layout) Bigarray.Array1.t : (unsafe) *) - | Pbigstring_load of (memory_access_size * is_safe) + | Pbigstring_load of (memory_access_size * is_safe * alloc_mode) | Pbigstring_set of (memory_access_size * is_safe) (* byte swap *) | Pbswap16 - | Pbbswap of boxed_integer + | Pbbswap of boxed_integer * alloc_mode (* Integer to external pointer *) | Pint_as_pointer (* Inhibition of optimisation *) diff --git a/middle_end/clambda_primitives.mli b/middle_end/clambda_primitives.mli index 83234897187..eeddf1531be 100644 --- a/middle_end/clambda_primitives.mli +++ b/middle_end/clambda_primitives.mli @@ -30,15 +30,17 @@ type memory_access_size = | Thirty_two | Sixty_four +type alloc_mode = Lambda.alloc_mode + type primitive = | Pread_symbol of string (* Operations on heap blocks *) - | Pmakeblock of int * mutable_flag * block_shape + | Pmakeblock of int * mutable_flag * block_shape * alloc_mode | Pfield of int | Pfield_computed | Psetfield of int * immediate_or_pointer * initialization_or_assignment | Psetfield_computed of immediate_or_pointer * initialization_or_assignment - | Pfloatfield of int + | Pfloatfield of int * alloc_mode | Psetfloatfield of int * initialization_or_assignment | Pduprecord of Types.record_representation * int (* External call *) @@ -57,15 +59,16 @@ type primitive = | Poffsetint of int | Poffsetref of int (* Float operations *) - | Pintoffloat | Pfloatofint - | Pnegfloat | Pabsfloat - | Paddfloat | Psubfloat | Pmulfloat | Pdivfloat + | Pintoffloat | Pfloatofint of alloc_mode + | Pnegfloat of alloc_mode | Pabsfloat of alloc_mode + | Paddfloat of alloc_mode | Psubfloat of alloc_mode + | Pmulfloat of alloc_mode | Pdivfloat of alloc_mode | Pfloatcomp of float_comparison (* String operations *) | Pstringlength | Pstringrefu | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytessetu | Pbytesrefs | Pbytessets (* Array operations *) - | Pmakearray of array_kind * mutable_flag + | Pmakearray of array_kind * mutable_flag * alloc_mode (** For [Pmakearray], the list of arguments must not be empty. The empty array should be represented by a distinguished constant in the middle end. *) @@ -83,21 +86,22 @@ type primitive = (* Test if the (integer) argument is outside an interval *) | Pisout (* Operations on boxed integers (Nativeint.t, Int32.t, Int64.t) *) - | Pbintofint of boxed_integer + | Pbintofint of boxed_integer * alloc_mode | Pintofbint of boxed_integer | Pcvtbint of boxed_integer (*source*) * boxed_integer (*destination*) - | Pnegbint of boxed_integer - | Paddbint of boxed_integer - | Psubbint of boxed_integer - | Pmulbint of boxed_integer - | Pdivbint of { size : boxed_integer; is_safe : is_safe } - | Pmodbint of { size : boxed_integer; is_safe : is_safe } - | Pandbint of boxed_integer - | Porbint of boxed_integer - | Pxorbint of boxed_integer - | Plslbint of boxed_integer - | Plsrbint of boxed_integer - | Pasrbint of boxed_integer + * alloc_mode + | Pnegbint of boxed_integer * alloc_mode + | Paddbint of boxed_integer * alloc_mode + | Psubbint of boxed_integer * alloc_mode + | Pmulbint of boxed_integer * alloc_mode + | Pdivbint of { size : boxed_integer; is_safe : is_safe; mode: alloc_mode } + | Pmodbint of { size : boxed_integer; is_safe : is_safe; mode: alloc_mode } + | Pandbint of boxed_integer * alloc_mode + | Porbint of boxed_integer * alloc_mode + | Pxorbint of boxed_integer * alloc_mode + | Plslbint of boxed_integer * alloc_mode + | Plsrbint of boxed_integer * alloc_mode + | Pasrbint of boxed_integer * alloc_mode | Pbintcomp of boxed_integer * integer_comparison (* Operations on big arrays: (unsafe, #dimensions, kind, layout) *) | Pbigarrayref of bool * int * bigarray_kind * bigarray_layout @@ -105,16 +109,16 @@ type primitive = (* size of the nth dimension of a big array *) | Pbigarraydim of int (* load/set 16,32,64 bits from a string: (unsafe)*) - | Pstring_load of (memory_access_size * is_safe) - | Pbytes_load of (memory_access_size * is_safe) + | Pstring_load of (memory_access_size * is_safe * alloc_mode) + | Pbytes_load of (memory_access_size * is_safe * alloc_mode) | Pbytes_set of (memory_access_size * is_safe) (* load/set 16,32,64 bits from a (char, int8_unsigned_elt, c_layout) Bigarray.Array1.t : (unsafe) *) - | Pbigstring_load of (memory_access_size * is_safe) + | Pbigstring_load of (memory_access_size * is_safe * alloc_mode) | Pbigstring_set of (memory_access_size * is_safe) (* byte swap *) | Pbswap16 - | Pbbswap of boxed_integer + | Pbbswap of boxed_integer * alloc_mode (* Integer to external pointer *) | Pint_as_pointer (* Inhibition of optimisation *) diff --git a/middle_end/closure/closure.ml b/middle_end/closure/closure.ml index 00d4213a516..391bd3a3378 100644 --- a/middle_end/closure/closure.ml +++ b/middle_end/closure/closure.ml @@ -65,14 +65,33 @@ let rec build_closure_env env_param pos = function let getglobal dbg id = Uprim(P.Pread_symbol (Compilenv.symbol_for_global id), [], dbg) +let region ulam = + let is_trivial = + match ulam with + | Uvar _ | Uconst _ -> true + | _ -> false + in + if is_trivial then ulam + else Uregion ulam + +let tail ulam = + let is_trivial = + match ulam with + | Uvar _ | Uconst _ -> true + | _ -> false + in + if is_trivial then ulam + else Utail ulam + (* Check if a variable occurs in a [clambda] term. *) let occurs_var var u = let rec occurs = function Uvar v -> v = var | Uconst _ -> false - | Udirect_apply(_lbl, args, _, _) -> List.exists occurs args - | Ugeneric_apply(funct, args, _) -> occurs funct || List.exists occurs args + | Udirect_apply(_lbl, args, _, _, _) -> List.exists occurs args + | Ugeneric_apply(funct, args, _, _) -> + occurs funct || List.exists occurs args | Uclosure(_fundecls, clos) -> List.exists occurs clos | Uoffset(u, _ofs) -> occurs u | Ulet(_str, _kind, _id, def, body) -> occurs def || occurs body @@ -96,9 +115,11 @@ let occurs_var var u = | Uwhile(cond, body) -> occurs cond || occurs body | Ufor(_id, lo, hi, _dir, body) -> occurs lo || occurs hi || occurs body | Uassign(id, u) -> id = var || occurs u - | Usend(_, met, obj, args, _) -> + | Usend(_, met, obj, args, _, _) -> occurs met || occurs obj || List.exists occurs args | Uunreachable -> false + | Uregion e -> occurs e + | Utail e -> occurs e and occurs_array a = try for i = 0 to Array.length a - 1 do @@ -155,13 +176,13 @@ let lambda_smaller lam threshold = match lam with Uvar _ -> () | Uconst _ -> incr size - | Udirect_apply(_, args, None, _) -> + | Udirect_apply(_, args, None, _, _) -> size := !size + 4; lambda_list_size args | Udirect_apply _ -> () (* We aim for probe points to not affect inlining decisions. Actual cost is either 1, 5 or 6 bytes, depending on their kind, on x86-64. *) - | Ugeneric_apply(fn, args, _) -> + | Ugeneric_apply(fn, args, _, _) -> size := !size + 6; lambda_size fn; lambda_list_size args | Uclosure _ -> raise Exit (* inlining would duplicate function definitions *) @@ -206,10 +227,15 @@ let lambda_smaller lam threshold = size := !size + 4; lambda_size low; lambda_size high; lambda_size body | Uassign(_id, lam) -> incr size; lambda_size lam - | Usend(_, met, obj, args, _) -> + | Usend(_, met, obj, args, _, _) -> size := !size + 8; lambda_size met; lambda_size obj; lambda_list_size args | Uunreachable -> () + | Uregion e -> + size := !size + 2; + lambda_size e + | Utail e -> + lambda_size e and lambda_list_size l = List.iter lambda_size l and lambda_array_size a = Array.iter lambda_size a in try @@ -224,7 +250,8 @@ let is_pure_prim p = | Arbitrary_effects, _ -> false (* Check if a clambda term is ``pure'', - that is without side-effects *and* not containing function definitions *) + that is without side-effects *and* not containing function definitions + (Pure terms may still read mutable state) *) let rec is_pure = function Uvar _ -> true @@ -233,6 +260,8 @@ let rec is_pure = function | Uoffset(arg, _) -> is_pure arg | Ulet(Immutable, _, _var, def, body) -> is_pure def && is_pure body + | Uregion body -> is_pure body + | Utail body -> is_pure body | _ -> false (* Simplify primitive operations on known arguments *) @@ -288,10 +317,10 @@ let simplif_arith_prim_pure ~backend fpc p (args, approxs) dbg = | Pnot -> make_const_bool (n1 = 0) | Pnegint -> make_const_int (- n1) | Poffsetint n -> make_const_int (n + n1) - | Pfloatofint when fpc -> make_const_float (float_of_int n1) - | Pbintofint Pnativeint -> make_const_natint (Nativeint.of_int n1) - | Pbintofint Pint32 -> make_const_int32 (Int32.of_int n1) - | Pbintofint Pint64 -> make_const_int64 (Int64.of_int n1) + | Pfloatofint _ when fpc -> make_const_float (float_of_int n1) + | Pbintofint (Pnativeint,_) -> make_const_natint (Nativeint.of_int n1) + | Pbintofint (Pint32,_) -> make_const_int32 (Int32.of_int n1) + | Pbintofint (Pint64,_) -> make_const_int64 (Int64.of_int n1) | Pbswap16 -> make_const_int (((n1 land 0xff) lsl 8) lor ((n1 land 0xff00) lsr 8)) | _ -> default @@ -323,18 +352,18 @@ let simplif_arith_prim_pure ~backend fpc p (args, approxs) dbg = | [Value_const(Uconst_ref(_, Some (Uconst_float n1)))] when fpc -> begin match p with | Pintoffloat -> make_const_int (int_of_float n1) - | Pnegfloat -> make_const_float (-. n1) - | Pabsfloat -> make_const_float (abs_float n1) + | Pnegfloat _ -> make_const_float (-. n1) + | Pabsfloat _ -> make_const_float (abs_float n1) | _ -> default end (* float, float *) | [Value_const(Uconst_ref(_, Some (Uconst_float n1))); Value_const(Uconst_ref(_, Some (Uconst_float n2)))] when fpc -> begin match p with - | Paddfloat -> make_const_float (n1 +. n2) - | Psubfloat -> make_const_float (n1 -. n2) - | Pmulfloat -> make_const_float (n1 *. n2) - | Pdivfloat -> make_const_float (n1 /. n2) + | Paddfloat _ -> make_const_float (n1 +. n2) + | Psubfloat _ -> make_const_float (n1 -. n2) + | Pmulfloat _ -> make_const_float (n1 *. n2) + | Pdivfloat _ -> make_const_float (n1 /. n2) | Pfloatcomp c -> make_float_comparison c n1 n2 | _ -> default end @@ -342,25 +371,25 @@ let simplif_arith_prim_pure ~backend fpc p (args, approxs) dbg = | [Value_const(Uconst_ref(_, Some (Uconst_nativeint n)))] -> begin match p with | Pintofbint Pnativeint -> make_const_int (Nativeint.to_int n) - | Pcvtbint(Pnativeint, Pint32) -> make_const_int32 (Nativeint.to_int32 n) - | Pcvtbint(Pnativeint, Pint64) -> make_const_int64 (Int64.of_nativeint n) - | Pnegbint Pnativeint -> make_const_natint (Nativeint.neg n) + | Pcvtbint(Pnativeint, Pint32, _) -> make_const_int32 (Nativeint.to_int32 n) + | Pcvtbint(Pnativeint, Pint64, _) -> make_const_int64 (Int64.of_nativeint n) + | Pnegbint (Pnativeint,_) -> make_const_natint (Nativeint.neg n) | _ -> default end (* nativeint, nativeint *) | [Value_const(Uconst_ref(_, Some (Uconst_nativeint n1))); Value_const(Uconst_ref(_, Some (Uconst_nativeint n2)))] -> begin match p with - | Paddbint Pnativeint -> make_const_natint (Nativeint.add n1 n2) - | Psubbint Pnativeint -> make_const_natint (Nativeint.sub n1 n2) - | Pmulbint Pnativeint -> make_const_natint (Nativeint.mul n1 n2) + | Paddbint (Pnativeint,_) -> make_const_natint (Nativeint.add n1 n2) + | Psubbint (Pnativeint,_) -> make_const_natint (Nativeint.sub n1 n2) + | Pmulbint (Pnativeint,_) -> make_const_natint (Nativeint.mul n1 n2) | Pdivbint {size=Pnativeint} when n2 <> 0n -> make_const_natint (Nativeint.div n1 n2) | Pmodbint {size=Pnativeint} when n2 <> 0n -> make_const_natint (Nativeint.rem n1 n2) - | Pandbint Pnativeint -> make_const_natint (Nativeint.logand n1 n2) - | Porbint Pnativeint -> make_const_natint (Nativeint.logor n1 n2) - | Pxorbint Pnativeint -> make_const_natint (Nativeint.logxor n1 n2) + | Pandbint (Pnativeint,_) -> make_const_natint (Nativeint.logand n1 n2) + | Porbint (Pnativeint,_) -> make_const_natint (Nativeint.logor n1 n2) + | Pxorbint (Pnativeint,_) -> make_const_natint (Nativeint.logxor n1 n2) | Pbintcomp(Pnativeint, c) -> make_integer_comparison c n1 n2 | _ -> default end @@ -368,11 +397,11 @@ let simplif_arith_prim_pure ~backend fpc p (args, approxs) dbg = | [Value_const(Uconst_ref(_, Some (Uconst_nativeint n1))); Value_const(Uconst_int n2)] -> begin match p with - | Plslbint Pnativeint when 0 <= n2 && n2 < 8 * B.size_int -> + | Plslbint (Pnativeint,_) when 0 <= n2 && n2 < 8 * B.size_int -> make_const_natint (Nativeint.shift_left n1 n2) - | Plsrbint Pnativeint when 0 <= n2 && n2 < 8 * B.size_int -> + | Plsrbint (Pnativeint,_) when 0 <= n2 && n2 < 8 * B.size_int -> make_const_natint (Nativeint.shift_right_logical n1 n2) - | Pasrbint Pnativeint when 0 <= n2 && n2 < 8 * B.size_int -> + | Pasrbint (Pnativeint,_) when 0 <= n2 && n2 < 8 * B.size_int -> make_const_natint (Nativeint.shift_right n1 n2) | _ -> default end @@ -380,25 +409,25 @@ let simplif_arith_prim_pure ~backend fpc p (args, approxs) dbg = | [Value_const(Uconst_ref(_, Some (Uconst_int32 n)))] -> begin match p with | Pintofbint Pint32 -> make_const_int (Int32.to_int n) - | Pcvtbint(Pint32, Pnativeint) -> make_const_natint (Nativeint.of_int32 n) - | Pcvtbint(Pint32, Pint64) -> make_const_int64 (Int64.of_int32 n) - | Pnegbint Pint32 -> make_const_int32 (Int32.neg n) + | Pcvtbint(Pint32, Pnativeint,_) -> make_const_natint (Nativeint.of_int32 n) + | Pcvtbint(Pint32, Pint64,_) -> make_const_int64 (Int64.of_int32 n) + | Pnegbint(Pint32,_) -> make_const_int32 (Int32.neg n) | _ -> default end (* int32, int32 *) | [Value_const(Uconst_ref(_, Some (Uconst_int32 n1))); Value_const(Uconst_ref(_, Some (Uconst_int32 n2)))] -> begin match p with - | Paddbint Pint32 -> make_const_int32 (Int32.add n1 n2) - | Psubbint Pint32 -> make_const_int32 (Int32.sub n1 n2) - | Pmulbint Pint32 -> make_const_int32 (Int32.mul n1 n2) + | Paddbint(Pint32,_) -> make_const_int32 (Int32.add n1 n2) + | Psubbint(Pint32,_) -> make_const_int32 (Int32.sub n1 n2) + | Pmulbint(Pint32,_) -> make_const_int32 (Int32.mul n1 n2) | Pdivbint {size=Pint32} when n2 <> 0l -> make_const_int32 (Int32.div n1 n2) | Pmodbint {size=Pint32} when n2 <> 0l -> make_const_int32 (Int32.rem n1 n2) - | Pandbint Pint32 -> make_const_int32 (Int32.logand n1 n2) - | Porbint Pint32 -> make_const_int32 (Int32.logor n1 n2) - | Pxorbint Pint32 -> make_const_int32 (Int32.logxor n1 n2) + | Pandbint(Pint32,_) -> make_const_int32 (Int32.logand n1 n2) + | Porbint(Pint32,_) -> make_const_int32 (Int32.logor n1 n2) + | Pxorbint(Pint32,_) -> make_const_int32 (Int32.logxor n1 n2) | Pbintcomp(Pint32, c) -> make_integer_comparison c n1 n2 | _ -> default end @@ -406,11 +435,11 @@ let simplif_arith_prim_pure ~backend fpc p (args, approxs) dbg = | [Value_const(Uconst_ref(_, Some (Uconst_int32 n1))); Value_const(Uconst_int n2)] -> begin match p with - | Plslbint Pint32 when 0 <= n2 && n2 < 32 -> + | Plslbint(Pint32,_) when 0 <= n2 && n2 < 32 -> make_const_int32 (Int32.shift_left n1 n2) - | Plsrbint Pint32 when 0 <= n2 && n2 < 32 -> + | Plsrbint(Pint32,_) when 0 <= n2 && n2 < 32 -> make_const_int32 (Int32.shift_right_logical n1 n2) - | Pasrbint Pint32 when 0 <= n2 && n2 < 32 -> + | Pasrbint(Pint32,_) when 0 <= n2 && n2 < 32 -> make_const_int32 (Int32.shift_right n1 n2) | _ -> default end @@ -418,25 +447,25 @@ let simplif_arith_prim_pure ~backend fpc p (args, approxs) dbg = | [Value_const(Uconst_ref(_, Some (Uconst_int64 n)))] -> begin match p with | Pintofbint Pint64 -> make_const_int (Int64.to_int n) - | Pcvtbint(Pint64, Pint32) -> make_const_int32 (Int64.to_int32 n) - | Pcvtbint(Pint64, Pnativeint) -> make_const_natint (Int64.to_nativeint n) - | Pnegbint Pint64 -> make_const_int64 (Int64.neg n) + | Pcvtbint(Pint64, Pint32,_) -> make_const_int32 (Int64.to_int32 n) + | Pcvtbint(Pint64, Pnativeint,_) -> make_const_natint (Int64.to_nativeint n) + | Pnegbint(Pint64,_) -> make_const_int64 (Int64.neg n) | _ -> default end (* int64, int64 *) | [Value_const(Uconst_ref(_, Some (Uconst_int64 n1))); Value_const(Uconst_ref(_, Some (Uconst_int64 n2)))] -> begin match p with - | Paddbint Pint64 -> make_const_int64 (Int64.add n1 n2) - | Psubbint Pint64 -> make_const_int64 (Int64.sub n1 n2) - | Pmulbint Pint64 -> make_const_int64 (Int64.mul n1 n2) + | Paddbint(Pint64,_) -> make_const_int64 (Int64.add n1 n2) + | Psubbint(Pint64,_) -> make_const_int64 (Int64.sub n1 n2) + | Pmulbint(Pint64,_) -> make_const_int64 (Int64.mul n1 n2) | Pdivbint {size=Pint64} when n2 <> 0L -> make_const_int64 (Int64.div n1 n2) | Pmodbint {size=Pint64} when n2 <> 0L -> make_const_int64 (Int64.rem n1 n2) - | Pandbint Pint64 -> make_const_int64 (Int64.logand n1 n2) - | Porbint Pint64 -> make_const_int64 (Int64.logor n1 n2) - | Pxorbint Pint64 -> make_const_int64 (Int64.logxor n1 n2) + | Pandbint(Pint64,_) -> make_const_int64 (Int64.logand n1 n2) + | Porbint(Pint64,_) -> make_const_int64 (Int64.logor n1 n2) + | Pxorbint(Pint64,_) -> make_const_int64 (Int64.logxor n1 n2) | Pbintcomp(Pint64, c) -> make_integer_comparison c n1 n2 | _ -> default end @@ -444,11 +473,11 @@ let simplif_arith_prim_pure ~backend fpc p (args, approxs) dbg = | [Value_const(Uconst_ref(_, Some (Uconst_int64 n1))); Value_const(Uconst_int n2)] -> begin match p with - | Plslbint Pint64 when 0 <= n2 && n2 < 64 -> + | Plslbint(Pint64,_) when 0 <= n2 && n2 < 64 -> make_const_int64 (Int64.shift_left n1 n2) - | Plsrbint Pint64 when 0 <= n2 && n2 < 64 -> + | Plsrbint(Pint64,_) when 0 <= n2 && n2 < 64 -> make_const_int64 (Int64.shift_right_logical n1 n2) - | Pasrbint Pint64 when 0 <= n2 && n2 < 64 -> + | Pasrbint(Pint64,_) when 0 <= n2 && n2 < 64 -> make_const_int64 (Int64.shift_right n1 n2) | _ -> default end @@ -458,7 +487,7 @@ let simplif_arith_prim_pure ~backend fpc p (args, approxs) dbg = default let field_approx n = function - | Value_tuple a when n < Array.length a -> a.(n) + | Value_tuple (_,a) when n < Array.length a -> a.(n) | Value_const (Uconst_ref(_, Some (Uconst_block(_, l)))) when n < List.length l -> Value_const (List.nth l n) @@ -468,7 +497,7 @@ let simplif_prim_pure ~backend fpc p (args, approxs) dbg = let open Clambda_primitives in match p, args, approxs with (* Block construction *) - | Pmakeblock(tag, Immutable, _kind), _, _ -> + | Pmakeblock(tag, Immutable, _kind, mode), _, _ -> let field = function | Value_const c -> c | _ -> raise Exit @@ -480,7 +509,7 @@ let simplif_prim_pure ~backend fpc p (args, approxs) dbg = in make_const (Uconst_ref (name, Some cst)) with Exit -> - (Uprim(p, args, dbg), Value_tuple (Array.of_list approxs)) + (Uprim(p, args, dbg), Value_tuple (mode, Array.of_list approxs)) end (* Field access *) | Pfield n, _, [ Value_const(Uconst_ref(_, Some (Uconst_block(_, l)))) ] @@ -513,8 +542,8 @@ let simplif_prim ~backend fpc p (args, approxs as args_approxs) dbg = (* XXX : always return the same approxs as simplif_prim_pure? *) let approx = match p with - | P.Pmakeblock(_, Immutable, _kind) -> - Value_tuple (Array.of_list approxs) + | P.Pmakeblock(_, Immutable, _kind, mode) -> + Value_tuple (mode, Array.of_list approxs) | _ -> Value_unknown in @@ -554,13 +583,14 @@ let rec substitute loc ((backend, fpc) as st) sb rn ulam = Uvar v -> begin try V.Map.find v sb with Not_found -> ulam end | Uconst _ -> ulam - | Udirect_apply(lbl, args, probe, dbg) -> + | Udirect_apply(lbl, args, probe, kind, dbg) -> let dbg = subst_debuginfo loc dbg in - Udirect_apply(lbl, List.map (substitute loc st sb rn) args, probe, dbg) - | Ugeneric_apply(fn, args, dbg) -> + Udirect_apply(lbl, List.map (substitute loc st sb rn) args, + probe, kind, dbg) + | Ugeneric_apply(fn, args, kind, dbg) -> let dbg = subst_debuginfo loc dbg in Ugeneric_apply(substitute loc st sb rn fn, - List.map (substitute loc st sb rn) args, dbg) + List.map (substitute loc st sb rn) args, kind, dbg) | Uclosure(defs, env) -> (* Question: should we rename function labels as well? Otherwise, there is a risk that function labels are not globally unique. @@ -694,12 +724,16 @@ let rec substitute loc ((backend, fpc) as st) sb rn ulam = with Not_found -> id in Uassign(id', substitute loc st sb rn u) - | Usend(k, u1, u2, ul, dbg) -> + | Usend(k, u1, u2, ul, pos, dbg) -> let dbg = subst_debuginfo loc dbg in Usend(k, substitute loc st sb rn u1, substitute loc st sb rn u2, - List.map (substitute loc st sb rn) ul, dbg) + List.map (substitute loc st sb rn) ul, pos, dbg) | Uunreachable -> Uunreachable + | Uregion e -> + region (substitute loc st sb rn e) + | Utail e -> + tail (substitute loc st sb rn e) type env = { backend : (module Backend_intf.S); @@ -730,9 +764,10 @@ type env = { *) (* Approximates "no effects and no coeffects" *) -let is_substituable ~mutable_vars = function +let rec is_substituable ~mutable_vars = function | Uvar v -> not (V.Set.mem v mutable_vars) | Uconst _ -> true + | Uoffset(arg, _) -> is_substituable ~mutable_vars arg | _ -> false (* Approximates "only generative effects" *) @@ -740,7 +775,8 @@ let is_erasable = function | Uclosure _ -> true | u -> is_pure u -let bind_params { backend; mutable_vars; _ } loc fpc params args body = +let bind_params { backend; mutable_vars; _ } loc fdesc params args funct body = + let fpc = fdesc.fun_float_const_prop in let rec aux subst pl al body = match (pl, al) with ([], []) -> substitute (Debuginfo.from_location loc) (backend, fpc) @@ -752,8 +788,9 @@ let bind_params { backend; mutable_vars; _ } loc fpc params args body = let p1' = VP.rename p1 in let u1, u2 = match VP.name p1, a1 with - | "*opt*", Uprim(P.Pmakeblock(0, Immutable, kind), [a], dbg) -> - a, Uprim(P.Pmakeblock(0, Immutable, kind), + | "*opt*", Uprim(P.Pmakeblock(0, Immutable, kind, mode), + [a], dbg) -> + a, Uprim(P.Pmakeblock(0, Immutable, kind, mode), [Uvar (VP.var p1')], dbg) | _ -> a1, Uvar (VP.var p1') @@ -768,7 +805,16 @@ let bind_params { backend; mutable_vars; _ } loc fpc params args body = in (* Reverse parameters and arguments to preserve right-to-left evaluation order (PR#2910). *) - aux V.Map.empty (List.rev params) (List.rev args) body + let params, args = List.rev params, List.rev args in + let params, args, body = + (* Ensure funct is evaluated after args *) + match params with + | my_closure :: params when not fdesc.fun_closed -> + (params @ [my_closure]), (args @ [funct]), body + | _ -> + params, args, (if is_pure funct then body else Usequence (funct, body)) + in + aux V.Map.empty params args body (* Check if a lambda term is ``pure'', that is without side-effects *and* not containing function definitions *) @@ -786,37 +832,58 @@ let fail_if_probe ~probe msg = (* Generate a direct application *) -let direct_apply env fundesc ufunct uargs ~probe ~loc ~attribute = - let app_args = - if fundesc.fun_closed then uargs else uargs @ [ufunct] in - let app = - match fundesc.fun_inline, attribute with - | _, Never_inlined | None, _ -> - let dbg = Debuginfo.from_location loc in - warning_if_forced_inlined ~loc ~attribute - "Function information unavailable"; - if not fundesc.fun_closed then begin - fail_if_probe ~probe "Not closed" - end; - begin match probe, attribute with - | None, _ -> () - | Some _, Never_inlined -> () - | Some _, _ -> - fail_if_probe ~probe "Erroneously marked to be inlined" - end; - Udirect_apply(fundesc.fun_label, app_args, probe, dbg) - | Some(params, body), _ -> - bind_params env loc fundesc.fun_float_const_prop params app_args - body - in - (* If ufunct can contain side-effects or function definitions, - we must make sure that it is evaluated exactly once. - If the function is not closed, we evaluate ufunct as part of the - arguments. - If the function is closed, we force the evaluation of ufunct first. *) - if not fundesc.fun_closed || is_pure ufunct - then app - else Usequence(ufunct, app) +let direct_apply env fundesc ufunct uargs pos mode ~probe ~loc ~attribute = + match fundesc.fun_inline, attribute with + | _, Never_inlined + | None, _ -> + let dbg = Debuginfo.from_location loc in + let kind = (pos, mode) in + warning_if_forced_inlined ~loc ~attribute + "Function information unavailable"; + if not fundesc.fun_closed then begin + fail_if_probe ~probe "Not closed" + end; + begin match probe, attribute with + | None, _ -> () + | Some _, Never_inlined -> () + | Some _, _ -> + fail_if_probe ~probe "Erroneously marked to be inlined" + end; + if fundesc.fun_closed && is_pure ufunct then + Udirect_apply(fundesc.fun_label, uargs, probe, kind, dbg) + else if not fundesc.fun_closed && + is_substituable ~mutable_vars:env.mutable_vars ufunct then + Udirect_apply(fundesc.fun_label, uargs @ [ufunct], probe, kind, dbg) + else begin + let args = List.map (fun arg -> + if is_substituable ~mutable_vars:env.mutable_vars arg then + None, arg + else + let id = V.create_local "arg" in + Some (VP.create id, arg), Uvar id) uargs in + let app_args = List.map snd args in + List.fold_left (fun app (binding,_) -> + match binding with + | None -> app + | Some (v, e) -> Ulet(Immutable, Pgenval, v, e, app)) + (if fundesc.fun_closed then + Usequence (ufunct, + Udirect_apply (fundesc.fun_label, app_args, + probe, kind, dbg)) + else + let clos = V.create_local "clos" in + Ulet(Immutable, Pgenval, VP.create clos, ufunct, + Udirect_apply(fundesc.fun_label, app_args @ [Uvar clos], + probe, kind, dbg))) + args + end + | Some(params, body), _ -> + let body = + match pos with + | Rc_normal -> body + | Rc_close_at_apply -> tail body + in + bind_params env loc fundesc params uargs ufunct body (* Add [Value_integer] info to the approximation of an application *) @@ -922,28 +989,42 @@ let rec close ({ backend; fenv; cenv ; mutable_vars } as env) lam = (* We convert [f a] to [let a' = a in let f' = f in fun b c -> f' a' b c] when fun_arity > nargs *) - | Lapply{ap_func = funct; ap_args = args; ap_probe = probe; ap_loc = loc; - ap_inlined = attribute} -> + | Lapply{ap_func = funct; ap_args = args; ap_region_close=pos; ap_mode=mode; + ap_probe = probe; ap_loc = loc; + ap_inlined = attribute} -> let nargs = List.length args in + if nargs = 0 then + Misc.fatal_errorf "Closure: 0-ary application at %a" + Location.print_loc (Debuginfo.Scoped_location.to_location loc); + assert (nargs > 0); begin match (close env funct, close_list env args) with - ((ufunct, Value_closure(fundesc, approx_res)), + ((ufunct, Value_closure(_, + ({fun_arity=(Tupled, nparams)} as fundesc), + approx_res)), [Uprim(P.Pmakeblock _, uargs, _)]) - when List.length uargs = - fundesc.fun_arity -> + when List.length uargs = nparams -> let app = - direct_apply env ~loc ~attribute fundesc ufunct uargs ~probe in + direct_apply env ~loc ~attribute fundesc ufunct uargs + pos mode ~probe in (app, strengthen_approx app approx_res) - | ((ufunct, Value_closure(fundesc, approx_res)), uargs) - when nargs = fundesc.fun_arity -> + | ((ufunct, Value_closure(_, + ({fun_arity=(Curried _, nparams)} as fundesc), + approx_res)), uargs) + when nargs = nparams -> let app = - direct_apply env ~loc ~attribute fundesc ufunct uargs ~probe in + direct_apply env ~loc ~attribute fundesc ufunct uargs + pos mode ~probe in (app, strengthen_approx app approx_res) - | ((ufunct, (Value_closure(fundesc, _) as fapprox)), uargs) - when nargs < fundesc.fun_arity -> + | ((ufunct, (Value_closure( + clos_mode, + ({fun_arity=(Curried {nlocal}, nparams)} as fundesc), + _) as fapprox)), uargs) + when nargs < nparams -> let first_args = List.map (fun arg -> (V.create_local "arg", arg) ) uargs in let final_args = - Array.to_list (Array.init (fundesc.fun_arity - nargs) + Array.to_list (Array.init (nparams - nargs) (fun _ -> V.create_local "arg")) in let rec iter args body = match args with @@ -958,9 +1039,23 @@ let rec close ({ backend; fenv; cenv ; mutable_vars } as env) lam = in let funct_var = V.create_local "funct" in let fenv = V.Map.add funct_var fapprox fenv in + let new_clos_mode, kind = + (* If the closure has a local suffix, and we've supplied + enough args to hit it, then the closure must be local + (because the args or closure might be). *) + assert (nparams >= nlocal); + let heap_params = nparams - nlocal in + if nargs <= heap_params then + Alloc_heap, Curried {nlocal} + else + let supplied_local_args = nargs - heap_params in + Alloc_local, Curried {nlocal = nlocal - supplied_local_args} + in + if clos_mode = Alloc_local then assert (new_clos_mode = Alloc_local); + let ret_mode = if fundesc.fun_region then Alloc_heap else Alloc_local in let (new_fun, approx) = close { backend; fenv; cenv; mutable_vars } (Lfunction{ - kind = Curried {nlocal=0}; + kind; return = Pgenval; params = List.map (fun v -> v, Pgenval) final_args; body = Lapply{ @@ -968,15 +1063,15 @@ let rec close ({ backend; fenv; cenv ; mutable_vars } as env) lam = ap_func=(Lvar funct_var); ap_args=internal_args; ap_region_close=Rc_normal; - ap_mode=Alloc_heap; + ap_mode=ret_mode; ap_tailcall=Default_tailcall; ap_inlined=Default_inlined; ap_specialised=Default_specialise; ap_probe=None; }; loc; - mode = Alloc_heap; - region = true; + mode = new_clos_mode; + region = fundesc.fun_region; attr = default_function_attribute}) in let new_fun = @@ -987,19 +1082,33 @@ let rec close ({ backend; fenv; cenv ; mutable_vars } as env) lam = fail_if_probe ~probe "Partial application"; (new_fun, approx) - | ((ufunct, Value_closure(fundesc, _approx_res)), uargs) - when fundesc.fun_arity > 0 && nargs > fundesc.fun_arity -> + | ((ufunct, Value_closure(_, ({fun_arity = (Curried _, nparams)} as fundesc), + _approx_res)), uargs) + when nargs > nparams -> let args = List.map (fun arg -> V.create_local "arg", arg) uargs in - let (first_args, rem_args) = split_list fundesc.fun_arity args in + let (first_args, rem_args) = split_list nparams args in let first_args = List.map (fun (id, _) -> Uvar id) first_args in let rem_args = List.map (fun (id, _) -> Uvar id) rem_args in let dbg = Debuginfo.from_location loc in warning_if_forced_inlined ~loc ~attribute "Over-application"; fail_if_probe ~probe "Over-application"; + let mode' = if fundesc.fun_region then Alloc_heap else Alloc_local in let body = Ugeneric_apply(direct_apply env ~loc ~attribute - fundesc ufunct first_args ~probe, - rem_args, dbg) + fundesc ufunct first_args + Rc_normal mode' + ~probe, + rem_args, (Rc_normal, mode), dbg) + in + let body = + match mode, fundesc.fun_region with + | Alloc_heap, false -> region body + | _ -> body + in + let body = + match pos with + | Rc_normal -> body + | Rc_close_at_apply -> tail body in let result = List.fold_left (fun body (id, defining_expr) -> @@ -1012,13 +1121,13 @@ let rec close ({ backend; fenv; cenv ; mutable_vars } as env) lam = let dbg = Debuginfo.from_location loc in warning_if_forced_inlined ~loc ~attribute "Unknown function"; fail_if_probe ~probe "Unknown function"; - (Ugeneric_apply(ufunct, uargs, dbg), Value_unknown) + (Ugeneric_apply(ufunct, uargs, (pos, mode), dbg), Value_unknown) end - | Lsend(kind, met, obj, args, _, _, loc) -> + | Lsend(kind, met, obj, args, pos, mode, loc) -> let (umet, _) = close env met in let (uobj, _) = close env obj in let dbg = Debuginfo.from_location loc in - (Usend(kind, umet, uobj, close_list env args, dbg), + (Usend(kind, umet, uobj, close_list env args, (pos,mode), dbg), Value_unknown) | Llet(str, kind, id, lam, body) -> let (ulam, alam) = close_named env id lam in @@ -1226,9 +1335,9 @@ let rec close ({ backend; fenv; cenv ; mutable_vars } as env) lam = close env lam | Lifused _ -> assert false - | Lregion _ -> - assert false - + | Lregion lam -> + let ulam, approx = close env lam in + region ulam, approx and close_list env = function [] -> [] @@ -1281,32 +1390,36 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs = let uncurried_defs = List.map (function - (id, Lfunction{kind; params; return; body; loc}) -> + (id, Lfunction({kind; params; return; body; loc; mode; region} + as funct)) -> + Lambda.check_lfunction funct; let label = Compilenv.make_symbol (Some (V.unique_name id)) in let arity = List.length params in let fundesc = {fun_label = label; - fun_arity = (if kind = Tupled then -arity else arity); + fun_arity = (kind, arity); fun_closed = initially_closed; fun_inline = None; - fun_float_const_prop = !Clflags.float_const_prop } in + fun_float_const_prop = !Clflags.float_const_prop; + fun_region = region} in let dbg = Debuginfo.from_location loc in - (id, params, return, body, fundesc, dbg) + (id, params, return, body, mode, fundesc, dbg) | (_, _) -> fatal_error "Closure.close_functions") fun_defs in (* Build an approximate fenv for compiling the functions *) let fenv_rec = List.fold_right - (fun (id, _params, _return, _body, fundesc, _dbg) fenv -> - V.Map.add id (Value_closure(fundesc, Value_unknown)) fenv) + (fun (id, _params, _return, _body, mode, fundesc, _dbg) fenv -> + V.Map.add id (Value_closure(mode, fundesc, Value_unknown)) fenv) uncurried_defs fenv in (* Determine the offsets of each function's closure in the shared block *) let env_pos = ref (-1) in let clos_offsets = List.map - (fun (_id, _params, _return, _body, fundesc, _dbg) -> + (fun (_id, _params, _return, _body, _mode, fundesc, _dbg) -> let pos = !env_pos + 1 in - env_pos := !env_pos + 1 + (if fundesc.fun_arity <> 1 then 3 else 2); + env_pos := !env_pos + 1 + + (match fundesc.fun_arity with (Curried _, (0|1)) -> 2 | _ -> 3); pos) uncurried_defs in let fv_pos = !env_pos in @@ -1314,13 +1427,13 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs = does not use its environment parameter is invalidated. *) let useless_env = ref initially_closed in (* Translate each function definition *) - let clos_fundef (id, params, return, body, fundesc, dbg) env_pos = + let clos_fundef (id, params, return, body, mode, fundesc, dbg) env_pos = let env_param = V.create_local "env" in let cenv_fv = build_closure_env env_param (fv_pos - env_pos) fv in let cenv_body = List.fold_right2 - (fun (id, _params, _return, _body, _fundesc, _dbg) pos env -> + (fun (id, _params, _return, _body, _mode, _fundesc, _dbg) pos env -> V.Map.add id (Uoffset(Uvar env_param, pos - env_pos)) env) uncurried_defs clos_offsets cenv_fv in let (ubody, approx) = @@ -1341,6 +1454,7 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs = body = ubody; dbg; env = Some env_param; + mode; } in (* give more chance of function with default parameters (i.e. @@ -1367,7 +1481,7 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs = if lambda_smaller ubody threshold then fundesc.fun_inline <- Some(fun_params, ubody); - (f, (id, env_pos, Value_closure(fundesc, approx))) in + (f, (id, env_pos, Value_closure(mode, fundesc, approx))) in (* Translate all function definitions. *) let clos_info_list = if initially_closed then begin @@ -1379,7 +1493,7 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs = recompile *) Compilenv.backtrack snap; (* PR#6337 *) List.iter - (fun (_id, _params, _return, _body, fundesc, _dbg) -> + (fun (_id, _params, _return, _body, _mode, fundesc, _dbg) -> fundesc.fun_closed <- false; fundesc.fun_inline <- None; ) @@ -1462,13 +1576,13 @@ and close_switch env cases num_keys default = let collect_exported_structured_constants a = let rec approx = function - | Value_closure (fd, a) -> + | Value_closure (_, fd, a) -> approx a; begin match fd.fun_inline with | Some (_, u) -> ulam u | None -> () end - | Value_tuple a -> Array.iter approx a + | Value_tuple (_,a) -> Array.iter approx a | Value_const c -> const c | Value_unknown | Value_global_field _ -> () and const = function @@ -1486,8 +1600,8 @@ let collect_exported_structured_constants a = and ulam = function | Uvar _ -> () | Uconst c -> const c - | Udirect_apply (_, ul, _, _) -> List.iter ulam ul - | Ugeneric_apply (u, ul, _) -> ulam u; List.iter ulam ul + | Udirect_apply (_, ul, _, _, _) -> List.iter ulam ul + | Ugeneric_apply (u, ul, _, _) -> ulam u; List.iter ulam ul | Uclosure (fl, ul) -> List.iter (fun f -> ulam f.body) fl; List.iter ulam ul @@ -1512,8 +1626,10 @@ let collect_exported_structured_constants a = | Uifthenelse (u1, u2, u3) | Ufor (_, u1, u2, _, u3) -> ulam u1; ulam u2; ulam u3 | Uassign (_, u) -> ulam u - | Usend (_, u1, u2, ul, _) -> ulam u1; ulam u2; List.iter ulam ul + | Usend (_, u1, u2, ul, _, _) -> ulam u1; ulam u2; List.iter ulam ul | Uunreachable -> () + | Uregion u -> ulam u + | Utail u -> ulam u in approx a @@ -1527,7 +1643,7 @@ let intro ~backend ~size lam = reset (); let id = Compilenv.make_symbol None in global_approx := Array.init size (fun i -> Value_global_field (id, i)); - Compilenv.set_global_approx(Value_tuple !global_approx); + Compilenv.set_global_approx(Value_tuple (Alloc_heap, !global_approx)); let (ulam, _approx) = close { backend; fenv = V.Map.empty; cenv = V.Map.empty; mutable_vars = V.Set.empty } lam @@ -1538,6 +1654,6 @@ let intro ~backend ~size lam = in if opaque then Compilenv.set_global_approx(Value_unknown) - else collect_exported_structured_constants (Value_tuple !global_approx); + else collect_exported_structured_constants (Value_tuple (Alloc_heap, !global_approx)); global_approx := [||]; ulam diff --git a/middle_end/compilenv.ml b/middle_end/compilenv.ml index 247b069403d..55cbadc68c1 100644 --- a/middle_end/compilenv.ml +++ b/middle_end/compilenv.ml @@ -318,18 +318,18 @@ let approx_env () = !merged_environment (* Record that a currying function or application function is needed *) -let need_curry_fun n = - if not (List.mem n current_unit.ui_curry_fun) then - current_unit.ui_curry_fun <- n :: current_unit.ui_curry_fun +let need_curry_fun arity = + if not (List.mem arity current_unit.ui_curry_fun) then + current_unit.ui_curry_fun <- arity :: current_unit.ui_curry_fun -let need_apply_fun n = +let need_apply_fun n mode = assert(n > 0); - if not (List.mem n current_unit.ui_apply_fun) then - current_unit.ui_apply_fun <- n :: current_unit.ui_apply_fun + if not (List.mem (n,mode) current_unit.ui_apply_fun) then + current_unit.ui_apply_fun <- (n,mode) :: current_unit.ui_apply_fun -let need_send_fun n = - if not (List.mem n current_unit.ui_send_fun) then - current_unit.ui_send_fun <- n :: current_unit.ui_send_fun +let need_send_fun n mode = + if not (List.mem (n,mode) current_unit.ui_send_fun) then + current_unit.ui_send_fun <- (n,mode) :: current_unit.ui_send_fun (* Write the description of the current unit *) diff --git a/middle_end/compilenv.mli b/middle_end/compilenv.mli index 8f1ef284f09..380b9c52f94 100644 --- a/middle_end/compilenv.mli +++ b/middle_end/compilenv.mli @@ -95,9 +95,9 @@ val approx_for_global: Compilation_unit.t -> Export_info.t option (* Loads the exported information declaring the compilation_unit flambda-only *) -val need_curry_fun: int -> unit -val need_apply_fun: int -> unit -val need_send_fun: int -> unit +val need_curry_fun: Clambda.arity -> unit +val need_apply_fun: int -> Lambda.alloc_mode -> unit +val need_send_fun: int -> Lambda.alloc_mode -> unit (* Record the need of a currying (resp. application, message sending) function with the given arity *) diff --git a/middle_end/convert_primitives.ml b/middle_end/convert_primitives.ml index 624479e9b3c..564ea7560d1 100644 --- a/middle_end/convert_primitives.ml +++ b/middle_end/convert_primitives.ml @@ -24,17 +24,17 @@ let convert_unsafety is_unsafe : Clambda_primitives.is_safe = let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = match prim with - | Pmakeblock (tag, mutability, shape, _) -> - Pmakeblock (tag, mutability, shape) - | Pmakefloatblock (mutability, _) -> - Pmakearray (Pfloatarray, mutability) + | Pmakeblock (tag, mutability, shape, mode) -> + Pmakeblock (tag, mutability, shape, mode) + | Pmakefloatblock (mutability, mode) -> + Pmakearray (Pfloatarray, mutability, mode) | Pfield (field, _) -> Pfield field | Pfield_computed _sem -> Pfield_computed | Psetfield (field, imm_or_pointer, init_or_assign) -> Psetfield (field, imm_or_pointer, init_or_assign) | Psetfield_computed (imm_or_pointer, init_or_assign) -> Psetfield_computed (imm_or_pointer, init_or_assign) - | Pfloatfield (field, _sem, _mode) -> Pfloatfield field + | Pfloatfield (field, _sem, mode) -> Pfloatfield (field, mode) | Psetfloatfield (field, init_or_assign) -> Psetfloatfield (field, init_or_assign) | Pduprecord (repr, size) -> Pduprecord (repr, size) @@ -62,13 +62,13 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = | Poffsetint offset -> Poffsetint offset | Poffsetref offset -> Poffsetref offset | Pintoffloat -> Pintoffloat - | Pfloatofint _ -> Pfloatofint - | Pnegfloat _ -> Pnegfloat - | Pabsfloat _ -> Pabsfloat - | Paddfloat _ -> Paddfloat - | Psubfloat _ -> Psubfloat - | Pmulfloat _ -> Pmulfloat - | Pdivfloat _ -> Pdivfloat + | Pfloatofint m -> Pfloatofint m + | Pnegfloat m -> Pnegfloat m + | Pabsfloat m -> Pabsfloat m + | Paddfloat m -> Paddfloat m + | Psubfloat m -> Psubfloat m + | Pmulfloat m -> Pmulfloat m + | Pdivfloat m -> Pdivfloat m | Pfloatcomp comp -> Pfloatcomp comp | Pstringlength -> Pstringlength | Pstringrefu -> Pstringrefu @@ -78,7 +78,7 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = | Pbytessetu -> Pbytessetu | Pbytesrefs -> Pbytesrefs | Pbytessets -> Pbytessets - | Pmakearray (kind, mutability, _) -> Pmakearray (kind, mutability) + | Pmakearray (kind, mutability, mode) -> Pmakearray (kind, mutability, mode) | Pduparray (kind, mutability) -> Pduparray (kind, mutability) | Parraylength kind -> Parraylength kind | Parrayrefu kind -> Parrayrefu kind @@ -87,39 +87,39 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = | Parraysets kind -> Parraysets kind | Pisint -> Pisint | Pisout -> Pisout - | Pcvtbint (src, dest, _) -> Pcvtbint (src, dest) - | Pnegbint (bi, _) -> Pnegbint bi - | Paddbint (bi, _) -> Paddbint bi - | Psubbint (bi, _) -> Psubbint bi - | Pmulbint (bi, _) -> Pmulbint bi - | Pbintofint (bi, _) -> Pbintofint bi + | Pcvtbint (src, dest, m) -> Pcvtbint (src, dest, m) + | Pnegbint (bi,m) -> Pnegbint (bi,m) + | Paddbint (bi,m) -> Paddbint (bi,m) + | Psubbint (bi,m) -> Psubbint (bi,m) + | Pmulbint (bi,m) -> Pmulbint (bi,m) + | Pbintofint (bi,m) -> Pbintofint (bi,m) | Pintofbint bi -> Pintofbint bi - | Pandbint (bi, _) -> Pandbint bi - | Porbint (bi, _) -> Porbint bi - | Pxorbint (bi, _) -> Pxorbint bi - | Plslbint (bi, _) -> Plslbint bi - | Plsrbint (bi, _) -> Plsrbint bi - | Pasrbint (bi, _) -> Pasrbint bi - | Pbbswap (bi, _) -> Pbbswap bi - | Pdivbint { size; is_safe } -> Pdivbint { size; is_safe } - | Pmodbint { size; is_safe } -> Pmodbint { size; is_safe } + | Pandbint (bi,m) -> Pandbint (bi,m) + | Porbint (bi,m) -> Porbint (bi,m) + | Pxorbint (bi,m) -> Pxorbint (bi,m) + | Plslbint (bi,m) -> Plslbint (bi,m) + | Plsrbint (bi,m) -> Plsrbint (bi,m) + | Pasrbint (bi,m) -> Pasrbint (bi,m) + | Pbbswap (bi,m) -> Pbbswap (bi,m) + | Pdivbint { size; is_safe; mode } -> Pdivbint { size; is_safe; mode } + | Pmodbint { size; is_safe; mode } -> Pmodbint { size; is_safe; mode } | Pbintcomp (bi, comp) -> Pbintcomp (bi, comp) | Pbigarrayref (safe, dims, kind, layout) -> Pbigarrayref (safe, dims, kind, layout) | Pbigarrayset (safe, dims, kind, layout) -> Pbigarrayset (safe, dims, kind, layout) | Pstring_load_16 is_unsafe -> - Pstring_load (Sixteen, convert_unsafety is_unsafe) - | Pstring_load_32 (is_unsafe, _) -> - Pstring_load (Thirty_two, convert_unsafety is_unsafe) - | Pstring_load_64 (is_unsafe, _) -> - Pstring_load (Sixty_four, convert_unsafety is_unsafe) + Pstring_load (Sixteen, convert_unsafety is_unsafe, Alloc_heap) + | Pstring_load_32 (is_unsafe,m) -> + Pstring_load (Thirty_two, convert_unsafety is_unsafe, m) + | Pstring_load_64 (is_unsafe, m) -> + Pstring_load (Sixty_four, convert_unsafety is_unsafe, m) | Pbytes_load_16 is_unsafe -> - Pbytes_load (Sixteen, convert_unsafety is_unsafe) - | Pbytes_load_32 (is_unsafe, _) -> - Pbytes_load (Thirty_two, convert_unsafety is_unsafe) - | Pbytes_load_64 (is_unsafe, _) -> - Pbytes_load (Sixty_four, convert_unsafety is_unsafe) + Pbytes_load (Sixteen, convert_unsafety is_unsafe, Alloc_heap) + | Pbytes_load_32 (is_unsafe, m) -> + Pbytes_load (Thirty_two, convert_unsafety is_unsafe, m) + | Pbytes_load_64 (is_unsafe, m) -> + Pbytes_load (Sixty_four, convert_unsafety is_unsafe, m) | Pbytes_set_16 is_unsafe -> Pbytes_set (Sixteen, convert_unsafety is_unsafe) | Pbytes_set_32 is_unsafe -> @@ -127,11 +127,11 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = | Pbytes_set_64 is_unsafe -> Pbytes_set (Sixty_four, convert_unsafety is_unsafe) | Pbigstring_load_16 is_unsafe -> - Pbigstring_load (Sixteen, convert_unsafety is_unsafe) - | Pbigstring_load_32 (is_unsafe, _) -> - Pbigstring_load (Thirty_two, convert_unsafety is_unsafe) - | Pbigstring_load_64 (is_unsafe, _) -> - Pbigstring_load (Sixty_four, convert_unsafety is_unsafe) + Pbigstring_load (Sixteen, convert_unsafety is_unsafe, Alloc_heap) + | Pbigstring_load_32 (is_unsafe, m) -> + Pbigstring_load (Thirty_two, convert_unsafety is_unsafe, m) + | Pbigstring_load_64 (is_unsafe, m) -> + Pbigstring_load (Sixty_four, convert_unsafety is_unsafe, m) | Pbigstring_set_16 is_unsafe -> Pbigstring_set (Sixteen, convert_unsafety is_unsafe) | Pbigstring_set_32 is_unsafe -> diff --git a/middle_end/flambda/augment_specialised_args.ml b/middle_end/flambda/augment_specialised_args.ml index 0393c359f4f..5485fa508c6 100644 --- a/middle_end/flambda/augment_specialised_args.ml +++ b/middle_end/flambda/augment_specialised_args.ml @@ -451,6 +451,8 @@ module Make (T : S) = struct Variable.Map.data new_inner_vars_to_spec_args_bound_in_the_wrapper_renaming in + let mode = + if function_decl.region then Lambda.Alloc_heap else Lambda.Alloc_local in (* New definitions that project from existing specialised args need to be rewritten to use the corresponding specialised args of the wrapper. Definitions that are just equality to existing @@ -468,6 +470,8 @@ module Make (T : S) = struct spec_args_bound_in_the_wrapper; kind = Direct (Closure_id.wrap new_fun_var); dbg = Debuginfo.none; + reg_close = Rc_normal; + mode; inlined = Default_inlined; specialise = Default_specialise; probe = None; @@ -528,9 +532,16 @@ module Make (T : S) = struct for_one_function.existing_specialised_args Variable.Map.empty in + let alloc_mode = + (* Wrapper closes over no more values than the original function, + so can share the same alloc mode *) + function_decl.alloc_mode + in let new_function_decl = Flambda.create_function_declaration ~params:wrapper_params + ~alloc_mode + ~region:function_decl.region ~body:wrapper_body ~stub:true ~dbg:Debuginfo.none @@ -608,8 +619,12 @@ module Make (T : S) = struct Variable.Set.elements (Variable.Map.keys for_one_function.new_inner_to_new_outer_vars) in + let last_mode = + List.fold_left (fun _mode p -> Parameter.alloc_mode p) + function_decl.alloc_mode function_decl.params + in let new_params = - List.map Parameter.wrap new_params + List.map (fun p -> Parameter.wrap p last_mode) new_params in function_decl.params @ new_params in @@ -619,6 +634,8 @@ module Make (T : S) = struct let rewritten_function_decl = Flambda.create_function_declaration ~params:all_params + ~alloc_mode:function_decl.alloc_mode + ~region:function_decl.region ~body:function_decl.body ~stub:function_decl.stub ~dbg:function_decl.dbg diff --git a/middle_end/flambda/build_export_info.ml b/middle_end/flambda/build_export_info.ml index 554b69a2e24..32b82535e39 100644 --- a/middle_end/flambda/build_export_info.ml +++ b/middle_end/flambda/build_export_info.ml @@ -258,6 +258,10 @@ let rec approx_of_expr (env : Env.t) (flam : Flambda.t) : Export_info.approx = Closure_id.Map.find closure_id results | _ -> Value_unknown end + | Region body -> + approx_of_expr env body + | Tail body -> + approx_of_expr env body | Assign _ -> Value_id (Env.new_unit_descr env) | For _ -> Value_id (Env.new_unit_descr env) | While _ -> Value_id (Env.new_unit_descr env) @@ -280,7 +284,7 @@ and descr_of_named (env : Env.t) (named : Flambda.named) Value_id (Env.new_descr env (descr_of_constant const)) | Allocated_const const -> Value_id (Env.new_descr env (descr_of_allocated_constant const)) - | Prim (Pmakeblock (tag, Immutable, _value_kind), args, _dbg) -> + | Prim (Pmakeblock (tag, Immutable, _value_kind, _mode), args, _dbg) -> let approxs = List.map (Env.find_approx env) args in let descr : Export_info.descr = Value_block (Tag.create_exn tag, Array.of_list approxs) diff --git a/middle_end/flambda/closure_conversion.ml b/middle_end/flambda/closure_conversion.ml index 1f10eb40191..5180f47f100 100644 --- a/middle_end/flambda/closure_conversion.ml +++ b/middle_end/flambda/closure_conversion.ml @@ -75,7 +75,7 @@ let add_default_argument_wrappers lam = (** Generate a wrapper ("stub") function that accepts a tuple argument and calls another function with arguments extracted in the obvious manner from the tuple. *) -let tupled_function_call_stub original_params unboxed_version ~closure_bound_var +let tupled_function_call_stub original_params unboxed_version ~closure_bound_var ~region : Flambda.function_declaration = let tuple_param_var = Variable.rename unboxed_version in let params = List.map (fun p -> Variable.rename p) original_params in @@ -87,6 +87,8 @@ let tupled_function_call_stub original_params unboxed_version ~closure_bound_var redundancy here (func is also unboxed_version) *) kind = Direct (Closure_id.wrap unboxed_version); dbg = Debuginfo.none; + reg_close = Rc_normal; + mode = if region then Alloc_heap else Alloc_local; inlined = Default_inlined; specialise = Default_specialise; probe = None; @@ -100,8 +102,10 @@ let tupled_function_call_stub original_params unboxed_version ~closure_bound_var pos + 1, Flambda.create_let param lam body) (0, call) params in - let tuple_param = Parameter.wrap tuple_param_var in - Flambda.create_function_declaration ~params:[tuple_param] + (* Tupled functions are always Alloc_heap. See translcore.ml *) + let alloc_mode = Lambda.Alloc_heap in + let tuple_param = Parameter.wrap tuple_param_var alloc_mode in + Flambda.create_function_declaration ~params:[tuple_param] ~alloc_mode ~region ~body ~stub:true ~dbg:Debuginfo.none ~inline:Default_inline ~specialise:Default_specialise ~is_a_functor:false ~closure_origin:(Closure_origin.create (Closure_id.wrap closure_bound_var)) @@ -208,7 +212,7 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = initial_value = var; body; contents_kind = block_kind }) - | Lfunction { kind; params; body; attr; loc; } -> + | Lfunction { kind; params; body; attr; loc; mode; region } -> let name = Names.anon_fn_with_loc loc in let closure_bound_var = Variable.create name in (* CR-soon mshinwell: some of this is now very similar to the let rec case @@ -216,8 +220,8 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = let set_of_closures_var = Variable.create Names.set_of_closures in let set_of_closures = let decl = - Function_decl.create ~let_rec_ident:None ~closure_bound_var ~kind - ~params:(List.map fst params) ~body ~attr ~loc + Function_decl.create ~let_rec_ident:None ~closure_bound_var ~kind ~mode + ~region ~params:(List.map fst params) ~body ~attr ~loc in close_functions t env (Function_decls.create [decl]) in @@ -228,7 +232,7 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = in Flambda.create_let set_of_closures_var set_of_closures (name_expr (Project_closure (project_closure)) ~name) - | Lapply { ap_func; ap_args; ap_loc; + | Lapply { ap_func; ap_args; ap_loc; ap_region_close; ap_mode; ap_tailcall = _; ap_inlined; ap_specialised; ap_probe; } -> Lift_code.lifting_helper (close_list t env ap_args) ~evaluation_order:`Right_to_left @@ -242,6 +246,8 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = args; kind = Indirect; dbg = Debuginfo.from_location ap_loc; + reg_close = ap_region_close; + mode = ap_mode; inlined = ap_inlined; specialise = ap_specialised; probe = ap_probe; @@ -258,14 +264,14 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = will be named after the corresponding identifier in the [let rec]. *) List.map (function | (let_rec_ident, - Lambda.Lfunction { kind; params; body; attr; loc }) -> + Lambda.Lfunction { kind; params; body; attr; loc; mode; region }) -> let closure_bound_var = Variable.create_with_same_name_as_ident let_rec_ident in let function_declaration = Function_decl.create ~let_rec_ident:(Some let_rec_ident) - ~closure_bound_var ~kind ~params:(List.map fst params) ~body - ~attr ~loc + ~closure_bound_var ~kind ~mode ~region + ~params:(List.map fst params) ~body ~attr ~loc in Some function_declaration | _ -> None) @@ -315,7 +321,7 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = in Let_rec (defs, close t env body) end - | Lsend (kind, meth, obj, args, _, _, loc) -> + | Lsend (kind, meth, obj, args, reg_close, mode, loc) -> let meth_var = Variable.create Names.meth in let obj_var = Variable.create Names.obj in let dbg = Debuginfo.from_location loc in @@ -325,7 +331,8 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = ~evaluation_order:`Right_to_left ~name:Names.send_arg ~create_body:(fun args -> - Send { kind; meth = meth_var; obj = obj_var; args; dbg; }))) + Send { kind; meth = meth_var; obj = obj_var; args; + dbg; reg_close; mode }))) | Lprim ((Pdivint Safe | Pmodint Safe | Pdivbint { is_safe = Safe } | Pmodbint { is_safe = Safe }) as prim, [arg1; arg2], loc) @@ -357,8 +364,8 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = match prim with | Pdivint _ -> Pdivint Unsafe | Pmodint _ -> Pmodint Unsafe - | Pdivbint { size } -> Pdivbint { size; is_safe = Unsafe } - | Pmodbint { size } -> Pmodbint { size; is_safe = Unsafe } + | Pdivbint { size; mode } -> Pdivbint { size; is_safe = Unsafe; mode } + | Pmodbint { size; mode } -> Pmodbint { size; is_safe = Unsafe; mode } | _ -> assert false in let comparison : Clambda_primitives.primitive = @@ -573,8 +580,8 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = or by completely removing it (replacing by unit). *) Misc.fatal_error "[Lifused] should have been removed by \ [Simplif.simplify_lets]" - | Lregion _ -> - assert false + | Lregion body -> + Region (close t env body) (** Perform closure conversion on a set of function declarations, returning a set of closures. (The set will often only contain a single function; @@ -589,6 +596,7 @@ and close_functions t external_env function_declarations : Flambda.named = let body = Function_decl.body decl in let loc = Function_decl.loc decl in let dbg = Debuginfo.from_location loc in + let region = Function_decl.region decl in let params = Function_decl.params decl in (* Create fresh variables for the elements of the closure (cf. the comment on [Function_decl.closure_env_without_parameters], above). @@ -605,7 +613,18 @@ and close_functions t external_env function_declarations : Flambda.named = not marked as stub but certainly should *) let stub = Function_decl.stub decl in let param_vars = List.map (Env.find_var closure_env) params in - let params = List.map Parameter.wrap param_vars in + let nheap = + match Function_decl.mode decl, Function_decl.kind decl with + | _, Curried {nlocal} -> List.length params - nlocal + | Alloc_heap, Tupled -> List.length params + | Alloc_local, Tupled -> + Misc.fatal_error "Closure_conversion: Tupled Alloc_local function found" + in + let params = List.mapi (fun i v -> + let alloc_mode : Lambda.alloc_mode = + if i < nheap then Alloc_heap else Alloc_local in + Parameter.wrap v alloc_mode) param_vars + in let closure_bound_var = Function_decl.closure_bound_var decl in let unboxed_version = Variable.rename closure_bound_var in let body = close t closure_env body in @@ -613,18 +632,22 @@ and close_functions t external_env function_declarations : Flambda.named = Closure_origin.create (Closure_id.wrap unboxed_version) in let fun_decl = - Flambda.create_function_declaration ~params ~body ~stub ~dbg + Flambda.create_function_declaration + ~params ~alloc_mode:(Function_decl.mode decl) ~region + ~body ~stub ~dbg ~inline:(Function_decl.inline decl) ~specialise:(Function_decl.specialise decl) ~is_a_functor:(Function_decl.is_a_functor decl) ~closure_origin in match Function_decl.kind decl with - | Curried _ -> Variable.Map.add closure_bound_var fun_decl map + | Curried _ -> + Variable.Map.add closure_bound_var fun_decl map | Tupled -> let unboxed_version = Variable.rename closure_bound_var in let generic_function_stub = - tupled_function_call_stub param_vars unboxed_version ~closure_bound_var + tupled_function_call_stub param_vars unboxed_version + ~closure_bound_var ~region in Variable.Map.add unboxed_version fun_decl (Variable.Map.add closure_bound_var generic_function_stub map) @@ -665,12 +688,12 @@ and close_list t sb l = List.map (close t sb) l and close_let_bound_expression t ?let_rec_ident let_bound_var env (lam : Lambda.lambda) : Flambda.named = match lam with - | Lfunction { kind; params; body; attr; loc; } -> + | Lfunction { kind; params; body; attr; loc; mode; region } -> (* Ensure that [let] and [let rec]-bound functions have appropriate names. *) let closure_bound_var = Variable.rename let_bound_var in let decl = - Function_decl.create ~let_rec_ident ~closure_bound_var ~kind + Function_decl.create ~let_rec_ident ~closure_bound_var ~kind ~mode ~region ~params:(List.map fst params) ~body ~attr ~loc in let set_of_closures_var = Variable.rename let_bound_var in diff --git a/middle_end/flambda/closure_conversion_aux.ml b/middle_end/flambda/closure_conversion_aux.ml index 38566c30c7a..bdeca5add75 100644 --- a/middle_end/flambda/closure_conversion_aux.ml +++ b/middle_end/flambda/closure_conversion_aux.ml @@ -87,6 +87,8 @@ module Function_decls = struct let_rec_ident : Ident.t; closure_bound_var : Variable.t; kind : Lambda.function_kind; + mode : Lambda.alloc_mode; + region : bool; params : Ident.t list; body : Lambda.lambda; free_idents_of_body : Ident.Set.t; @@ -94,8 +96,8 @@ module Function_decls = struct loc : Lambda.scoped_location } - let create ~let_rec_ident ~closure_bound_var ~kind ~params ~body - ~attr ~loc = + let create ~let_rec_ident ~closure_bound_var ~kind ~mode ~region + ~params ~body ~attr ~loc = let let_rec_ident = match let_rec_ident with | None -> Ident.create_local "unnamed_function" @@ -104,6 +106,8 @@ module Function_decls = struct { let_rec_ident; closure_bound_var; kind; + mode; + region; params; body; free_idents_of_body = Lambda.free_variables body; @@ -114,6 +118,8 @@ module Function_decls = struct let let_rec_ident t = t.let_rec_ident let closure_bound_var t = t.closure_bound_var let kind t = t.kind + let mode t = t.mode + let region t = t.region let params t = t.params let body t = t.body let free_idents t = t.free_idents_of_body @@ -160,7 +166,7 @@ module Function_decls = struct (all_params function_decls)) (let_rec_idents function_decls) - let create function_decls = + let create (function_decls : Function_decl.t list) = { function_decls; all_free_idents = all_free_idents function_decls; } diff --git a/middle_end/flambda/closure_conversion_aux.mli b/middle_end/flambda/closure_conversion_aux.mli index 633292ec27b..89936418375 100644 --- a/middle_end/flambda/closure_conversion_aux.mli +++ b/middle_end/flambda/closure_conversion_aux.mli @@ -56,6 +56,8 @@ module Function_decls : sig : let_rec_ident:Ident.t option -> closure_bound_var:Variable.t -> kind:Lambda.function_kind + -> mode:Lambda.alloc_mode + -> region:bool -> params:Ident.t list -> body:Lambda.lambda -> attr:Lambda.function_attribute @@ -65,6 +67,8 @@ module Function_decls : sig val let_rec_ident : t -> Ident.t val closure_bound_var : t -> Variable.t val kind : t -> Lambda.function_kind + val mode : t -> Lambda.alloc_mode + val region : t -> bool val params : t -> Ident.t list val body : t -> Lambda.lambda val inline : t -> Lambda.inline_attribute diff --git a/middle_end/flambda/effect_analysis.ml b/middle_end/flambda/effect_analysis.ml index 2ddba764bc5..2a235bc598d 100644 --- a/middle_end/flambda/effect_analysis.ml +++ b/middle_end/flambda/effect_analysis.ml @@ -45,6 +45,10 @@ let rec no_effects (flam : Flambda.t) = (* If there is a [raise] in [body], the whole [Try_with] may have an effect, so there is no need to test the handler. *) no_effects body + | Region body -> + no_effects body + | Tail body -> + no_effects body | While _ | For _ | Apply _ | Send _ | Assign _ | Static_raise _ -> false | Proved_unreachable -> true diff --git a/middle_end/flambda/export_info_for_pack.ml b/middle_end/flambda/export_info_for_pack.ml index f4baa29b82f..6fc8172aec6 100644 --- a/middle_end/flambda/export_info_for_pack.ml +++ b/middle_end/flambda/export_info_for_pack.ml @@ -139,7 +139,9 @@ and import_function_declarations_for_pack_aux units pack let funs = Variable.Map.map (fun (function_decl : Flambda.function_declaration) -> - Flambda.create_function_declaration ~params:function_decl.params + Flambda.create_function_declaration + ~params:function_decl.params ~alloc_mode:function_decl.alloc_mode + ~region:function_decl.region ~body:(import_code_for_pack units pack function_decl.body) ~stub:function_decl.stub ~dbg:function_decl.dbg ~inline:function_decl.inline diff --git a/middle_end/flambda/extract_projections.ml b/middle_end/flambda/extract_projections.ml index 33cd473ecdf..05e8b6824a0 100644 --- a/middle_end/flambda/extract_projections.ml +++ b/middle_end/flambda/extract_projections.ml @@ -107,6 +107,7 @@ let rec analyse_expr ~which_variables expr = check_free_variable from_value; check_free_variable to_value | Let _ | Let_rec _ | Static_catch _ | While _ | Try_with _ + | Region _ | Tail _ | Proved_unreachable -> () in let for_named (named : Flambda.named) = diff --git a/middle_end/flambda/flambda.ml b/middle_end/flambda/flambda.ml index b368093fbcf..9e078639033 100644 --- a/middle_end/flambda/flambda.ml +++ b/middle_end/flambda/flambda.ml @@ -30,6 +30,8 @@ type apply = { args : Variable.t list; kind : call_kind; dbg : Debuginfo.t; + reg_close : Lambda.region_close; + mode : Lambda.alloc_mode; inlined : Lambda.inlined_attribute; specialise : Lambda.specialise_attribute; probe : Lambda.probe; @@ -46,6 +48,8 @@ type send = { obj : Variable.t; args : Variable.t list; dbg : Debuginfo.t; + reg_close : Lambda.region_close; + mode : Lambda.alloc_mode; } type project_closure = Projection.project_closure @@ -73,6 +77,8 @@ type t = | Try_with of t * Variable.t * t | While of t * t | For of for_loop + | Region of t + | Tail of t | Proved_unreachable and named = @@ -108,6 +114,7 @@ and set_of_closures = { free_vars : specialised_to Variable.Map.t; specialised_args : specialised_to Variable.Map.t; direct_call_surrogates : Variable.t Variable.Map.t; + alloc_mode : Lambda.alloc_mode; } and function_declarations = { @@ -120,6 +127,8 @@ and function_declarations = { and function_declaration = { closure_origin: Closure_origin.t; params : Parameter.t list; + alloc_mode : Lambda.alloc_mode; + region : bool; body : t; free_variables : Variable.Set.t; free_symbols : Symbol.Set.t; @@ -337,6 +346,11 @@ let rec lam ppf (flam : t) = (match direction with Asttypes.Upto -> "to" | Asttypes.Downto -> "downto") Variable.print to_value lam body + | Region body -> + fprintf ppf "@[<2>(region@ %a)@]" lam body + | Tail body -> + fprintf ppf "@[<2>(tail@ %a)@]" lam body + and print_named ppf (named : named) = match named with | Symbol (symbol) -> Symbol.print ppf symbol @@ -362,11 +376,8 @@ and print_named ppf (named : named) = (* lam ppf expr *) and print_function_declaration ppf var (f : function_declaration) = - let param ppf p = - Variable.print ppf (Parameter.var p) - in let params ppf = - List.iter (fprintf ppf "@ %a" param) in + List.iter (fprintf ppf "@ %a" Parameter.print) in let stub = if f.stub then " *stub*" @@ -399,7 +410,7 @@ and print_function_declaration ppf var (f : function_declaration) = and print_set_of_closures ppf (set_of_closures : set_of_closures) = match set_of_closures with - | { function_decls; free_vars; specialised_args} -> + | { function_decls; free_vars; specialised_args; alloc_mode } -> let funs ppf = Variable.Map.iter (print_function_declaration ppf) in @@ -418,9 +429,14 @@ and print_set_of_closures ppf (set_of_closures : set_of_closures) = spec_args end in + let alloc_mode = match alloc_mode with + | Alloc_heap -> "Alloc_heap" + | Alloc_local -> "Alloc_local" + in fprintf ppf "@[<2>(set_of_closures id=%a@ %a@ @[<2>free_vars={%a@ }@]@ \ @[<2>specialised_args={%a})@]@ \ @[<2>direct_call_surrogates=%a@]@ \ + @[<2>alloc_mode=%s@]@ \ @[<2>set_of_closures_origin=%a@]@]]" Set_of_closures_id.print function_decls.set_of_closures_id funs function_decls.funs @@ -428,6 +444,7 @@ and print_set_of_closures ppf (set_of_closures : set_of_closures) = spec specialised_args (Variable.Map.print Variable.print) set_of_closures.direct_call_surrogates + alloc_mode Set_of_closures_origin.print function_decls.set_of_closures_origin and print_const ppf (c : const) = @@ -604,6 +621,10 @@ let rec variables_usage ?ignore_uses_as_callee ?ignore_uses_as_argument free_variable meth; free_variable obj; List.iter free_variable args; + | Region body -> + aux body + | Tail body -> + aux body | Proved_unreachable -> () in aux tree; @@ -685,6 +706,8 @@ let create_let var defining_expr body : t = | Expr (Let { var = var1; defining_expr; body = Var var2; free_vars_of_defining_expr; _ }) when Variable.equal var1 var2 -> defining_expr, free_vars_of_defining_expr + (* TODO: This let-conversion is blocked by Region constructors. + It might be worth optimising this. *) | _ -> defining_expr, free_variables_named defining_expr in Let { @@ -799,6 +822,10 @@ let iter_general ~toplevel f f_named maybe_named = | String_switch (_, sw, def) -> List.iter (fun (_,l) -> aux l) sw; Option.iter aux def + | Region body -> + aux body + | Tail body -> + aux body and aux_named (named : named) = f_named named; match named with @@ -870,6 +897,10 @@ module With_free_variables = struct free_vars_of_body; } + let create_region (t : expr t) = + let Expr (body, fv) = t in + Expr (Region body, fv) + let expr (t : expr t) = match t with | Expr (expr, free_vars) -> Named (Expr expr, free_vars) @@ -894,18 +925,19 @@ let fold_lets_option let finish ~last_body ~acc ~rev_lets = let module W = With_free_variables in let acc, t = - List.fold_left (fun (acc, t) (var, defining_expr) -> + List.fold_left (fun (acc, t) (has_region, var, defining_expr) -> let free_vars_of_body = W.free_variables t in let acc, var, defining_expr = filter_defining_expr acc var defining_expr free_vars_of_body in - match defining_expr with - | None -> acc, t - | Some defining_expr -> - let let_expr = - W.create_let_reusing_body var defining_expr t - in - acc, W.of_expr let_expr) + let t = + match defining_expr with + | None -> t + | Some defining_expr -> + W.of_expr (W.create_let_reusing_body var defining_expr t) + in + let t = if has_region then W.create_region t else t in + acc, t) (acc, W.of_expr last_body) rev_lets in @@ -913,11 +945,13 @@ let fold_lets_option in let rec loop (t : t) ~acc ~rev_lets = match t with - | Let { var; defining_expr; body; _ } -> + | Let { var; defining_expr; body; _ } + | Region (Let { var; defining_expr; body; _ }) -> let acc, var, defining_expr = for_defining_expr acc var defining_expr in - let rev_lets = (var, defining_expr) :: rev_lets in + let has_region = match t with Region _ -> true | _ -> false in + let rev_lets = (has_region, var, defining_expr) :: rev_lets in loop body ~acc ~rev_lets | t -> let last_body, acc = for_last_body acc t in @@ -998,6 +1032,8 @@ let update_body_of_function_declaration (func_decl: function_declaration) ~body : function_declaration = { closure_origin = func_decl.closure_origin; params = func_decl.params; + alloc_mode = func_decl.alloc_mode; + region = func_decl.region; body; free_variables = free_variables body; free_symbols = free_symbols body; @@ -1008,22 +1044,15 @@ let update_body_of_function_declaration (func_decl: function_declaration) is_a_functor = func_decl.is_a_functor; } -let update_function_decl's_params_and_body - (func_decl : function_declaration) ~params ~body = - { closure_origin = func_decl.closure_origin; - params; - body; - free_variables = free_variables body; - free_symbols = free_symbols body; - stub = func_decl.stub; - dbg = func_decl.dbg; - inline = func_decl.inline; - specialise = func_decl.specialise; - is_a_functor = func_decl.is_a_functor; - } +let rec check_param_modes mode = function + | [] -> () + | p :: params -> + let m = Parameter.alloc_mode p in + if not (Lambda.sub_mode mode m) then + Misc.fatal_errorf "Nonmonotonic partial modes"; + check_param_modes m params - -let create_function_declaration ~params ~body ~stub ~dbg +let create_function_declaration ~params ~alloc_mode ~region ~body ~stub ~dbg ~(inline : Lambda.inline_attribute) ~(specialise : Lambda.specialise_attribute) ~is_a_functor ~closure_origin @@ -1046,8 +1075,11 @@ let create_function_declaration ~params ~body ~stub ~dbg "Stubs may not be annotated as [Always_specialise]: %a" print body end; + check_param_modes alloc_mode params; { closure_origin; params; + alloc_mode; + region; body; free_variables = free_variables body; free_symbols = free_symbols body; @@ -1058,10 +1090,10 @@ let create_function_declaration ~params ~body ~stub ~dbg is_a_functor; } -let update_function_declaration fun_decl ~params ~body = +let update_function_declaration_body fun_decl ~body = let free_variables = free_variables body in let free_symbols = free_symbols body in - { fun_decl with params; body; free_variables; free_symbols } + { fun_decl with body; free_variables; free_symbols } let create_function_declarations ~is_classic_mode ~funs = let compilation_unit = Compilation_unit.get_current_exn () in @@ -1179,10 +1211,19 @@ let create_set_of_closures ~function_decls ~free_vars ~specialised_args print_function_declarations function_decls end end; + let alloc_mode = + match Variable.Map.data function_decls.funs with + | f :: fs -> + assert (List.for_all (fun (g : function_declaration) -> + Lambda.eq_mode f.alloc_mode g.alloc_mode) fs); + f.alloc_mode + | [] -> assert false + in { function_decls; free_vars; specialised_args; direct_call_surrogates; + alloc_mode } let used_params function_decl = diff --git a/middle_end/flambda/flambda.mli b/middle_end/flambda/flambda.mli index c07389d335a..08107e58470 100644 --- a/middle_end/flambda/flambda.mli +++ b/middle_end/flambda/flambda.mli @@ -38,6 +38,8 @@ type apply = { args : Variable.t list; kind : call_kind; dbg : Debuginfo.t; + reg_close : Lambda.region_close; + mode : Lambda.alloc_mode; inlined : Lambda.inlined_attribute; (** Instructions from the source code as to whether the callee should be inlined. *) @@ -62,6 +64,8 @@ type send = { obj : Variable.t; args : Variable.t list; dbg : Debuginfo.t; + reg_close : Lambda.region_close; + mode : Lambda.alloc_mode; } (** For details on these types, see projection.mli. *) @@ -109,6 +113,8 @@ type t = | Try_with of t * Variable.t * t | While of t * t | For of for_loop + | Region of t + | Tail of t | Proved_unreachable (** Values of type [named] will always be [let]-bound to a [Variable.t]. *) @@ -280,6 +286,8 @@ and set_of_closures = private { functions (which will be inlined at direct call sites, but will penalise indirect call sites). [direct_call_surrogates] may not be transitively closed. *) + alloc_mode : Lambda.alloc_mode; + (** Whether these closures are allocated on the heap or locally. *) } and function_declarations = private { @@ -303,6 +311,8 @@ and function_declarations = private { and function_declaration = private { closure_origin: Closure_origin.t; params : Parameter.t list; + alloc_mode : Lambda.alloc_mode; + region : bool; body : t; (* CR-soon mshinwell: inconsistent naming free_variables/free_vars here and above *) @@ -549,6 +559,8 @@ end symbols occurring in the specified [body]. *) val create_function_declaration : params:Parameter.t list + -> alloc_mode:Lambda.alloc_mode + -> region:bool -> body:t -> stub:bool -> dbg:Debuginfo.t @@ -559,9 +571,8 @@ val create_function_declaration -> function_declaration (** Create a function declaration based on another function declaration *) -val update_function_declaration +val update_function_declaration_body : function_declaration - -> params:Parameter.t list -> body:t -> function_declaration @@ -585,14 +596,6 @@ val update_body_of_function_declaration -> body:expr -> function_declaration -(** Change only the code and parameters of a function declaration. *) -(* CR-soon mshinwell: rename this to match new update function above *) -val update_function_decl's_params_and_body - : function_declaration - -> params:Parameter.t list - -> body:expr - -> function_declaration - (** Create a set of function declarations based on another set of function declarations. *) val update_function_declarations diff --git a/middle_end/flambda/flambda_invariants.ml b/middle_end/flambda/flambda_invariants.ml index 2b237acb139..62ca511dee5 100644 --- a/middle_end/flambda/flambda_invariants.ml +++ b/middle_end/flambda/flambda_invariants.ml @@ -186,7 +186,9 @@ let variable_and_symbol_invariants (program : Flambda.program) = loop (add_binding_occurrence env var) handler (* Everything else: *) | Var var -> check_variable_is_bound env var - | Apply { func; args; kind; dbg; inlined; specialise; probe } -> + | Apply { func; args; kind; dbg; inlined; specialise; probe; + reg_close = (Rc_close_at_apply|Rc_normal); + mode = (Alloc_heap|Alloc_local) } -> check_variable_is_bound env func; check_variables_are_bound env args; ignore_call_kind kind; @@ -197,7 +199,9 @@ let variable_and_symbol_invariants (program : Flambda.program) = | Assign { being_assigned; new_value; } -> check_mutable_variable_is_bound env being_assigned; check_variable_is_bound env new_value - | Send { kind; meth; obj; args; dbg; } -> + | Send { kind; meth; obj; args; dbg; + reg_close = (Rc_normal | Rc_close_at_apply); + mode = (Alloc_heap | Alloc_local) } -> ignore_meth_kind kind; check_variable_is_bound env meth; check_variable_is_bound env obj; @@ -229,6 +233,10 @@ let variable_and_symbol_invariants (program : Flambda.program) = | While (e1, e2) -> loop env e1; loop env e2 + | Region e -> + loop env e + | Tail e -> + loop env e | Proved_unreachable -> () and loop_named env (named : Flambda.named) = match named with @@ -261,7 +269,7 @@ let variable_and_symbol_invariants (program : Flambda.program) = loop env expr and loop_set_of_closures env ({ Flambda.function_decls; free_vars; specialised_args; - direct_call_surrogates = _; } as set_of_closures) = + direct_call_surrogates = _; alloc_mode = _ } as set_of_closures) = (* CR-soon mshinwell: check [direct_call_surrogates] *) let { Flambda. is_classic_mode; set_of_closures_id; set_of_closures_origin; funs; } = diff --git a/middle_end/flambda/flambda_iterators.ml b/middle_end/flambda/flambda_iterators.ml index 6edc4bba3b4..0939218514d 100644 --- a/middle_end/flambda/flambda_iterators.ml +++ b/middle_end/flambda/flambda_iterators.ml @@ -45,6 +45,8 @@ let apply_on_subexpressions f f_named (flam : Flambda.t) = | While (f1,f2) -> f f1; f f2 | For { body; _ } -> f body + | Region body -> f body + | Tail body -> f body let rec list_map_sharing f l = match l with @@ -159,6 +161,18 @@ let map_subexpressions f f_named (tree:Flambda.t) : Flambda.t = tree else For { bound_var; from_value; to_value; direction; body = new_body; } + | Region body -> + let new_body = f body in + if new_body == body then + tree + else + Region new_body + | Tail body -> + let new_body = f body in + if new_body == body then + tree + else + Tail new_body let iter_general = Flambda.iter_general @@ -384,6 +398,18 @@ let map_general ~toplevel f f_named tree = else For { bound_var; from_value; to_value; direction; body = new_body; } + | Region body -> + let new_body = aux body in + if new_body == body then + tree + else + Region new_body + | Tail body -> + let new_body = aux body in + if new_body == body then + tree + else + Tail new_body in f exp and aux_done_something expr done_something = @@ -410,8 +436,8 @@ let map_general ~toplevel f f_named tree = func_decl end else begin done_something := true; - Flambda.update_function_declaration func_decl - ~params:func_decl.params ~body:new_body + Flambda.update_function_declaration_body func_decl + ~body:new_body end) function_decls.funs in @@ -494,8 +520,7 @@ let map_symbols_on_set_of_closures if not (body == func_decl.body) then begin done_something := true; end; - Flambda.update_function_declaration func_decl - ~params:func_decl.params ~body) + Flambda.update_function_declaration_body func_decl ~body) function_decls.funs in if not !done_something then @@ -582,8 +607,8 @@ let map_function_bodies (set_of_closures : Flambda.set_of_closures) ~f = function_decl else begin done_something := true; - Flambda.update_function_declaration function_decl - ~body:new_body ~params:function_decl.params + Flambda.update_function_declaration_body function_decl + ~body:new_body end) set_of_closures.function_decls.funs in @@ -613,8 +638,7 @@ let map_sets_of_closures_of_program (program : Flambda.program) function_decl else begin done_something := true; - Flambda.update_function_declaration function_decl - ~body ~params:function_decl.params + Flambda.update_function_declaration_body function_decl ~body end) set_of_closures.function_decls.funs in @@ -709,8 +733,7 @@ let map_exprs_at_toplevel_of_program (program : Flambda.program) function_decl else begin done_something := true; - Flambda.update_function_declaration function_decl - ~body ~params:function_decl.params + Flambda.update_function_declaration_body function_decl ~body end) set_of_closures.function_decls.funs in diff --git a/middle_end/flambda/flambda_to_clambda.ml b/middle_end/flambda/flambda_to_clambda.ml index b1bb6a95460..644c7133334 100644 --- a/middle_end/flambda/flambda_to_clambda.ml +++ b/middle_end/flambda/flambda_to_clambda.ml @@ -93,6 +93,15 @@ let check_closure t ulam named : Clambda.ulambda = [ulam; Clambda.Uconst (Uconst_ref (sym, None))], Debuginfo.none) +let clambda_arity (func : Flambda.function_declaration) : Clambda.arity = + let nlocal = + func.params + |> List.filter (fun p -> + Lambda.eq_mode Alloc_local (Parameter.alloc_mode p)) + |> List.length + in + Curried {nlocal}, Flambda_utils.function_arity func + let check_field t ulam pos named_opt : Clambda.ulambda = if not !Clflags.clambda_checks then ulam else @@ -259,7 +268,7 @@ let rec to_clambda t env (flam : Flambda.t) : Clambda.ulambda = defs in Uletrec (defs, to_clambda t env body) - | Apply { func; args; kind = Direct direct_func; probe; dbg = dbg; } -> + | Apply { func; args; kind = Direct direct_func; probe; dbg; reg_close; mode} -> (* The closure _parameter_ of the function is added by cmmgen. At the call site, for a direct call, the closure argument must be explicitly added (by [to_clambda_direct_apply]); there is no special @@ -267,11 +276,11 @@ let rec to_clambda t env (flam : Flambda.t) : Clambda.ulambda = For an indirect call, we do not need to do anything here; Cmmgen will do the equivalent of the previous paragraph when it generates a direct call to [caml_apply]. *) - to_clambda_direct_apply t func args direct_func probe dbg env - | Apply { func; args; kind = Indirect; probe = None; dbg = dbg } -> + to_clambda_direct_apply t func args direct_func probe dbg reg_close mode env + | Apply { func; args; kind = Indirect; probe = None; dbg; reg_close; mode } -> let callee = subst_var env func in Ugeneric_apply (check_closure t callee (Flambda.Expr (Var func)), - subst_vars env args, dbg) + subst_vars env args, (reg_close, mode), dbg) | Apply { probe = Some {name}; _ } -> Misc.fatal_errorf "Cannot apply indirect handler for probe %s" name () | Switch (arg, sw) -> @@ -350,9 +359,27 @@ let rec to_clambda t env (flam : Flambda.t) : Clambda.ulambda = Flambda.print flam in Uassign (id, subst_var env new_value) - | Send { kind; meth; obj; args; dbg } -> + | Send { kind; meth; obj; args; dbg; reg_close; mode } -> Usend (kind, subst_var env meth, subst_var env obj, - subst_vars env args, dbg) + subst_vars env args, (reg_close,mode), dbg) + | Region body -> + let body = to_clambda t env body in + let is_trivial = + match body with + | Uvar _ | Uconst _ -> true + | _ -> false + in + if is_trivial then body + else Uregion body + | Tail body -> + let body = to_clambda t env body in + let is_trivial = + match body with + | Uvar _ | Uconst _ -> true + | _ -> false + in + if is_trivial then body + else Utail body | Proved_unreachable -> Uunreachable and to_clambda_named t env var (named : Flambda.named) : Clambda.ulambda = @@ -447,7 +474,7 @@ and to_clambda_switch t env cases num_keys default = | [| |] -> [| |], [| |] (* May happen when [default] is [None]. *) | _ -> index, actions -and to_clambda_direct_apply t func args direct_func probe dbg env +and to_clambda_direct_apply t func args direct_func probe dbg pos mode env : Clambda.ulambda = let closed = is_function_constant t direct_func in let label = Compilenv.function_label direct_func in @@ -458,7 +485,7 @@ and to_clambda_direct_apply t func args direct_func probe dbg env dropping any side effects.) *) if closed then uargs else uargs @ [subst_var env func] in - Udirect_apply (label, uargs, probe, dbg) + Udirect_apply (label, uargs, probe, (pos, mode), dbg) (* Describe how to build a runtime closure block that corresponds to the given Flambda set of closures. @@ -541,7 +568,7 @@ and to_clambda_set_of_closures t env function_decl.params (env, []) in { label = Compilenv.function_label closure_id; - arity = Flambda_utils.function_arity function_decl; + arity = clambda_arity function_decl; params = List.map (fun var -> VP.create var, Lambda.Pgenval) @@ -550,6 +577,7 @@ and to_clambda_set_of_closures t env body = to_clambda t env_body function_decl.body; dbg = function_decl.dbg; env = Some env_var; + mode = set_of_closures.alloc_mode; } in let funs = List.map to_clambda_function all_functions in @@ -589,12 +617,13 @@ and to_clambda_closed_set_of_closures t env symbol (to_clambda t env_body function_decl.body) in { label = Compilenv.function_label (Closure_id.wrap id); - arity = Flambda_utils.function_arity function_decl; + arity = clambda_arity function_decl; params = List.map (fun var -> VP.create var, Lambda.Pgenval) params; return = Lambda.Pgenval; body; dbg = function_decl.dbg; env = None; + mode = Alloc_heap; } in let ufunct = List.map to_clambda_function functions in diff --git a/middle_end/flambda/flambda_utils.ml b/middle_end/flambda/flambda_utils.ml index 78c37ec22af..059d463cb74 100644 --- a/middle_end/flambda/flambda_utils.ml +++ b/middle_end/flambda/flambda_utils.ml @@ -77,6 +77,8 @@ let description_of_toplevel_node (expr : Flambda.t) = | Try_with _ -> "trywith" | While _ -> "while" | For _ -> "for" + | Region _ -> "region" + | Tail _ -> "tail" let equal_direction_flag (x : Asttypes.direction_flag) @@ -150,6 +152,12 @@ let rec same (l1 : Flambda.t) (l2 : Flambda.t) = && equal_direction_flag direction1 direction2 && same body1 body2 | For _, _ | _, For _ -> false + | Region body1, Region body2 -> + same body1 body2 + | Region _, _ | _, Region _ -> false + | Tail body1, Tail body2 -> + same body1 body2 + | Tail _, _ | _, Tail _ -> false | Assign { being_assigned = being_assigned1; new_value = new_value1; }, Assign { being_assigned = being_assigned2; new_value = new_value2; } -> Mutable_variable.equal being_assigned1 being_assigned2 @@ -249,10 +257,12 @@ let toplevel_substitution sb tree = | Assign { being_assigned; new_value; } -> let new_value = sb new_value in Assign { being_assigned; new_value; } - | Apply { func; args; kind; dbg; inlined; specialise; probe; } -> + | Apply { func; args; kind; dbg; reg_close; mode; + inlined; specialise; probe; } -> let func = sb func in let args = List.map sb args in - Apply { func; args; kind; dbg; inlined; specialise; probe; } + Apply { func; args; kind; dbg; reg_close; mode; + inlined; specialise; probe; } | If_then_else (cond, e1, e2) -> let cond = sb cond in If_then_else (cond, e1, e2) @@ -262,11 +272,11 @@ let toplevel_substitution sb tree = | String_switch (cond, branches, def) -> let cond = sb cond in String_switch (cond, branches, def) - | Send { kind; meth; obj; args; dbg } -> + | Send { kind; meth; obj; args; dbg; reg_close; mode } -> let meth = sb meth in let obj = sb obj in let args = List.map sb args in - Send { kind; meth; obj; args; dbg } + Send { kind; meth; obj; args; dbg; reg_close; mode } | For { bound_var; from_value; to_value; direction; body } -> let from_value = sb from_value in let to_value = sb to_value in @@ -274,7 +284,7 @@ let toplevel_substitution sb tree = | Static_raise (static_exn, args) -> let args = List.map sb args in Static_raise (static_exn, args) - | Static_catch _ | Try_with _ | While _ + | Static_catch _ | Try_with _ | While _ | Region _ | Tail _ | Let _ | Let_rec _ | Proved_unreachable -> flam in let aux_named (named : Flambda.named) : Flambda.named = @@ -328,7 +338,7 @@ let toplevel_substitution_named sb named = | _ -> assert false let make_closure_declaration - ~is_classic_mode ~id ~body ~params ~stub : Flambda.t = + ~is_classic_mode ~id ~alloc_mode ~region ~body ~params ~stub : Flambda.t = let free_variables = Flambda.free_variables body in let param_set = Parameter.Set.vars params in if not (Variable.Set.subset param_set free_variables) then begin @@ -346,7 +356,8 @@ let make_closure_declaration let subst id = Variable.Map.find id sb in let subst_param param = Parameter.map_var subst param in let function_declaration = - Flambda.create_function_declaration ~params:(List.map subst_param params) + Flambda.create_function_declaration + ~params:(List.map subst_param params) ~alloc_mode ~region ~body ~stub ~dbg:Debuginfo.none ~inline:Default_inline ~specialise:Default_specialise ~is_a_functor:false ~closure_origin:(Closure_origin.create (Closure_id.wrap id)) @@ -696,15 +707,17 @@ let substitute_read_symbol_field_for_variables bind_from_value @@ bind_to_value @@ Flambda.For { bound_var; from_value; to_value; direction; body } - | Apply { func; args; kind; dbg; inlined; specialise; probe } -> + | Apply { func; args; kind; dbg; reg_close; mode; + inlined; specialise; probe } -> let func, bind_func = make_var_subst func in let args, bind_args = List.split (List.map make_var_subst args) in bind_func @@ List.fold_right (fun f expr -> f expr) bind_args @@ - Flambda.Apply { func; args; kind; dbg; inlined; specialise; probe } - | Send { kind; meth; obj; args; dbg } -> + Flambda.Apply { func; args; kind; dbg; reg_close; mode; + inlined; specialise; probe } + | Send { kind; meth; obj; args; dbg; reg_close; mode } -> let meth, bind_meth = make_var_subst meth in let obj, bind_obj = make_var_subst obj in let args, bind_args = @@ -713,8 +726,10 @@ let substitute_read_symbol_field_for_variables bind_meth @@ bind_obj @@ List.fold_right (fun f expr -> f expr) bind_args @@ - Flambda.Send { kind; meth; obj; args; dbg } + Flambda.Send { kind; meth; obj; args; dbg; reg_close; mode } | Proved_unreachable + | Region _ + | Tail _ | While _ | Try_with _ | Static_catch _ -> diff --git a/middle_end/flambda/flambda_utils.mli b/middle_end/flambda/flambda_utils.mli index 0f7b3186275..0f6e6ba7d43 100644 --- a/middle_end/flambda/flambda_utils.mli +++ b/middle_end/flambda/flambda_utils.mli @@ -65,6 +65,8 @@ val description_of_toplevel_node : Flambda.t -> string val make_closure_declaration : is_classic_mode:bool -> id:Variable.t + -> alloc_mode:Lambda.alloc_mode + -> region:bool -> body:Flambda.t -> params:Parameter.t list -> stub:bool diff --git a/middle_end/flambda/freshening.ml b/middle_end/flambda/freshening.ml index 891861a33e2..c84813276b8 100644 --- a/middle_end/flambda/freshening.ml +++ b/middle_end/flambda/freshening.ml @@ -321,7 +321,9 @@ module Project_var = struct Flambda_utils.toplevel_substitution subst.sb_var func_decl.body in let function_decl = - Flambda.create_function_declaration ~params ~body + Flambda.create_function_declaration + ~params ~alloc_mode:func_decl.alloc_mode ~region:func_decl.region + ~body ~stub:func_decl.stub ~dbg:func_decl.dbg ~inline:func_decl.inline ~specialise:func_decl.specialise ~is_a_functor:func_decl.is_a_functor diff --git a/middle_end/flambda/inconstant_idents.ml b/middle_end/flambda/inconstant_idents.ml index 18e9d3b89ad..3b6778d6bf5 100644 --- a/middle_end/flambda/inconstant_idents.ml +++ b/middle_end/flambda/inconstant_idents.ml @@ -297,6 +297,12 @@ module Inconstants (P:Param) (Backend:Backend_intf.S) = struct mark_var meth curr; mark_var obj curr; List.iter (fun arg -> mark_var arg curr) args + | Region body -> + mark_curr curr; + mark_loop ~toplevel [] body + | Tail body -> + mark_curr curr; + mark_loop ~toplevel [] body | Proved_unreachable -> mark_curr curr @@ -335,18 +341,18 @@ module Inconstants (P:Param) (Backend:Backend_intf.S) = struct makeblock(Mutable) can be a 'constant' if it is allocated at toplevel: if this expression is evaluated only once. *) - | Prim (Pmakeblock (_tag, (Immutable | Immutable_unique), _value_kind), - args, _dbg) -> + | Prim (Pmakeblock (_tag, (Immutable | Immutable_unique), + _value_kind, _mode), args, _dbg) -> mark_vars args curr (* (* CR-someday pchambart: If global mutables are allowed: *) | Prim(Lambda.Pmakeblock(_tag, Asttypes.Mutable), args, _dbg, _) when toplevel -> List.iter (mark_loop ~toplevel curr) args *) - | Prim (Pmakearray (Pfloatarray, (Immutable | Immutable_unique)), + | Prim (Pmakearray (Pfloatarray, (Immutable | Immutable_unique), _mode), args, _) -> mark_vars args curr - | Prim (Pmakearray (Pfloatarray, Mutable), args, _) -> + | Prim (Pmakearray (Pfloatarray, Mutable, _mode), args, _) -> (* CR-someday pchambart: Toplevel float arrays could always be statically allocated using an equivalent of the Initialize_symbol construction. diff --git a/middle_end/flambda/inline_and_simplify.ml b/middle_end/flambda/inline_and_simplify.ml index 7c9e55f9fb7..2076a2599b5 100644 --- a/middle_end/flambda/inline_and_simplify.ml +++ b/middle_end/flambda/inline_and_simplify.ml @@ -610,7 +610,9 @@ and simplify_set_of_closures original_env r simplify body_env r function_decl.body) in let function_decl = - Flambda.create_function_declaration ~params:function_decl.params + Flambda.create_function_declaration + ~params:function_decl.params + ~alloc_mode:function_decl.alloc_mode ~region:function_decl.region ~body ~stub:function_decl.stub ~dbg:function_decl.dbg ~inline:function_decl.inline ~specialise:function_decl.specialise ~is_a_functor:function_decl.is_a_functor @@ -672,10 +674,15 @@ and simplify_set_of_closures original_env r and simplify_apply env r ~(apply : Flambda.apply) : Flambda.t * R.t = let { - Flambda. func = lhs_of_application; args; kind = _; dbg; + Flambda. func = lhs_of_application; args; kind = _; dbg; reg_close; mode; inlined = inlined_requested; specialise = specialise_requested; probe = probe_requested; } = apply in + (* TODO: Most applications do not do local allocations in the current region, + but this is not yet tracked, so we conservatively assume they may. + Note that tail calls should always set the region used to true, because + removing the surrounding region would change their meaning. *) + let r = R.set_region_use r true in let dbg = E.add_inlined_debuginfo env ~dbg in simplify_free_variable env lhs_of_application ~f:(fun env lhs_of_application lhs_of_application_approx -> @@ -759,16 +766,16 @@ and simplify_apply env r ~(apply : Flambda.apply) : Flambda.t * R.t = if nargs = arity then simplify_full_application env r ~function_decls ~lhs_of_application ~closure_id_being_applied ~function_decl - ~value_set_of_closures ~args ~args_approxs ~dbg + ~value_set_of_closures ~args ~args_approxs ~dbg ~reg_close ~mode ~inlined_requested ~specialise_requested ~probe_requested else if nargs > arity then simplify_over_application env r ~args ~args_approxs ~function_decls ~lhs_of_application ~closure_id_being_applied - ~function_decl ~value_set_of_closures ~dbg ~inlined_requested - ~specialise_requested + ~function_decl ~value_set_of_closures ~dbg ~reg_close ~mode + ~inlined_requested ~specialise_requested else if nargs > 0 && nargs < arity then simplify_partial_application env r ~lhs_of_application - ~closure_id_being_applied ~function_decl ~args ~dbg + ~closure_id_being_applied ~function_decl ~args ~mode ~dbg ~inlined_requested ~specialise_requested else Misc.fatal_errorf "Function with arity %d when simplifying \ @@ -778,6 +785,7 @@ and simplify_apply env r ~(apply : Flambda.apply) : Flambda.t * R.t = wrap result, r | Wrong -> (* Insufficient approximation information to simplify. *) Apply ({ func = lhs_of_application; args; kind = Indirect; dbg; + reg_close; mode; inlined = inlined_requested; specialise = specialise_requested; probe = probe_requested; @@ -786,16 +794,16 @@ and simplify_apply env r ~(apply : Flambda.apply) : Flambda.t * R.t = and simplify_full_application env r ~function_decls ~lhs_of_application ~closure_id_being_applied ~function_decl ~value_set_of_closures ~args - ~args_approxs ~dbg ~inlined_requested ~specialise_requested - ~probe_requested + ~args_approxs ~dbg ~reg_close ~mode + ~inlined_requested ~specialise_requested ~probe_requested = Inlining_decision.for_call_site ~env ~r ~function_decls ~lhs_of_application ~closure_id_being_applied ~function_decl - ~value_set_of_closures ~args ~args_approxs ~dbg ~simplify + ~value_set_of_closures ~args ~args_approxs ~dbg ~reg_close ~mode ~simplify ~inlined_requested ~specialise_requested ~probe_requested and simplify_partial_application env r ~lhs_of_application - ~closure_id_being_applied ~function_decl ~args ~dbg + ~closure_id_being_applied ~function_decl ~args ~mode ~dbg ~inlined_requested ~specialise_requested = let arity = A.function_arity function_decl in @@ -831,6 +839,10 @@ and simplify_partial_application env r ~lhs_of_application Misc.Stdlib.List.map2_prefix (fun arg id' -> id', arg) args freshened_params in + let partial_mode = + List.fold_left (fun _mode (p,_) -> Parameter.alloc_mode p) + function_decl.A.alloc_mode applied_args + in let wrapper_accepting_remaining_args = let body : Flambda.t = Apply { @@ -838,6 +850,8 @@ and simplify_partial_application env r ~lhs_of_application args = Parameter.List.vars freshened_params; kind = Direct closure_id_being_applied; dbg; + reg_close = Rc_normal; + mode; inlined = Default_inlined; specialise = Default_specialise; probe = None; @@ -850,6 +864,8 @@ and simplify_partial_application env r ~lhs_of_application Flambda_utils.make_closure_declaration ~id:closure_variable ~is_classic_mode:false ~body + ~alloc_mode:partial_mode + ~region:function_decl.A.region ~params:remaining_args ~stub:true in @@ -863,8 +879,8 @@ and simplify_partial_application env r ~lhs_of_application and simplify_over_application env r ~args ~args_approxs ~function_decls ~lhs_of_application ~closure_id_being_applied ~function_decl - ~value_set_of_closures ~dbg ~inlined_requested ~specialise_requested - = + ~value_set_of_closures ~dbg ~reg_close ~mode + ~inlined_requested ~specialise_requested = let arity = A.function_arity function_decl in assert (arity < List.length args); assert (List.length args = List.length args_approxs); @@ -874,20 +890,34 @@ and simplify_over_application env r ~args ~args_approxs ~function_decls let full_app_approxs, _ = Misc.Stdlib.List.split_at arity args_approxs in + let mode' : Lambda.alloc_mode = + if function_decl.A.region then Alloc_heap else Alloc_local in let expr, r = simplify_full_application env r ~function_decls ~lhs_of_application ~closure_id_being_applied ~function_decl ~value_set_of_closures ~args:full_app_args ~args_approxs:full_app_approxs ~dbg + ~reg_close:Lambda.Rc_normal ~mode:mode' ~inlined_requested ~specialise_requested ~probe_requested:None in let func_var = Variable.create Internal_variable_names.full_apply in let expr : Flambda.t = Flambda.create_let func_var (Expr expr) (Apply { func = func_var; args = remaining_args; kind = Indirect; dbg; + reg_close = Rc_normal; mode; inlined = inlined_requested; specialise = specialise_requested; probe = None}) in let expr = Lift_code.lift_lets_expr expr ~toplevel:true in + let expr = + match mode, function_decl.A.region with + | Lambda.Alloc_heap, false -> Flambda.Region expr + | _ -> expr + in + let expr = + match reg_close with + | Lambda.Rc_close_at_apply -> Flambda.Tail expr + | Lambda.Rc_normal -> expr + in simplify (E.set_never_inline env) r expr and simplify_named env r (tree : Flambda.named) : Flambda.named * R.t = @@ -917,6 +947,11 @@ and simplify_named env r (tree : Flambda.named) : Flambda.named * R.t = end | Set_of_closures set_of_closures -> begin let backend = E.backend env in + let r = + match set_of_closures.alloc_mode with + | Alloc_local -> R.set_region_use r true + | Alloc_heap -> r + in let set_of_closures, r, first_freshening = simplify_set_of_closures env r set_of_closures in @@ -1008,6 +1043,11 @@ and simplify_named env r (tree : Flambda.named) : Flambda.named * R.t = let dbg = E.add_inlined_debuginfo env ~dbg in simplify_free_variables_named env args ~f:(fun env args args_approxs -> let tree = Flambda.Prim (prim, args, dbg) in + let r = + if Semantics_of_primitives.may_locally_allocate prim then + R.set_region_use r true + else r + in begin match prim, args, args_approxs with (* CR-someday mshinwell: Optimise [Pfield_computed]. *) | Pfield field_index, [arg], [arg_approx] -> @@ -1250,12 +1290,12 @@ and simplify env r (tree : Flambda.t) : Flambda.t * R.t = let cond, r = simplify env r cond in let body, r = simplify env r body in While (cond, body), ret r (A.value_unknown Other) - | Send { kind; meth; obj; args; dbg; } -> + | Send { kind; meth; obj; args; dbg; reg_close; mode } -> let dbg = E.add_inlined_debuginfo env ~dbg in simplify_free_variable env meth ~f:(fun env meth _meth_approx -> simplify_free_variable env obj ~f:(fun env obj _obj_approx -> simplify_free_variables env args ~f:(fun _env args _args_approx -> - Send { kind; meth; obj; args; dbg; }, + Send { kind; meth; obj; args; dbg; reg_close; mode }, ret r (A.value_unknown Other)))) | For { bound_var; from_value; to_value; direction; body; } -> simplify_free_variable env from_value ~f:(fun env from_value _approx -> @@ -1390,6 +1430,18 @@ and simplify env r (tree : Flambda.t) : Flambda.t * R.t = in let branch, r = simplify env r branch in branch, R.map_benefit r B.remove_branch) + | Region body -> + let use_outer_region = R.may_use_region r in + let r = R.set_region_use r false in + let body, r = simplify env r body in + let use_inner_region = R.may_use_region r in + let r = R.set_region_use r use_outer_region in + if use_inner_region then Region body, r + else body, r + | Tail body -> + let r = R.set_region_use r true in + let body, r = simplify env r body in + Tail body, r | Proved_unreachable -> tree, ret r A.value_bottom and simplify_list env r l = @@ -1442,7 +1494,9 @@ and duplicate_function ~env ~(set_of_closures : Flambda.set_of_closures) simplify body_env (R.create ()) function_decl.body) in let function_decl = - Flambda.create_function_declaration ~params:function_decl.params + Flambda.create_function_declaration + ~params:function_decl.params + ~alloc_mode:function_decl.alloc_mode ~region:function_decl.region ~body ~stub:function_decl.stub ~dbg:function_decl.dbg ~inline:function_decl.inline ~specialise:function_decl.specialise ~is_a_functor:function_decl.is_a_functor diff --git a/middle_end/flambda/inline_and_simplify_aux.ml b/middle_end/flambda/inline_and_simplify_aux.ml index ade1e8d3680..7ed42be4f5b 100644 --- a/middle_end/flambda/inline_and_simplify_aux.ml +++ b/middle_end/flambda/inline_and_simplify_aux.ml @@ -442,6 +442,7 @@ module Result = struct inlining_threshold : Inlining_cost.Threshold.t option; benefit : Inlining_cost.Benefit.t; num_direct_applications : int; + may_use_region : bool; } let create () = @@ -450,6 +451,7 @@ module Result = struct inlining_threshold = None; benefit = Inlining_cost.Benefit.zero; num_direct_applications = 0; + may_use_region = false; } let approx t = t.approx @@ -470,6 +472,11 @@ module Result = struct let used_static_exceptions t = t.used_static_exceptions + let set_region_use t b = + { t with may_use_region = b } + + let may_use_region t = t.may_use_region + let exit_scope_catch t i = { t with used_static_exceptions = diff --git a/middle_end/flambda/inline_and_simplify_aux.mli b/middle_end/flambda/inline_and_simplify_aux.mli index 79d84a31b82..eb464ee02da 100644 --- a/middle_end/flambda/inline_and_simplify_aux.mli +++ b/middle_end/flambda/inline_and_simplify_aux.mli @@ -296,6 +296,13 @@ module Result : sig (** Mark that the given static exception has been used. *) val use_static_exception : t -> Static_exception.t -> t + (** Mark/clear whether local allocations may be made in + the nearest enclosing region *) + val set_region_use : t -> bool -> t + + (** Whether [set_region_use _ true] has been called *) + val may_use_region : t -> bool + (** Mark that we are moving up out of the scope of a static-catch block that catches the given static exception identifier. This has the effect of removing the identifier from the [used_staticfail] set. *) diff --git a/middle_end/flambda/inlining_cost.ml b/middle_end/flambda/inlining_cost.ml index 78ac3b07b26..239cc6963e9 100644 --- a/middle_end/flambda/inlining_cost.ml +++ b/middle_end/flambda/inlining_cost.ml @@ -116,6 +116,10 @@ let lambda_smaller' lam ~than:threshold = size := !size + 2; lambda_size cond; lambda_size body | For { body; _ } -> size := !size + 4; lambda_size body + | Region body -> + size := !size + 2; lambda_size body + | Tail body -> + lambda_size body and lambda_named_size (named : Flambda.named) = if !size > threshold then raise Exit; match named with @@ -267,7 +271,7 @@ module Benefit = struct | If_then_else _ | While _ | For _ -> b := remove_branch !b | Apply _ | Send _ -> b := remove_call !b | Let _ | Let_mutable _ | Let_rec _ | Proved_unreachable | Var _ - | Static_catch _ -> () + | Region _ | Tail _ | Static_catch _ -> () let remove_code_helper_named b (named : Flambda.named) = match named with diff --git a/middle_end/flambda/inlining_decision.ml b/middle_end/flambda/inlining_decision.ml index f6341a368bb..b9ba22f21e3 100644 --- a/middle_end/flambda/inlining_decision.ml +++ b/middle_end/flambda/inlining_decision.ml @@ -43,7 +43,8 @@ let inline env r ~lhs_of_application ~(function_decl : A.function_declaration) ~(function_body : A.function_body) ~value_set_of_closures ~only_use_of_function ~original ~recursive - ~(args : Variable.t list) ~size_from_approximation ~dbg ~simplify + ~(args : Variable.t list) ~size_from_approximation ~dbg ~reg_close ~mode + ~simplify ~(inlined_requested : Lambda.inlined_attribute) ~(specialise_requested : Lambda.specialise_attribute) ~(probe_requested : Lambda.probe) @@ -201,7 +202,7 @@ let inline env r ~lhs_of_application ~r:(R.reset_benefit r) ~lhs_of_application ~closure_id_being_applied ~specialise_requested ~inlined_requested ~probe_requested - ~function_decl ~function_body ~fun_vars ~args ~dbg ~simplify + ~function_decl ~function_body ~fun_vars ~args ~dbg ~reg_close ~mode ~simplify in let num_direct_applications_seen = (R.num_direct_applications r_inlined) - (R.num_direct_applications r) @@ -311,7 +312,8 @@ let specialise env r ~lhs_of_application ~(function_decl : A.function_declaration) ~closure_id_being_applied ~(value_set_of_closures : A.value_set_of_closures) - ~args ~args_approxs ~dbg ~simplify ~original ~recursive ~self_call + ~args ~args_approxs ~dbg ~reg_close ~mode ~simplify + ~original ~recursive ~self_call ~inlining_threshold ~fun_cost ~inlined_requested ~specialise_requested ~probe_requested @@ -393,7 +395,7 @@ let specialise env r ~lhs_of_application ~probe_requested ~free_vars:value_set_of_closures.free_vars ~direct_call_surrogates:value_set_of_closures.direct_call_surrogates - ~dbg ~simplify ~inlined_requested + ~dbg ~reg_close ~mode ~simplify ~inlined_requested in match copied_function_declaration with | Some (expr, r_inlined) -> @@ -487,7 +489,7 @@ let for_call_site ~env ~r ~(function_decls : A.function_declarations) ~lhs_of_application ~closure_id_being_applied ~(function_decl : A.function_declaration) ~(value_set_of_closures : A.value_set_of_closures) - ~args ~args_approxs ~dbg ~simplify ~inlined_requested + ~args ~args_approxs ~dbg ~reg_close ~mode ~simplify ~inlined_requested ~specialise_requested ~probe_requested = if List.length args <> List.length args_approxs then begin Misc.fatal_error "Inlining_decision.for_call_site: inconsistent lengths \ @@ -514,6 +516,8 @@ let for_call_site ~env ~r ~(function_decls : A.function_declarations) args; kind = Direct closure_id_being_applied; dbg; + reg_close; + mode; inlined = inlined_requested; specialise = specialise_requested; probe = probe_requested; @@ -533,7 +537,7 @@ let for_call_site ~env ~r ~(function_decls : A.function_declarations) ~r ~fun_vars ~lhs_of_application ~closure_id_being_applied ~specialise_requested ~inlined_requested ~probe_requested - ~function_decl ~function_body ~args ~dbg ~simplify + ~function_decl ~function_body ~args ~dbg ~reg_close ~mode ~simplify in simplify env r body end else if E.never_inline env then @@ -572,7 +576,8 @@ let for_call_site ~env ~r ~(function_decls : A.function_declarations) ~r ~function_body ~lhs_of_application ~closure_id_being_applied ~specialise_requested ~probe_requested - ~inlined_requested ~function_decl ~fun_vars ~args ~dbg ~simplify + ~inlined_requested ~function_decl ~fun_vars ~args + ~dbg ~reg_close ~mode ~simplify in let env = E.note_entering_inlined env in let env = @@ -689,7 +694,8 @@ let for_call_site ~env ~r ~(function_decls : A.function_declarations) specialise env r ~function_decls ~function_decl ~lhs_of_application ~recursive ~closure_id_being_applied - ~value_set_of_closures ~args ~args_approxs ~dbg ~simplify + ~value_set_of_closures ~args ~args_approxs ~dbg ~reg_close ~mode + ~simplify ~original ~inlined_requested ~specialise_requested ~fun_cost ~self_call ~inlining_threshold ~probe_requested in @@ -723,7 +729,8 @@ let for_call_site ~env ~r ~(function_decls : A.function_declarations) ~only_use_of_function ~original ~recursive ~inlined_requested ~specialise_requested ~probe_requested ~fun_vars ~set_of_closures_origin ~args - ~size_from_approximation ~dbg ~simplify ~fun_cost ~self_call + ~size_from_approximation ~dbg ~reg_close ~mode + ~simplify ~fun_cost ~self_call ~inlining_threshold ~function_body in match inline_result with diff --git a/middle_end/flambda/inlining_decision.mli b/middle_end/flambda/inlining_decision.mli index c7c19d1578d..8b686ebe213 100644 --- a/middle_end/flambda/inlining_decision.mli +++ b/middle_end/flambda/inlining_decision.mli @@ -32,6 +32,8 @@ val for_call_site -> args:Variable.t list -> args_approxs:Simple_value_approx.t list -> dbg:Debuginfo.t + -> reg_close:Lambda.region_close + -> mode:Lambda.alloc_mode -> simplify:Inlining_decision_intf.simplify -> inlined_requested:Lambda.inlined_attribute -> specialise_requested:Lambda.specialise_attribute diff --git a/middle_end/flambda/inlining_transforms.ml b/middle_end/flambda/inlining_transforms.ml index 89bd9611f2c..923df8209e4 100644 --- a/middle_end/flambda/inlining_transforms.ml +++ b/middle_end/flambda/inlining_transforms.ml @@ -97,7 +97,7 @@ let inline_by_copying_function_body ~env ~r ~(function_decl : A.function_declaration) ~(function_body : A.function_body) ~fun_vars - ~args ~dbg ~simplify = + ~args ~dbg ~reg_close ~mode:_ ~simplify = assert (E.mem env lhs_of_application); assert (List.for_all (E.mem env) args); let r = @@ -128,6 +128,11 @@ let inline_by_copying_function_body ~env ~r else body in + let body = + match reg_close with + | Lambda.Rc_close_at_apply -> Flambda.Tail body + | Lambda.Rc_normal -> body + in let bindings_for_params_to_args = (* Bind the function's parameters to the arguments from the call site. *) let args = List.map (fun arg -> Flambda.Expr (Var arg)) args in @@ -289,6 +294,7 @@ let register_arguments ~specialised_args ~invariant_params (* Add an old parameter to [old_inside_to_new_inside]. If it appears in [old_params_to_new_outside] then also add it to the new specialised args. *) let add_param ~specialised_args ~state ~param = + let alloc_mode = Parameter.alloc_mode param in let param = Parameter.var param in let new_param = Variable.rename param in let old_inside_to_new_inside = @@ -320,7 +326,7 @@ let add_param ~specialised_args ~state ~param = { state with old_inside_to_new_inside; new_specialised_args_with_old_projections } in - state, Parameter.wrap new_param + state, Parameter.wrap new_param alloc_mode (* Add a let binding for an old fun_var, add it to the new free variables, and add it to [old_inside_to_new_inside] *) @@ -532,7 +538,8 @@ let rewrite_function ~lhs_of_application ~closure_id_being_applied in let new_function_decl = Flambda.create_function_declaration - ~params ~body + ~params ~alloc_mode:function_decl.alloc_mode ~region:function_decl.region + ~body ~stub:function_body.stub ~dbg:function_body.dbg ~inline:function_body.inline @@ -604,6 +611,8 @@ let inline_by_copying_function_declaration ~(free_vars : Flambda.specialised_to Variable.Map.t) ~(direct_call_surrogates : Closure_id.t Closure_id.Map.t) ~(dbg : Debuginfo.t) + ~(reg_close : Lambda.region_close) + ~(mode : Lambda.alloc_mode) ~(simplify : Inlining_decision_intf.simplify) = let state = empty_state in let state = @@ -662,6 +671,7 @@ let inline_by_copying_function_declaration in let apply : Flambda.apply = { func = closure_var; args; kind = Direct closure_id; dbg; + reg_close; mode; inlined = inlined_requested; specialise = Default_specialise; probe = probe_requested; } diff --git a/middle_end/flambda/inlining_transforms.mli b/middle_end/flambda/inlining_transforms.mli index fde02e87a6c..aae393ee2dd 100644 --- a/middle_end/flambda/inlining_transforms.mli +++ b/middle_end/flambda/inlining_transforms.mli @@ -77,6 +77,8 @@ val inline_by_copying_function_body -> fun_vars:Variable.Set.t -> args:Variable.t list -> dbg:Debuginfo.t + -> reg_close:Lambda.region_close + -> mode:Lambda.alloc_mode -> simplify:Inlining_decision_intf.simplify -> Flambda.t * Inline_and_simplify_aux.Result.t @@ -103,5 +105,7 @@ val inline_by_copying_function_declaration -> free_vars:Flambda.specialised_to Variable.Map.t -> direct_call_surrogates:Closure_id.t Closure_id.Map.t -> dbg:Debuginfo.t + -> reg_close:Lambda.region_close + -> mode:Lambda.alloc_mode -> simplify:Inlining_decision_intf.simplify -> (Flambda.t * Inline_and_simplify_aux.Result.t) option diff --git a/middle_end/flambda/lift_constants.ml b/middle_end/flambda/lift_constants.ml index 5718939c539..b383517b9b6 100644 --- a/middle_end/flambda/lift_constants.ml +++ b/middle_end/flambda/lift_constants.ml @@ -59,7 +59,7 @@ let assign_symbols_and_collect_constant_definitions (* [Inconstant_idents] always marks these expressions as inconstant, so we should never get here. *) assert false - | Prim (Pmakeblock (tag, _, _value_kind), fields, _) -> + | Prim (Pmakeblock (tag, _, _value_kind, _mode), fields, _) -> assign_symbol (); record_definition (AA.Block (Tag.create_exn tag, fields)) | Read_symbol_field (symbol, field) -> @@ -94,7 +94,7 @@ let assign_symbols_and_collect_constant_definitions | Prim (Pfield _, _, _) -> Misc.fatal_errorf "[Pfield] with the wrong number of arguments" Flambda.print_named named - | Prim (Pmakearray (Pfloatarray as kind, mutability), args, _) -> + | Prim (Pmakearray (Pfloatarray as kind, mutability, _mode), args, _) -> assign_symbol (); record_definition (AA.Allocated_const (Array (kind, mutability, args))) | Prim (Pduparray (kind, mutability), [arg], _) -> diff --git a/middle_end/flambda/lift_let_to_initialize_symbol.ml b/middle_end/flambda/lift_let_to_initialize_symbol.ml index c2632c0adbd..54e26279be4 100644 --- a/middle_end/flambda/lift_let_to_initialize_symbol.ml +++ b/middle_end/flambda/lift_let_to_initialize_symbol.ml @@ -81,7 +81,8 @@ let rec accumulate ~substitution ~copied_lets ~extracted_lets let extracted = let renamed = Variable.rename var in match named with - | Prim (Pmakeblock (tag, (Immutable | Immutable_unique), _value_kind), + | Prim (Pmakeblock (tag, (Immutable | Immutable_unique), + _value_kind, Alloc_heap), args, _dbg) -> let tag = Tag.create_exn tag in let args = @@ -128,7 +129,7 @@ let rec accumulate ~substitution ~copied_lets ~extracted_lets Flambda_utils.toplevel_substitution def_substitution (Let_rec (renamed_defs, Flambda_utils.name_expr ~name - (Prim (Pmakeblock (0, Immutable, None), + (Prim (Pmakeblock (0, Immutable, None, Alloc_heap), List.map fst renamed_defs, Debuginfo.none)))) in diff --git a/middle_end/flambda/parameter.ml b/middle_end/flambda/parameter.ml index 0c916dd7ae3..93607e4e384 100644 --- a/middle_end/flambda/parameter.ml +++ b/middle_end/flambda/parameter.ml @@ -23,29 +23,34 @@ open! Int_replace_polymorphic_compare type parameter = { var : Variable.t; + mode : Lambda.alloc_mode; } -let wrap var = { var } +let wrap var mode = { var; mode } let var p = p.var +let alloc_mode p = p.mode module M = Identifiable.Make (struct type t = parameter - let compare { var = var1 } { var = var2 } = + let compare { var = var1; mode = _ } { var = var2; mode = _ } = Variable.compare var1 var2 - let equal { var = var1 } { var = var2 } = + let equal { var = var1; mode = _ } { var = var2; mode = _ } = Variable.equal var1 var2 - let hash { var } = + let hash { var; mode = _ } = Variable.hash var - let print ppf { var } = - Variable.print ppf var + let print ppf { var; mode } = + let mode = match mode with + | Lambda.Alloc_heap -> "" + | Lambda.Alloc_local -> "[->L]" in + Format.fprintf ppf "%a%s" Variable.print var mode - let output o { var } = + let output o { var; mode = _ } = Variable.output o var end) @@ -60,10 +65,10 @@ module Set = struct end let rename ?current_compilation_unit p = - { var = Variable.rename ?current_compilation_unit p.var } + { var = Variable.rename ?current_compilation_unit p.var; mode = p.mode } -let map_var f { var } = { var = f var } +let map_var f { var; mode } = { var = f var; mode } module List = struct - let vars params = List.map (fun { var } -> var) params + let vars params = List.map (fun { var; mode=_ } -> var) params end diff --git a/middle_end/flambda/parameter.mli b/middle_end/flambda/parameter.mli index ceed16786ba..4687d4d0fd9 100644 --- a/middle_end/flambda/parameter.mli +++ b/middle_end/flambda/parameter.mli @@ -23,10 +23,14 @@ type t type parameter = t (** Make a parameter from a variable with default attributes *) -val wrap : Variable.t -> t +val wrap : Variable.t -> Lambda.alloc_mode -> t val var : t -> Variable.t +(** Mode of the resulting closure after partially applying + up to and including this parameter *) +val alloc_mode : t -> Lambda.alloc_mode + (** Rename the inner variable of the parameter *) val rename : ?current_compilation_unit:Compilation_unit.t diff --git a/middle_end/flambda/ref_to_variables.ml b/middle_end/flambda/ref_to_variables.ml index eb6c333b40e..e596f62738a 100644 --- a/middle_end/flambda/ref_to_variables.ml +++ b/middle_end/flambda/ref_to_variables.ml @@ -80,6 +80,10 @@ let variables_not_used_as_local_reference (tree:Flambda.t) = loop body | Static_raise (_, args) -> set := Variable.Set.union (Variable.Set.of_list args) !set + | Region body -> + loop body + | Tail body -> + loop body | Proved_unreachable | Apply _ | Send _ | Assign _ -> set := Variable.Set.union !set (Flambda.free_variables flam) in @@ -91,7 +95,7 @@ let variables_containing_ref (flam:Flambda.t) = let aux (flam : Flambda.t) = match flam with | Let { var; - defining_expr = Prim(Pmakeblock(0, Mutable, _), l, _); + defining_expr = Prim(Pmakeblock(0, Mutable, _, _), l, _); } -> map := Variable.Map.add var (List.length l) !map | _ -> () @@ -127,7 +131,7 @@ let eliminate_ref_of_expr flam = let aux (flam : Flambda.t) : Flambda.t = match flam with | Let { var; - defining_expr = Prim(Pmakeblock(0, Mutable, shape), l,_); + defining_expr = Prim(Pmakeblock(0, Mutable, shape, _mode), l,_); body } when convertible_variable var -> let shape = match shape with @@ -151,7 +155,7 @@ let eliminate_ref_of_expr flam = | Let_rec _ | Switch _ | String_switch _ | Static_raise _ | Static_catch _ | Try_with _ | If_then_else _ - | While _ | For _ | Send _ | Proved_unreachable -> + | While _ | For _ | Region _ | Tail _ | Send _ | Proved_unreachable -> flam and aux_named (named : Flambda.named) : Flambda.named = match named with diff --git a/middle_end/flambda/remove_free_vars_equal_to_args.ml b/middle_end/flambda/remove_free_vars_equal_to_args.ml index 6327d30cda1..d13a0a65edc 100644 --- a/middle_end/flambda/remove_free_vars_equal_to_args.ml +++ b/middle_end/flambda/remove_free_vars_equal_to_args.ml @@ -49,8 +49,7 @@ let rewrite_one_function_decl ~(function_decl : Flambda.function_declaration) params_for_equal_free_vars function_decl.body in - Flambda.update_function_declaration function_decl - ~params:function_decl.params ~body:body + Flambda.update_function_declaration_body function_decl ~body let rewrite_one_set_of_closures (set_of_closures : Flambda.set_of_closures) = let back_free_vars = diff --git a/middle_end/flambda/remove_unused_arguments.ml b/middle_end/flambda/remove_unused_arguments.ml index 6d3a8e5aec6..256c413e422 100644 --- a/middle_end/flambda/remove_unused_arguments.ml +++ b/middle_end/flambda/remove_unused_arguments.ml @@ -39,7 +39,9 @@ let remove_params unused (fun_decl: Flambda.function_declaration) fun_decl.body unused_params in - Flambda.create_function_declaration ~params:used_params ~body + Flambda.create_function_declaration + ~params:used_params ~alloc_mode:fun_decl.alloc_mode ~region:fun_decl.region + ~body ~stub:fun_decl.stub ~dbg:fun_decl.dbg ~inline:fun_decl.inline ~specialise:fun_decl.specialise ~is_a_functor:fun_decl.is_a_functor ~closure_origin:(Closure_origin.create (Closure_id.wrap new_fun_var)) @@ -92,13 +94,18 @@ let make_stub unused var (fun_decl : Flambda.function_declaration) args = Parameter.List.vars args; kind; dbg = fun_decl.dbg; + reg_close = Rc_normal; + mode = if fun_decl.region then Alloc_heap else Alloc_local; inlined = Default_inlined; specialise = Default_specialise; probe = None; } in let function_decl = - Flambda.create_function_declaration ~params:(List.map snd args') ~body + Flambda.create_function_declaration + ~params:(List.map snd args') + ~alloc_mode:fun_decl.alloc_mode ~region:fun_decl.region + ~body ~stub:true ~dbg:fun_decl.dbg ~inline:Default_inline ~specialise:Default_specialise ~is_a_functor:fun_decl.is_a_functor ~closure_origin:fun_decl.closure_origin diff --git a/middle_end/flambda/simple_value_approx.ml b/middle_end/flambda/simple_value_approx.ml index af7edcdd1cc..017bfc37fa7 100644 --- a/middle_end/flambda/simple_value_approx.ml +++ b/middle_end/flambda/simple_value_approx.ml @@ -87,6 +87,8 @@ and function_body = { and function_declaration = { closure_origin : Closure_origin.t; params : Parameter.t list; + alloc_mode : Lambda.alloc_mode; + region : bool; function_body : function_body option; } @@ -949,7 +951,9 @@ let function_declaration_approx ~keep_body fun_var in { function_body; params = fun_decl.params; - closure_origin = fun_decl.closure_origin; } + alloc_mode = fun_decl.alloc_mode; + region = fun_decl.region; + closure_origin = fun_decl.closure_origin; } let function_declarations_approx ~keep_body (fun_decls : Flambda.function_declarations) = diff --git a/middle_end/flambda/simple_value_approx.mli b/middle_end/flambda/simple_value_approx.mli index 693e641ff6d..1dae71f52bf 100644 --- a/middle_end/flambda/simple_value_approx.mli +++ b/middle_end/flambda/simple_value_approx.mli @@ -163,6 +163,8 @@ and function_body = private { and function_declaration = private { closure_origin : Closure_origin.t; params : Parameter.t list; + alloc_mode : Lambda.alloc_mode; + region : bool; function_body : function_body option; } diff --git a/middle_end/flambda/simplify_boxed_integer_ops.ml b/middle_end/flambda/simplify_boxed_integer_ops.ml index f1a8fab841d..a11d245e6da 100644 --- a/middle_end/flambda/simplify_boxed_integer_ops.ml +++ b/middle_end/flambda/simplify_boxed_integer_ops.ml @@ -54,12 +54,12 @@ end) : Simplify_boxed_integer_ops_intf.S with type t := I.t = struct let eval_unboxed op = S.const_int_expr expr (op n) in match p with | Pintofbint kind when equal_kind kind I.kind -> eval_unboxed I.to_int - | Pcvtbint (kind, Pint32) when equal_kind kind I.kind -> + | Pcvtbint (kind, Pint32, _) when equal_kind kind I.kind -> eval_conv A.Int32 I.to_int32 - | Pcvtbint (kind, Pint64) when equal_kind kind I.kind -> + | Pcvtbint (kind, Pint64, _) when equal_kind kind I.kind -> eval_conv A.Int64 I.to_int64 - | Pnegbint kind when equal_kind kind I.kind -> eval I.neg - | Pbbswap kind when equal_kind kind I.kind -> eval I.swap + | Pnegbint (kind,_) when equal_kind kind I.kind -> eval I.neg + | Pbbswap (kind,_) when equal_kind kind I.kind -> eval I.swap | _ -> expr, A.value_unknown Other, C.Benefit.zero let simplify_binop (p : Clambda_primitives.primitive) @@ -67,16 +67,16 @@ end) : Simplify_boxed_integer_ops_intf.S with type t := I.t = struct let eval op = S.const_boxed_int_expr expr kind (op n1 n2) in let non_zero n = (I.compare I.zero n) <> 0 in match p with - | Paddbint kind when equal_kind kind I.kind -> eval I.add - | Psubbint kind when equal_kind kind I.kind -> eval I.sub - | Pmulbint kind when equal_kind kind I.kind -> eval I.mul + | Paddbint (kind,_) when equal_kind kind I.kind -> eval I.add + | Psubbint (kind,_) when equal_kind kind I.kind -> eval I.sub + | Pmulbint (kind,_) when equal_kind kind I.kind -> eval I.mul | Pdivbint {size=kind} when equal_kind kind I.kind && non_zero n2 -> eval I.div | Pmodbint {size=kind} when equal_kind kind I.kind && non_zero n2 -> eval I.rem - | Pandbint kind when equal_kind kind I.kind -> eval I.logand - | Porbint kind when equal_kind kind I.kind -> eval I.logor - | Pxorbint kind when equal_kind kind I.kind -> eval I.logxor + | Pandbint (kind,_) when equal_kind kind I.kind -> eval I.logand + | Porbint (kind,_) when equal_kind kind I.kind -> eval I.logor + | Pxorbint (kind,_) when equal_kind kind I.kind -> eval I.logxor | Pbintcomp (kind, c) when equal_kind kind I.kind -> S.const_integer_comparison_expr expr c n1 n2 | Pcompare_bints kind when equal_kind kind I.kind -> @@ -88,10 +88,10 @@ end) : Simplify_boxed_integer_ops_intf.S with type t := I.t = struct let eval op = S.const_boxed_int_expr expr kind (op n1 n2) in let precond = 0 <= n2 && n2 < 8 * size_int in match p with - | Plslbint kind when equal_kind kind I.kind && precond -> eval I.shift_left - | Plsrbint kind when equal_kind kind I.kind && precond -> + | Plslbint (kind,_) when equal_kind kind I.kind && precond -> eval I.shift_left + | Plsrbint (kind,_) when equal_kind kind I.kind && precond -> eval I.shift_right_logical - | Pasrbint kind when equal_kind kind I.kind && precond -> eval I.shift_right + | Pasrbint (kind,_) when equal_kind kind I.kind && precond -> eval I.shift_right | _ -> expr, A.value_unknown Other, C.Benefit.zero end diff --git a/middle_end/flambda/simplify_primitives.ml b/middle_end/flambda/simplify_primitives.ml index 59bef435696..f4da41e3497 100644 --- a/middle_end/flambda/simplify_primitives.ml +++ b/middle_end/flambda/simplify_primitives.ml @@ -41,7 +41,7 @@ let phys_equal (approxs:A.t list) = let is_known_to_be_some_kind_of_int (arg:A.descr) = match arg with | Value_int _ | Value_char _ -> true - | Value_block (_, _) | Value_float _ | Value_set_of_closures _ + | Value_block _ | Value_float _ | Value_set_of_closures _ | Value_closure _ | Value_string _ | Value_float_array _ | A.Value_boxed_int _ | Value_unknown _ | Value_extern _ | Value_symbol _ | Value_unresolved _ | Value_bottom -> false @@ -108,7 +108,7 @@ let primitive (p : Clambda_primitives.primitive) (args, approxs) : Flambda.named * A.t * Inlining_cost.Benefit.t = let fpc = !Clflags.float_const_prop in match p with - | Pmakeblock(tag_int, (Immutable | Immutable_unique), shape) -> + | Pmakeblock(tag_int, (Immutable | Immutable_unique), shape, mode) -> let tag = Tag.create_exn tag_int in let shape = match shape with | None -> List.map (fun _ -> Lambda.Pgenval) args @@ -116,20 +116,20 @@ let primitive (p : Clambda_primitives.primitive) (args, approxs) in let approxs = List.map2 A.augment_with_kind approxs shape in let shape = List.map2 A.augment_kind_with_approx approxs shape in - Prim (Pmakeblock(tag_int, Lambda.Immutable, Some shape), args, dbg), + Prim (Pmakeblock(tag_int, Lambda.Immutable, Some shape, mode), args, dbg), A.value_block tag (Array.of_list approxs), C.Benefit.zero | Praise _ -> expr, A.value_bottom, C.Benefit.zero - | Pmakearray(_, _) when is_empty approxs -> - Prim (Pmakeblock(0, Lambda.Immutable, Some []), [], dbg), + | Pmakearray(_, _, mode) when is_empty approxs -> + Prim (Pmakeblock(0, Lambda.Immutable, Some [], mode), [], dbg), A.value_block (Tag.create_exn 0) [||], C.Benefit.zero (* CR mshinwell: Work out what to do here with [Pmakefloatblock] *) - | Pmakearray (Pfloatarray, Mutable) -> + | Pmakearray (Pfloatarray, Mutable, _) -> let approx = A.value_mutable_float_array ~size:(List.length args) in expr, approx, C.Benefit.zero - | Pmakearray (Pfloatarray, (Immutable | Immutable_unique)) -> + | Pmakearray (Pfloatarray, (Immutable | Immutable_unique), _) -> let approx = A.value_immutable_float_array (Array.of_list approxs) in @@ -174,11 +174,11 @@ let primitive (p : Clambda_primitives.primitive) (args, approxs) | Pbswap16 -> S.const_int_expr expr (S.swap16 x) | Pisint -> S.const_bool_expr expr true | Poffsetint y -> S.const_int_expr expr (x + y) - | Pfloatofint when fpc -> S.const_float_expr expr (float_of_int x) - | Pbintofint Pnativeint -> + | Pfloatofint _ when fpc -> S.const_float_expr expr (float_of_int x) + | Pbintofint (Pnativeint,_) -> S.const_boxed_int_expr expr Nativeint (Nativeint.of_int x) - | Pbintofint Pint32 -> S.const_boxed_int_expr expr Int32 (Int32.of_int x) - | Pbintofint Pint64 -> S.const_boxed_int_expr expr Int64 (Int64.of_int x) + | Pbintofint (Pint32,_) -> S.const_boxed_int_expr expr Int32 (Int32.of_int x) + | Pbintofint (Pint64,_) -> S.const_boxed_int_expr expr Int64 (Int64.of_int x) | _ -> expr, A.value_unknown Other, C.Benefit.zero end | [Value_int x; Value_int y] -> @@ -209,16 +209,16 @@ let primitive (p : Clambda_primitives.primitive) (args, approxs) | [Value_float (Some x)] when fpc -> begin match p with | Pintoffloat -> S.const_int_expr expr (int_of_float x) - | Pnegfloat -> S.const_float_expr expr (-. x) - | Pabsfloat -> S.const_float_expr expr (abs_float x) + | Pnegfloat _ -> S.const_float_expr expr (-. x) + | Pabsfloat _ -> S.const_float_expr expr (abs_float x) | _ -> expr, A.value_unknown Other, C.Benefit.zero end | [Value_float (Some n1); Value_float (Some n2)] when fpc -> begin match p with - | Paddfloat -> S.const_float_expr expr (n1 +. n2) - | Psubfloat -> S.const_float_expr expr (n1 -. n2) - | Pmulfloat -> S.const_float_expr expr (n1 *. n2) - | Pdivfloat -> S.const_float_expr expr (n1 /. n2) + | Paddfloat _ -> S.const_float_expr expr (n1 +. n2) + | Psubfloat _ -> S.const_float_expr expr (n1 -. n2) + | Pmulfloat _ -> S.const_float_expr expr (n1 *. n2) + | Pdivfloat _ -> S.const_float_expr expr (n1 /. n2) | Pfloatcomp c -> S.const_float_comparison_expr expr c n1 n2 | Pcompare_floats -> S.const_int_expr expr (Float.compare n1 n2) | _ -> expr, A.value_unknown Other, C.Benefit.zero @@ -278,7 +278,7 @@ let primitive (p : Clambda_primitives.primitive) (args, approxs) | [Value_float_array { size; contents }] -> begin match p with | Parraylength _ -> S.const_int_expr expr size - | Pfloatfield i -> + | Pfloatfield (i,_) -> begin match contents with | A.Contents a when i >= 0 && i < size -> begin match A.check_approx_for_float a.(i) with diff --git a/middle_end/flambda/un_anf.ml b/middle_end/flambda/un_anf.ml index 3438af3c558..e6d1e75e4cc 100644 --- a/middle_end/flambda/un_anf.ml +++ b/middle_end/flambda/un_anf.ml @@ -46,6 +46,7 @@ let ignore_ulambda_list (_ : Clambda.ulambda list) = () let ignore_uphantom_defining_expr_option (_ : Clambda.uphantom_defining_expr option) = () let ignore_function_label (_ : Clambda.function_label) = () +let ignore_apply_kind (_ : Clambda.apply_kind) = () let ignore_debuginfo (_ : Debuginfo.t) = () let ignore_probe (_ : Lambda.probe) = () let ignore_int (_ : int) = () @@ -66,11 +67,12 @@ let ignore_value_kind (_ : Lambda.value_kind) = () let closure_environment_var (ufunction:Clambda.ufunction) = (* The argument after the arity is the environment *) - if List.length ufunction.params = ufunction.arity + 1 then - let (env_var, _) = List.nth ufunction.params ufunction.arity in + match ufunction.arity with + | Curried _, n when List.length ufunction.params = n + 1 -> + let (env_var, _) = List.nth ufunction.params n in assert (VP.name env_var = "env"); Some env_var - else + | _ -> (* closed function, no environment *) None @@ -132,25 +134,26 @@ let make_var_info (clam : Clambda.ulambda) : var_info = of the closures will be traversed when this function is called from [Flambda_to_clambda.to_clambda_closed_set_of_closures].) *) ignore_uconstant const - | Udirect_apply (label, args, _probe, dbg) -> + | Udirect_apply (label, args, _probe, info, dbg) -> ignore_function_label label; List.iter (loop ~depth) args; + ignore_apply_kind info; ignore_debuginfo dbg - | Ugeneric_apply (func, args, dbg) -> + | Ugeneric_apply (func, args, info, dbg) -> loop ~depth func; List.iter (loop ~depth) args; + ignore_apply_kind info; ignore_debuginfo dbg | Uclosure (functions, captured_variables) -> List.iter (loop ~depth) captured_variables; List.iter (fun ( - { Clambda. label; arity; params; return; body; dbg; env; } as clos) -> + { Clambda. label; arity=_; params; return; body; dbg; env; mode=_} as clos) -> (match closure_environment_var clos with | None -> () | Some env_var -> environment_vars := V.Set.add (VP.var env_var) !environment_vars); ignore_function_label label; - ignore_int arity; ignore_params_with_value_kind params; ignore_value_kind return; loop ~depth:(depth + 1) body; @@ -224,14 +227,19 @@ let make_var_info (clam : Clambda.ulambda) : var_info = | Uassign (var, expr) -> add_assignment t var; loop ~depth expr - | Usend (meth_kind, e1, e2, args, dbg) -> + | Usend (meth_kind, e1, e2, args, info, dbg) -> ignore_meth_kind meth_kind; loop ~depth e1; loop ~depth e2; List.iter (loop ~depth) args; + ignore_apply_kind info; ignore_debuginfo dbg | Uunreachable -> () + | Uregion e -> + loop ~depth e + | Utail e -> + loop ~depth e in loop ~depth:0 clam; let linear_let_bound_vars, used_let_bound_vars, assigned = @@ -298,23 +306,24 @@ let let_bound_vars_that_can_be_moved var_info (clam : Clambda.ulambda) = end | Uconst const -> ignore_uconstant const - | Udirect_apply (label, args, probe, dbg) -> + | Udirect_apply (label, args, probe, info, dbg) -> ignore_function_label label; examine_argument_list args; (* We don't currently traverse [args]; they should all be variables anyway. If this is added in the future, take care to traverse [args] following the evaluation order. *) ignore_probe probe; + ignore_apply_kind info; ignore_debuginfo dbg - | Ugeneric_apply (func, args, dbg) -> + | Ugeneric_apply (func, args, info, dbg) -> examine_argument_list (args @ [func]); + ignore_apply_kind info; ignore_debuginfo dbg | Uclosure (functions, captured_variables) -> ignore_ulambda_list captured_variables; (* Start a new let stack for speed. *) - List.iter (fun {Clambda. label; arity; params; return; body; dbg; env} -> + List.iter (fun {Clambda. label; arity=_; params; return; body; dbg; env; mode=_} -> ignore_function_label label; - ignore_int arity; ignore_params_with_value_kind params; ignore_value_kind return; let_stack := []; @@ -440,15 +449,22 @@ let let_bound_vars_that_can_be_moved var_info (clam : Clambda.ulambda) = ignore_var var; ignore_ulambda expr; let_stack := [] - | Usend (meth_kind, e1, e2, args, dbg) -> + | Usend (meth_kind, e1, e2, args, info, dbg) -> ignore_meth_kind meth_kind; ignore_ulambda e1; ignore_ulambda e2; ignore_ulambda_list args; let_stack := []; + ignore_apply_kind info; ignore_debuginfo dbg | Uunreachable -> let_stack := [] + | Uregion e -> + let_stack := []; + loop e + | Utail e -> + let_stack := []; + loop e in loop clam; !can_move @@ -470,13 +486,13 @@ let rec substitute_let_moveable is_let_moveable env (clam : Clambda.ulambda) V.print var end | Uconst _ -> clam - | Udirect_apply (label, args, probe, dbg) -> + | Udirect_apply (label, args, probe, kind, dbg) -> let args = substitute_let_moveable_list is_let_moveable env args in - Udirect_apply (label, args, probe, dbg) - | Ugeneric_apply (func, args, dbg) -> + Udirect_apply (label, args, probe, kind, dbg) + | Ugeneric_apply (func, args, kind, dbg) -> let func = substitute_let_moveable is_let_moveable env func in let args = substitute_let_moveable_list is_let_moveable env args in - Ugeneric_apply (func, args, dbg) + Ugeneric_apply (func, args, kind, dbg) | Uclosure (functions, variables_bound_by_the_closure) -> let functions = List.map (fun (ufunction : Clambda.ufunction) -> @@ -585,13 +601,19 @@ let rec substitute_let_moveable is_let_moveable env (clam : Clambda.ulambda) | Uassign (var, expr) -> let expr = substitute_let_moveable is_let_moveable env expr in Uassign (var, expr) - | Usend (kind, e1, e2, args, dbg) -> + | Usend (kind, e1, e2, args, pos, dbg) -> let e1 = substitute_let_moveable is_let_moveable env e1 in let e2 = substitute_let_moveable is_let_moveable env e2 in let args = substitute_let_moveable_list is_let_moveable env args in - Usend (kind, e1, e2, args, dbg) + Usend (kind, e1, e2, args, pos, dbg) | Uunreachable -> Uunreachable + | Uregion e -> + let e = substitute_let_moveable is_let_moveable env e in + Uregion (e) + | Utail e -> + let e = substitute_let_moveable is_let_moveable env e in + Utail (e) and substitute_let_moveable_list is_let_moveable env clams = List.map (substitute_let_moveable is_let_moveable env) clams @@ -664,13 +686,13 @@ let rec un_anf_and_moveable var_info env (clam : Clambda.ulambda) | Uconst _ -> (* Constant closures are rewritten separately. *) clam, Constant - | Udirect_apply (label, args, probe, dbg) -> + | Udirect_apply (label, args, probe, kind, dbg) -> let args = un_anf_list var_info env args in - Udirect_apply (label, args, probe, dbg), Fixed - | Ugeneric_apply (func, args, dbg) -> + Udirect_apply (label, args, probe, kind, dbg), Fixed + | Ugeneric_apply (func, args, kind, dbg) -> let func = un_anf var_info env func in let args = un_anf_list var_info env args in - Ugeneric_apply (func, args, dbg), Fixed + Ugeneric_apply (func, args, kind, dbg), Fixed | Uclosure (functions, variables_bound_by_the_closure) -> let functions = List.map (fun (ufunction : Clambda.ufunction) -> @@ -809,13 +831,19 @@ let rec un_anf_and_moveable var_info env (clam : Clambda.ulambda) | Uassign (var, expr) -> let expr = un_anf var_info env expr in Uassign (var, expr), Fixed - | Usend (kind, e1, e2, args, dbg) -> + | Usend (kind, e1, e2, args, pos, dbg) -> let e1 = un_anf var_info env e1 in let e2 = un_anf var_info env e2 in let args = un_anf_list var_info env args in - Usend (kind, e1, e2, args, dbg), Fixed + Usend (kind, e1, e2, args, pos, dbg), Fixed | Uunreachable -> Uunreachable, Fixed + | Uregion e -> + let e = un_anf var_info env e in + Uregion e, Fixed + | Utail e -> + let e = un_anf var_info env e in + Utail e, Fixed and un_anf var_info env clam : Clambda.ulambda = let clam, _moveable = un_anf_and_moveable var_info env clam in diff --git a/middle_end/printclambda.ml b/middle_end/printclambda.ml index 201608467cd..d39f3065f88 100644 --- a/middle_end/printclambda.ml +++ b/middle_end/printclambda.ml @@ -75,7 +75,7 @@ and one_fun ppf f = ) in fprintf ppf "(fun@ %s%s@ %d@ @[<2>%a@]@ @[<2>%a@])" - f.label (value_kind f.return) f.arity idents f.params lam f.body + f.label (value_kind f.return) (snd f.arity) idents f.params lam f.body and phantom_defining_expr ppf = function | Uphantom_const const -> uconstant ppf const @@ -103,11 +103,17 @@ and uconstant ppf = function | Uconst_ref (s, None) -> fprintf ppf "%S"s | Uconst_int i -> fprintf ppf "%i" i +and apply_kind ppf : apply_kind -> unit = function + | Rc_normal, Alloc_heap -> fprintf ppf "apply" + | Rc_close_at_apply, Alloc_heap -> fprintf ppf "apply[end_region]" + | Rc_normal, Alloc_local -> fprintf ppf "apply[L]" + | Rc_close_at_apply, Alloc_local -> fprintf ppf "apply[end_region][L]" + and lam ppf = function | Uvar id -> V.print ppf id | Uconst c -> uconstant ppf c - | Udirect_apply(f, largs, probe, _) -> + | Udirect_apply(f, largs, probe, kind, _) -> let lams ppf largs = List.iter (fun l -> fprintf ppf "@ %a" lam l) largs in let pr ppf (probe : Lambda.probe) = @@ -115,11 +121,11 @@ and lam ppf = function | None -> () | Some {name} -> fprintf ppf " (probe %s)" name in - fprintf ppf "@[<2>(apply*@ %s %a%a)@]" f lams largs pr probe - | Ugeneric_apply(lfun, largs, _) -> + fprintf ppf "@[<2>(%a*@ %s %a%a)@]" apply_kind kind f lams largs pr probe + | Ugeneric_apply(lfun, largs, kind, _) -> let lams ppf largs = List.iter (fun l -> fprintf ppf "@ %a" lam l) largs in - fprintf ppf "@[<2>(apply@ %a%a)@]" lam lfun lams largs + fprintf ppf "@[<2>(%a@ %a%a)@]" apply_kind kind lam lfun lams largs | Uclosure(clos, fv) -> let funs ppf = List.iter (fprintf ppf "@ @[<2>%a@]" one_fun) in @@ -237,16 +243,26 @@ and lam ppf = function lam hi lam body | Uassign(id, expr) -> fprintf ppf "@[<2>(assign@ %a@ %a)@]" V.print id lam expr - | Usend (k, met, obj, largs, _) -> + | Usend (k, met, obj, largs, (pos,_) , _) -> + let form = + match pos with + | Rc_normal -> "send" + | Rc_close_at_apply -> "send[end_region]" + in let args ppf largs = List.iter (fun l -> fprintf ppf "@ %a" lam l) largs in let kind = if k = Lambda.Self then "self" else if k = Lambda.Cached then "cache" else "" in - fprintf ppf "@[<2>(send%s@ %a@ %a%a)@]" kind lam obj lam met args largs + fprintf ppf "@[<2>(%s%s@ %a@ %a%a)@]" + form kind lam obj lam met args largs | Uunreachable -> fprintf ppf "unreachable" + | Uregion e -> + fprintf ppf "@[<2>(region@ %a)@]" lam e + | Utail e -> + fprintf ppf "@[<2>(tail@ %a)@]" lam e and sequence ppf ulam = match ulam with | Usequence(l1, l2) -> @@ -258,9 +274,14 @@ let clambda ppf ulam = let rec approx ppf = function - Value_closure(fundesc, a) -> - Format.fprintf ppf "@[<2>function %s@ arity %i" - fundesc.fun_label fundesc.fun_arity; + Value_closure(_, fundesc, a) -> + Format.fprintf ppf "@[<2>function %s" + fundesc.fun_label; + begin match fundesc.fun_arity with + | Tupled, n -> Format.fprintf ppf "@ arity -%i" n + | Curried {nlocal=0}, n -> Format.fprintf ppf "@ arity %i" n + | Curried {nlocal=k}, n -> Format.fprintf ppf "@ arity %i(%i L)" n k + end; if fundesc.fun_closed then begin Format.fprintf ppf "@ (closed)" end; @@ -268,7 +289,7 @@ let rec approx ppf = function Format.fprintf ppf "@ (inline)" end; Format.fprintf ppf "@ -> @ %a@]" approx a - | Value_tuple a -> + | Value_tuple (_,a) -> let tuple ppf a = for i = 0 to Array.length a - 1 do if i > 0 then Format.fprintf ppf ";@ "; diff --git a/middle_end/printclambda_primitives.ml b/middle_end/printclambda_primitives.ml index 10bbc748b25..baea2de9828 100644 --- a/middle_end/printclambda_primitives.ml +++ b/middle_end/printclambda_primitives.ml @@ -26,8 +26,12 @@ let boxed_integer_mark name = function | Lambda.Pint32 -> Printf.sprintf "Int32.%s" name | Lambda.Pint64 -> Printf.sprintf "Int64.%s" name -let print_boxed_integer name ppf bi = - fprintf ppf "%s" (boxed_integer_mark name bi);; +let alloc_kind = function + | Lambda.Alloc_heap -> "" + | Lambda.Alloc_local -> "[L]" + +let print_boxed_integer name ppf bi m = + fprintf ppf "%s%s" (boxed_integer_mark name bi) (alloc_kind m);; let array_kind array_kind = let open Lambda in @@ -56,12 +60,18 @@ let primitive ppf (prim:Clambda_primitives.primitive) = match prim with | Pread_symbol sym -> fprintf ppf "read_symbol %s" sym - | Pmakeblock(tag, Immutable, shape) -> - fprintf ppf "makeblock %i%a" tag Printlambda.block_shape shape - | Pmakeblock(tag, Immutable_unique, shape) -> - fprintf ppf "makeblock_unique %i%a" tag Printlambda.block_shape shape - | Pmakeblock(tag, Mutable, shape) -> - fprintf ppf "makemutable %i%a" tag Printlambda.block_shape shape + | Pmakeblock(tag, mut, shape, mode) -> + let mode = match mode with + | Alloc_heap -> "" + | Alloc_local -> "local" + in + let mut = match mut with + | Immutable -> "block" + | Immutable_unique -> "block_unique" + | Mutable -> "mutable" + in + let name = "make" ^ mode ^ mut in + fprintf ppf "%s %i%a" name tag Printlambda.block_shape shape | Pfield n -> fprintf ppf "field %i" n | Pfield_computed -> fprintf ppf "field_computed" | Psetfield(n, ptr, init) -> @@ -92,7 +102,8 @@ let primitive ppf (prim:Clambda_primitives.primitive) = | Local_assignment -> "(local)" in fprintf ppf "setfield_%s%s_computed" instr init - | Pfloatfield n -> fprintf ppf "floatfield %i" n + | Pfloatfield (n, Alloc_heap) -> fprintf ppf "floatfield %i" n + | Pfloatfield (n, Alloc_local) -> fprintf ppf "floatfieldlocal %i" n | Psetfloatfield (n, init) -> let init = match init with @@ -130,13 +141,13 @@ let primitive ppf (prim:Clambda_primitives.primitive) = | Poffsetint n -> fprintf ppf "%i+" n | Poffsetref n -> fprintf ppf "+:=%i"n | Pintoffloat -> fprintf ppf "int_of_float" - | Pfloatofint -> fprintf ppf "float_of_int" - | Pnegfloat -> fprintf ppf "~." - | Pabsfloat -> fprintf ppf "abs." - | Paddfloat -> fprintf ppf "+." - | Psubfloat -> fprintf ppf "-." - | Pmulfloat -> fprintf ppf "*." - | Pdivfloat -> fprintf ppf "/." + | Pfloatofint m -> fprintf ppf "float_of_int%s" (alloc_kind m) + | Pnegfloat m -> fprintf ppf "~.%s" (alloc_kind m) + | Pabsfloat m -> fprintf ppf "abs.%s" (alloc_kind m) + | Paddfloat m -> fprintf ppf "+.%s" (alloc_kind m) + | Psubfloat m -> fprintf ppf "-.%s" (alloc_kind m) + | Pmulfloat m -> fprintf ppf "*.%s" (alloc_kind m) + | Pdivfloat m -> fprintf ppf "/.%s" (alloc_kind m) | Pfloatcomp(cmp) -> Printlambda.float_comparison ppf cmp | Pstringlength -> fprintf ppf "string.length" | Pstringrefu -> fprintf ppf "string.unsafe_get" @@ -148,10 +159,14 @@ let primitive ppf (prim:Clambda_primitives.primitive) = | Pbytessets -> fprintf ppf "bytes.set" | Parraylength k -> fprintf ppf "array.length[%s]" (array_kind k) - | Pmakearray (k, Mutable) -> fprintf ppf "makearray[%s]" (array_kind k) - | Pmakearray (k, Immutable) -> fprintf ppf "makearray_imm[%s]" (array_kind k) - | Pmakearray (k, Immutable_unique) -> - fprintf ppf "makearray_unique[%s]" (array_kind k) + | Pmakearray (k, mut, mode) -> + let mode = match mode with Alloc_local -> "local" | Alloc_heap -> "" in + let mut = match mut with + | Mutable -> "" + | Immutable -> "_imm" + | Immutable_unique -> "_unique" + in + fprintf ppf "make%sarray%s[%s]" mut mode (array_kind k) | Pduparray (k, Mutable) -> fprintf ppf "duparray[%s]" (array_kind k) | Pduparray (k, Immutable) -> fprintf ppf "duparray_imm[%s]" (array_kind k) | Pduparray (k, Immutable_unique) -> @@ -162,53 +177,56 @@ let primitive ppf (prim:Clambda_primitives.primitive) = | Parraysets k -> fprintf ppf "array.set[%s]" (array_kind k) | Pisint -> fprintf ppf "isint" | Pisout -> fprintf ppf "isout" - | Pbintofint bi -> print_boxed_integer "of_int" ppf bi - | Pintofbint bi -> print_boxed_integer "to_int" ppf bi - | Pcvtbint (bi1, bi2) -> - fprintf ppf "%s_of_%s" (boxed_integer_name bi2) (boxed_integer_name bi1) - | Pnegbint bi -> print_boxed_integer "neg" ppf bi - | Paddbint bi -> print_boxed_integer "add" ppf bi - | Psubbint bi -> print_boxed_integer "sub" ppf bi - | Pmulbint bi -> print_boxed_integer "mul" ppf bi - | Pdivbint { size = bi; is_safe = Safe } -> - print_boxed_integer "div" ppf bi - | Pdivbint { size = bi; is_safe = Unsafe } -> - print_boxed_integer "div_unsafe" ppf bi - | Pmodbint { size = bi; is_safe = Safe } -> - print_boxed_integer "mod" ppf bi - | Pmodbint { size = bi; is_safe = Unsafe } -> - print_boxed_integer "mod_unsafe" ppf bi - | Pandbint bi -> print_boxed_integer "and" ppf bi - | Porbint bi -> print_boxed_integer "or" ppf bi - | Pxorbint bi -> print_boxed_integer "xor" ppf bi - | Plslbint bi -> print_boxed_integer "lsl" ppf bi - | Plsrbint bi -> print_boxed_integer "lsr" ppf bi - | Pasrbint bi -> print_boxed_integer "asr" ppf bi - | Pbintcomp(bi, Ceq) -> print_boxed_integer "==" ppf bi - | Pbintcomp(bi, Cne) -> print_boxed_integer "!=" ppf bi - | Pbintcomp(bi, Clt) -> print_boxed_integer "<" ppf bi - | Pbintcomp(bi, Cgt) -> print_boxed_integer ">" ppf bi - | Pbintcomp(bi, Cle) -> print_boxed_integer "<=" ppf bi - | Pbintcomp(bi, Cge) -> print_boxed_integer ">=" ppf bi + | Pbintofint (bi,m) -> print_boxed_integer "of_int" ppf bi m + | Pintofbint bi -> print_boxed_integer "to_int" ppf bi Alloc_heap + | Pcvtbint (bi1, bi2, m) -> + fprintf ppf "%s_of_%s%s" (boxed_integer_name bi2) (boxed_integer_name bi1) + (alloc_kind m) + | Pnegbint (bi,m) -> print_boxed_integer "neg" ppf bi m + | Paddbint (bi,m) -> print_boxed_integer "add" ppf bi m + | Psubbint (bi,m) -> print_boxed_integer "sub" ppf bi m + | Pmulbint (bi,m) -> print_boxed_integer "mul" ppf bi m + | Pdivbint { size = bi; is_safe = Safe; mode } -> + print_boxed_integer "div" ppf bi mode + | Pdivbint { size = bi; is_safe = Unsafe; mode } -> + print_boxed_integer "div_unsafe" ppf bi mode + | Pmodbint { size = bi; is_safe = Safe; mode } -> + print_boxed_integer "mod" ppf bi mode + | Pmodbint { size = bi; is_safe = Unsafe; mode } -> + print_boxed_integer "mod_unsafe" ppf bi mode + | Pandbint (bi,m) -> print_boxed_integer "and" ppf bi m + | Porbint (bi,m) -> print_boxed_integer "or" ppf bi m + | Pxorbint (bi,m) -> print_boxed_integer "xor" ppf bi m + | Plslbint (bi,m) -> print_boxed_integer "lsl" ppf bi m + | Plsrbint (bi,m) -> print_boxed_integer "lsr" ppf bi m + | Pasrbint (bi,m) -> print_boxed_integer "asr" ppf bi m + | Pbintcomp(bi, Ceq) -> print_boxed_integer "==" ppf bi Alloc_heap + | Pbintcomp(bi, Cne) -> print_boxed_integer "!=" ppf bi Alloc_heap + | Pbintcomp(bi, Clt) -> print_boxed_integer "<" ppf bi Alloc_heap + | Pbintcomp(bi, Cgt) -> print_boxed_integer ">" ppf bi Alloc_heap + | Pbintcomp(bi, Cle) -> print_boxed_integer "<=" ppf bi Alloc_heap + | Pbintcomp(bi, Cge) -> print_boxed_integer ">=" ppf bi Alloc_heap | Pbigarrayref(unsafe, _n, kind, layout) -> Printlambda.print_bigarray "get" unsafe kind ppf layout | Pbigarrayset(unsafe, _n, kind, layout) -> Printlambda.print_bigarray "set" unsafe kind ppf layout | Pbigarraydim(n) -> fprintf ppf "Bigarray.dim_%i" n - | Pstring_load(size, safety) -> - fprintf ppf "string.%sget%s" (access_safety safety) (access_size size) - | Pbytes_load(size, safety) -> - fprintf ppf "bytes.%sget%s" (access_safety safety) (access_size size) + | Pstring_load(size, safety, mode) -> + fprintf ppf "string.%sget%s%s" (access_safety safety) (access_size size) + (alloc_kind mode) + | Pbytes_load(size, safety, mode) -> + fprintf ppf "bytes.%sget%s%s" (access_safety safety) (access_size size) + (alloc_kind mode) | Pbytes_set(size, safety) -> fprintf ppf "bytes.%sset%s" (access_safety safety) (access_size size) - | Pbigstring_load(size, safety) -> - fprintf ppf "bigarray.array1.%sget%s" - (access_safety safety) (access_size size) + | Pbigstring_load(size, safety, mode) -> + fprintf ppf "bigarray.array1.%sget%s%s" + (access_safety safety) (access_size size) (alloc_kind mode) | Pbigstring_set(size, safety) -> fprintf ppf "bigarray.array1.%sset%s" (access_safety safety) (access_size size) | Pbswap16 -> fprintf ppf "bswap16" - | Pbbswap(bi) -> print_boxed_integer "bswap" ppf bi + | Pbbswap(bi,m) -> print_boxed_integer "bswap" ppf bi m | Pint_as_pointer -> fprintf ppf "int_as_pointer" | Popaque -> fprintf ppf "opaque" | Pprobe_is_enabled {name} -> fprintf ppf "probe_is_enabled[%s]" name diff --git a/middle_end/semantics_of_primitives.ml b/middle_end/semantics_of_primitives.ml index c22b74de438..50baa54dd58 100644 --- a/middle_end/semantics_of_primitives.ml +++ b/middle_end/semantics_of_primitives.ml @@ -19,11 +19,19 @@ type effects = No_effects | Only_generative_effects | Arbitrary_effects type coeffects = No_coeffects | Has_coeffects +let coeffects_of : Lambda.alloc_mode -> coeffects = function + | Alloc_heap -> + No_coeffects + | Alloc_local -> + (* Ensure that local allocations are not reordered wrt. regions *) + Has_coeffects + let for_primitive (prim : Clambda_primitives.primitive) = match prim with - | Pmakeblock _ - | Pmakearray (_, Mutable) -> Only_generative_effects, No_coeffects - | Pmakearray (_, (Immutable | Immutable_unique)) -> No_effects, No_coeffects + | Pmakeblock (_, _, _, m) + | Pmakearray (_, Mutable, m) -> Only_generative_effects, coeffects_of m + | Pmakearray (_, (Immutable | Immutable_unique), m) -> + No_effects, coeffects_of m | Pduparray (_, (Immutable | Immutable_unique)) -> No_effects, No_coeffects (* Pduparray (_, Immutable) is allowed only on immutable arrays. *) @@ -63,33 +71,33 @@ let for_primitive (prim : Clambda_primitives.primitive) = | Poffsetint _ -> No_effects, No_coeffects | Poffsetref _ -> Arbitrary_effects, Has_coeffects | Pintoffloat - | Pfloatofint - | Pnegfloat - | Pabsfloat - | Paddfloat - | Psubfloat - | Pmulfloat - | Pdivfloat | Pfloatcomp _ -> No_effects, No_coeffects + | Pfloatofint m + | Pnegfloat m + | Pabsfloat m + | Paddfloat m + | Psubfloat m + | Pmulfloat m + | Pdivfloat m -> No_effects, coeffects_of m | Pstringlength | Pbyteslength | Parraylength _ -> No_effects, Has_coeffects (* That old chestnut: [Obj.truncate]. *) | Pisint | Pisout - | Pbintofint _ | Pintofbint _ - | Pcvtbint _ - | Pnegbint _ - | Paddbint _ - | Psubbint _ - | Pmulbint _ - | Pandbint _ - | Porbint _ - | Pxorbint _ - | Plslbint _ - | Plsrbint _ - | Pasrbint _ | Pbintcomp _ -> No_effects, No_coeffects + | Pbintofint (_,m) + | Pcvtbint (_,_,m) + | Pnegbint (_,m) + | Paddbint (_,m) + | Psubbint (_,m) + | Pmulbint (_,m) + | Pandbint (_,m) + | Porbint (_,m) + | Pxorbint (_,m) + | Plslbint (_,m) + | Plsrbint (_,m) + | Pasrbint (_,m) -> No_effects, coeffects_of m | Pbigarraydim _ -> No_effects, Has_coeffects (* Some people resize bigarrays in place. *) | Pread_symbol _ @@ -99,18 +107,18 @@ let for_primitive (prim : Clambda_primitives.primitive) = | Parrayrefu _ | Pstringrefu | Pbytesrefu - | Pstring_load (_, Unsafe) - | Pbytes_load (_, Unsafe) + | Pstring_load (_, Unsafe, _) + | Pbytes_load (_, Unsafe, _) | Pbigarrayref (true, _, _, _) - | Pbigstring_load (_, Unsafe) -> + | Pbigstring_load (_, Unsafe, _) -> No_effects, Has_coeffects | Parrayrefs _ | Pstringrefs | Pbytesrefs - | Pstring_load (_, Safe) - | Pbytes_load (_, Safe) + | Pstring_load (_, Safe, _) + | Pbytes_load (_, Safe, _) | Pbigarrayref (false, _, _, _) - | Pbigstring_load (_, Safe) -> + | Pbigstring_load (_, Safe, _) -> (* May trigger a bounds check exception. *) Arbitrary_effects, Has_coeffects | Psetfield _ @@ -126,8 +134,8 @@ let for_primitive (prim : Clambda_primitives.primitive) = (* Whether or not some of these are "unsafe" is irrelevant; they always have an effect. *) Arbitrary_effects, No_coeffects - | Pbswap16 - | Pbbswap _ -> No_effects, No_coeffects + | Pbswap16 -> No_effects, No_coeffects + | Pbbswap (_,m) -> No_effects, coeffects_of m | Pint_as_pointer -> No_effects, No_coeffects | Popaque -> Arbitrary_effects, Has_coeffects | Psequand @@ -141,16 +149,120 @@ type return_type = let return_type_of_primitive (prim:Clambda_primitives.primitive) = match prim with - | Pfloatofint - | Pnegfloat - | Pabsfloat - | Paddfloat - | Psubfloat - | Pmulfloat - | Pdivfloat + | Pfloatofint _ + | Pnegfloat _ + | Pabsfloat _ + | Paddfloat _ + | Psubfloat _ + | Pmulfloat _ + | Pdivfloat _ | Pfloatfield _ | Parrayrefu Pfloatarray | Parrayrefs Pfloatarray -> Float | _ -> Other + +let is_local_alloc = function + | Lambda.Alloc_local -> true + | Lambda.Alloc_heap -> false + +let may_locally_allocate (prim:Clambda_primitives.primitive) : bool = + match prim with + | Pmakeblock (_, _, _, m) + | Pmakearray (_, _, m) -> is_local_alloc m + | Pduparray (_, _) + | Pduprecord (_,_) -> false + | Pccall { prim_name = + ( "caml_format_float" | "caml_format_int" | "caml_int32_format" + | "caml_nativeint_format" | "caml_int64_format" ) } -> false + | Pccall _ -> + (* TODO: Track which C calls may locally allocate more precisely *) + true + | Praise _ -> false + | Pnot + | Pnegint + | Paddint + | Psubint + | Pmulint + | Pandint + | Pdivint _ + | Pmodint _ + | Porint + | Pxorint + | Plslint + | Plsrint + | Pasrint + | Pintcomp _ -> false + | Pcompare_ints | Pcompare_floats | Pcompare_bints _ + -> false + | Poffsetint _ -> false + | Poffsetref _ -> false + | Pintoffloat + | Pfloatcomp _ -> false + | Pfloatofint m + | Pnegfloat m + | Pabsfloat m + | Paddfloat m + | Psubfloat m + | Pmulfloat m + | Pdivfloat m -> is_local_alloc m + | Pstringlength | Pbyteslength + | Parraylength _ -> false + | Pisint + | Pisout + | Pintofbint _ + | Pbintcomp _ -> false + | Pdivbint { mode = m } + | Pmodbint { mode = m } + | Pbintofint (_,m) + | Pcvtbint (_,_,m) + | Pnegbint (_,m) + | Paddbint (_,m) + | Psubbint (_,m) + | Pmulbint (_,m) + | Pandbint (_,m) + | Porbint (_,m) + | Pxorbint (_,m) + | Plslbint (_,m) + | Plsrbint (_,m) + | Pasrbint (_,m) -> is_local_alloc m + | Pbigarraydim _ -> false + | Pread_symbol _ + | Pfield _ + | Pfield_computed + | Parrayrefu _ + | Pstringrefu + | Pbytesrefu + | Pstring_load (_, Unsafe, _) + | Pbytes_load (_, Unsafe, _) + | Pbigarrayref (true, _, _, _) + | Pbigstring_load (_, Unsafe, _) -> + false + | Pfloatfield (_, m) -> is_local_alloc m + | Pstring_load (_, Safe, m) + | Pbytes_load (_, Safe, m) + | Pbigstring_load (_, Safe, m) -> is_local_alloc m + | Parrayrefs _ + | Pstringrefs + | Pbytesrefs + | Pbigarrayref (false, _, _, _) -> false + | Psetfield _ + | Psetfield_computed _ + | Psetfloatfield _ + | Parraysetu _ + | Parraysets _ + | Pbytessetu + | Pbytessets + | Pbytes_set _ + | Pbigarrayset _ + | Pbigstring_set _ -> + false + | Pbswap16 -> false + | Pbbswap (_,m) -> is_local_alloc m + | Pint_as_pointer -> false + | Popaque -> false + | Psequand + | Psequor -> + false + | Pprobe_is_enabled _ -> false diff --git a/middle_end/semantics_of_primitives.mli b/middle_end/semantics_of_primitives.mli index 78407df71d2..d898cd6f31e 100644 --- a/middle_end/semantics_of_primitives.mli +++ b/middle_end/semantics_of_primitives.mli @@ -67,3 +67,5 @@ type return_type = | Other val return_type_of_primitive: Clambda_primitives.primitive -> return_type + +val may_locally_allocate : Clambda_primitives.primitive -> bool diff --git a/ocamldoc/Makefile.docfiles b/ocamldoc/Makefile.docfiles index 308d2b3025a..56856a5c6d2 100644 --- a/ocamldoc/Makefile.docfiles +++ b/ocamldoc/Makefile.docfiles @@ -41,10 +41,9 @@ DOC_COMPILERLIBS_INCLUDES = $(addprefix -I $(SRC)/, $(DOC_COMPILERLIBS_DIRS)) DOC_ALL_INCLUDES = $(DOC_STDLIB_INCLUDES) $(DOC_COMPILERLIBS_INCLUDES) -STDLIB_MOD_WP = $(filter-out stdlib__pervasives, $(STDLIB_MODULES)) -STDLIB_MLI0 = $(STDLIB_MOD_WP:%=$(SRC)/stdlib/%.mli) +STDLIB_MOD_WP = $(filter-out pervasives, $(STDLIB_MODS)) STDLIB_MLIS=\ - $(STDLIB_MLI0:$(SRC)/stdlib/stdlib__%=$(SRC)/stdlib/%) \ + $(STDLIB_MOD_WP:%=$(SRC)/stdlib/%.mli) \ $(STR_MLIS) \ $(UNIX_MLIS) \ $(THREAD_MLIS) \ diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index c7cc62b8ad9..293ad92b787 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -765,7 +765,7 @@ module Analyser = in (parameter :: params, k) - | (Parsetree.Pcl_apply (p_class_expr2, _), Tcl_apply (tt_class_expr2, exp_opt_optional_list)) -> + | (Parsetree.Pcl_apply (p_class_expr2, _), Tcl_apply (tt_class_expr2, arg_list)) -> let applied_name = (* we want an ident, or else the class applied will appear in the form object ... end, because if the class applied has no name, the code is kinda ugly, isn't it ? *) @@ -781,12 +781,12 @@ module Analyser = Odoc_messages.object_end in let param_exps = List.fold_left - (fun acc -> fun (_, exp_opt) -> - match exp_opt with - None -> acc - | Some e -> acc @ [e]) + (fun acc -> fun (_, arg) -> + match arg with + | Omitted _ -> acc + | Arg e -> acc @ [e]) [] - exp_opt_optional_list + arg_list in let param_types = List.map (fun e -> e.Typedtree.exp_type) param_exps in let params_code = diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index d52dee89300..035538565ed 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -415,7 +415,8 @@ module Analyser = let record comments { Typedtree.ld_id; ld_mutable; ld_type; ld_loc; ld_attributes } = get_field env comments @@ - {Types.ld_id; ld_mutable; ld_type=ld_type.Typedtree.ctyp_type; + {Types.ld_id; ld_mutable; ld_global = Unrestricted; + ld_type=ld_type.Typedtree.ctyp_type; ld_loc; ld_attributes; ld_uid=Types.Uid.internal_not_actually_unique} in let open Typedtree in function diff --git a/ocamldoc/odoc_value.ml b/ocamldoc/odoc_value.ml index d939f64eac6..35c9a4e1d74 100644 --- a/ocamldoc/odoc_value.ml +++ b/ocamldoc/odoc_value.ml @@ -73,7 +73,7 @@ let update_value_parameters_text v = let parameter_list_from_arrows typ = let rec iter t = match t.Types.desc with - Types.Tarrow (l, t1, t2, _) -> + Types.Tarrow ((l,_,_), t1, t2, _) -> (l, t1) :: (iter t2) | Types.Tlink texp | Types.Tsubst texp -> diff --git a/otherlibs/Makefile.otherlibs.common b/otherlibs/Makefile.otherlibs.common index 59c858861cb..81a60e79a33 100644 --- a/otherlibs/Makefile.otherlibs.common +++ b/otherlibs/Makefile.otherlibs.common @@ -139,7 +139,7 @@ clean:: partialclean ifeq "$(COMPUTE_DEPS)" "true" ifneq "$(COBJS)" "" -include $(addprefix $(DEPDIR)/, $(COBJS:.$(O)=.$(D))) +-include $(addprefix $(DEPDIR)/, $(COBJS:.$(O)=.$(D))) endif endif diff --git a/otherlibs/systhreads/st_stubs.c b/otherlibs/systhreads/st_stubs.c index 2f3f1d10771..73d86789c5c 100644 --- a/otherlibs/systhreads/st_stubs.c +++ b/otherlibs/systhreads/st_stubs.c @@ -79,6 +79,7 @@ struct caml_thread_struct { value * gc_regs; /* Saved value of Caml_state->gc_regs */ char * exception_pointer; /* Saved value of Caml_state->exception_pointer */ struct caml__roots_block * local_roots; /* Saved value of local_roots */ + struct caml_local_arenas * local_arenas; struct longjmp_buffer * exit_buf; /* For thread exit */ #else value * stack_low; /* The execution stack for this thread */ @@ -148,8 +149,8 @@ static void caml_thread_scan_roots(scanning_action action) if (th != curr_thread) { #ifdef NATIVE_CODE if (th->bottom_of_stack != NULL) - caml_do_local_roots(action, th->bottom_of_stack, th->last_retaddr, - th->gc_regs, th->local_roots); + caml_do_local_roots(action, action, th->bottom_of_stack, th->last_retaddr, + th->gc_regs, th->local_roots, th->local_arenas); #else caml_do_local_roots(action, th->sp, th->stack_high, th->local_roots); #endif @@ -181,6 +182,7 @@ Caml_inline void caml_thread_save_runtime_state(void) curr_thread->last_retaddr = Caml_state->last_return_address; curr_thread->gc_regs = Caml_state->gc_regs; curr_thread->exception_pointer = Caml_state->exception_pointer; + curr_thread->local_arenas = caml_get_local_arenas(); #else curr_thread->stack_low = Caml_state->stack_low; curr_thread->stack_high = Caml_state->stack_high; @@ -204,6 +206,7 @@ Caml_inline void caml_thread_restore_runtime_state(void) Caml_state->last_return_address = curr_thread->last_retaddr; Caml_state->gc_regs = curr_thread->gc_regs; Caml_state->exception_pointer = curr_thread->exception_pointer; + caml_set_local_arenas(curr_thread->local_arenas); #else Caml_state->stack_low = curr_thread->stack_low; Caml_state->stack_high = curr_thread->stack_high; @@ -332,6 +335,7 @@ static caml_thread_t caml_thread_new_info(void) th->last_retaddr = 1; th->exception_pointer = NULL; th->local_roots = NULL; + th->local_arenas = NULL; th->exit_buf = NULL; #else /* Allocate the stacks */ diff --git a/parsing/builtin_attributes.ml b/parsing/builtin_attributes.ml index cb211e152ed..baa75ec335c 100644 --- a/parsing/builtin_attributes.ml +++ b/parsing/builtin_attributes.ml @@ -338,6 +338,15 @@ let clflags_attribute_with_int_payload attr ~name clflags_ref = | None -> () end +let principal_attribute attr = + clflags_attribute_without_payload attr + ~name:"principal" Clflags.principal + +let noprincipal_attribute attr = + clflags_attribute_without_payload' attr + ~name:"noprincipal" + ~f:(fun () -> Clflags.principal := false) + let nolabels_attribute attr = clflags_attribute_without_payload attr ~name:"nolabels" Clflags.classic @@ -377,12 +386,25 @@ let afl_inst_ratio_attribute attr = let parse_standard_interface_attributes attr = warning_attribute attr; + principal_attribute attr; + noprincipal_attribute attr; nolabels_attribute attr let parse_standard_implementation_attributes attr = warning_attribute attr; + principal_attribute attr; + noprincipal_attribute attr; nolabels_attribute attr; inline_attribute attr; afl_inst_ratio_attribute attr; flambda_o3_attribute attr; flambda_oclassic_attribute attr + +let has_curry attr = List.exists (check ["ocaml.curry"; "curry"]) attr + +(* local is generated by the parser and not usually written directly, + so does not have a short form. *) +let has_local attr = List.exists (check ["ocaml.local"]) attr + +let has_local_opt attr = + List.exists (check ["ocaml.local_opt"; "local_opt"]) attr diff --git a/parsing/builtin_attributes.mli b/parsing/builtin_attributes.mli index 4c0f6530437..1ce0c2ac46f 100644 --- a/parsing/builtin_attributes.mli +++ b/parsing/builtin_attributes.mli @@ -90,3 +90,7 @@ val has_boxed: Parsetree.attributes -> bool val parse_standard_interface_attributes : Parsetree.attribute -> unit val parse_standard_implementation_attributes : Parsetree.attribute -> unit + +val has_curry: Parsetree.attributes -> bool +val has_local: Parsetree.attributes -> bool +val has_local_opt: Parsetree.attributes -> bool diff --git a/parsing/lexer.mll b/parsing/lexer.mll index 95339044e3b..eb6e6451ba0 100644 --- a/parsing/lexer.mll +++ b/parsing/lexer.mll @@ -56,6 +56,7 @@ let keyword_table = "fun", FUN; "function", FUNCTION; "functor", FUNCTOR; + "global_", GLOBAL; "if", IF; "in", IN; "include", INCLUDE; @@ -63,11 +64,13 @@ let keyword_table = "initializer", INITIALIZER; "lazy", LAZY; "let", LET; + "local_", LOCAL; "match", MATCH; "method", METHOD; "module", MODULE; "mutable", MUTABLE; "new", NEW; + "nonlocal_", NONLOCAL; "nonrec", NONREC; "object", OBJECT; "of", OF; @@ -98,6 +101,15 @@ let keyword_table = "asr", INFIXOP4("asr") ] +let lookup_keyword name = + match Hashtbl.find keyword_table name with + | LOCAL | NONLOCAL | GLOBAL + when not (Clflags.Extension.is_enabled Local) -> + LIDENT name + | kw -> kw + | exception Not_found -> + LIDENT name + (* To buffer string literals *) let string_buffer = Buffer.create 256 @@ -400,8 +412,7 @@ rule token = parse { warn_latin1 lexbuf; OPTLABEL name } | lowercase identchar * as name - { try Hashtbl.find keyword_table name - with Not_found -> LIDENT name } + { lookup_keyword name } | lowercase_latin1 identchar_latin1 * as name { warn_latin1 lexbuf; LIDENT name } | uppercase identchar * as name diff --git a/parsing/parser.mly b/parsing/parser.mly index 4020ccd7458..efa5bd3dd03 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -157,6 +157,83 @@ let mkuplus ~oploc name arg = | _ -> Pexp_apply(mkoperator ~loc:oploc ("~" ^ name), [Nolabel, arg]) + +let local_loc = mknoloc "ocaml.local" +let local_ext_loc = mknoloc "extension.local" + +let local_attr = + Attr.mk ~loc:Location.none local_loc (PStr []) + +let local_extension = + Exp.mk ~loc:Location.none (Pexp_extension(local_ext_loc, PStr [])) + +let mkexp_stack ~loc exp = + ghexp ~loc (Pexp_apply(local_extension, [Nolabel, exp])) + +let mkpat_stack pat = + {pat with ppat_attributes = local_attr :: pat.ppat_attributes} + +let mktyp_stack typ = + {typ with ptyp_attributes = local_attr :: typ.ptyp_attributes} + +let wrap_exp_stack exp = + {exp with pexp_attributes = local_attr :: exp.pexp_attributes} + +let mkexp_local_if p ~loc exp = + if p then mkexp_stack ~loc exp else exp + +let mkpat_local_if p pat = + if p then mkpat_stack pat else pat + +let mktyp_local_if p typ = + if p then mktyp_stack typ else typ + +let wrap_exp_local_if p exp = + if p then wrap_exp_stack exp else exp + +let curry_attr = + Attr.mk ~loc:Location.none (mknoloc "ocaml.curry") (PStr []) + +let is_curry_attr attr = + attr.attr_name.txt = "ocaml.curry" + +let mktyp_curry typ = + {typ with ptyp_attributes = curry_attr :: typ.ptyp_attributes} + +let maybe_curry_typ typ = + match typ.ptyp_desc with + | Ptyp_arrow _ -> + if List.exists is_curry_attr typ.ptyp_attributes then typ + else mktyp_curry typ + | _ -> typ + +let global_loc = mknoloc "ocaml.global" + +let global_attr = + Attr.mk ~loc:Location.none global_loc (PStr []) + +let nonlocal_loc = mknoloc "ocaml.nonlocal" + +let nonlocal_attr = + Attr.mk ~loc:Location.none nonlocal_loc (PStr []) + +let mkld_global ld = + { ld with pld_attributes = global_attr :: ld.pld_attributes } + +let mkld_nonlocal ld = + { ld with pld_attributes = nonlocal_attr :: ld.pld_attributes } + +type global_flag = + | Global + | Nonlocal + | Nothing + +let mkld_global_maybe gbl ld = + match gbl with + | Global -> mkld_global ld + | Nonlocal -> mkld_nonlocal ld + | Nothing -> ld + (* TODO define an abstraction boundary between locations-as-pairs and locations-as-Location.t; it should be clear when we move from one world to the other *) @@ -618,6 +695,7 @@ let mk_directive ~loc name arg = %token FUN %token FUNCTION %token FUNCTOR +%token GLOBAL %token GREATER %token GREATERRBRACE %token GREATERRBRACKET @@ -649,6 +727,7 @@ let mk_directive ~loc name arg = %token LESSMINUS %token LET %token LIDENT +%token LOCAL %token LPAREN %token LBRACKETAT %token LBRACKETATAT @@ -661,6 +740,7 @@ let mk_directive ~loc name arg = %token MODULE %token MUTABLE %token NEW +%token NONLOCAL %token NONREC %token OBJECT %token OF @@ -2087,22 +2167,26 @@ seq_expr: mkexp ~loc:$sloc (Pexp_extension ($4, payload)) } ; labeled_simple_pattern: - QUESTION LPAREN label_let_pattern opt_default RPAREN - { (Optional (fst $3), $4, snd $3) } + QUESTION LPAREN optional_local label_let_pattern opt_default RPAREN + { (Optional (fst $4), $5, mkpat_local_if $3 (snd $4)) } | QUESTION label_var { (Optional (fst $2), None, snd $2) } - | OPTLABEL LPAREN let_pattern opt_default RPAREN - { (Optional $1, $4, $3) } + | OPTLABEL LPAREN optional_local let_pattern opt_default RPAREN + { (Optional $1, $5, mkpat_local_if $3 $4) } | OPTLABEL pattern_var { (Optional $1, None, $2) } - | TILDE LPAREN label_let_pattern RPAREN - { (Labelled (fst $3), None, snd $3) } + | TILDE LPAREN optional_local label_let_pattern RPAREN + { (Labelled (fst $4), None, mkpat_local_if $3 (snd $4)) } | TILDE label_var { (Labelled (fst $2), None, snd $2) } | LABEL simple_pattern { (Labelled $1, None, $2) } + | LABEL LPAREN LOCAL pattern RPAREN + { (Labelled $1, None, mkpat_stack $4) } | simple_pattern { (Nolabel, None, $1) } + | LPAREN LOCAL let_pattern RPAREN + { (Nolabel, None, mkpat_stack $3) } ; pattern_var: @@ -2183,6 +2267,8 @@ expr: { Exp.attr $1 $2 } | UNDERSCORE { not_expecting $loc($1) "wildcard \"_\"" } + | LOCAL seq_expr + { mkexp_stack ~loc:$sloc $2 } ; %inline expr_attrs: | LET MODULE ext_attributes mkrhs(module_name) module_binding_body IN seq_expr @@ -2456,28 +2542,38 @@ labeled_simple_expr: let_binding_body: let_ident strict_binding { ($1, $2) } - | let_ident type_constraint EQUAL seq_expr - { let v = $1 in (* PR#7344 *) + | optional_local let_ident type_constraint EQUAL seq_expr + { let v = $2 in (* PR#7344 *) let t = - match $2 with + match $3 with Some t, None -> t | _, Some t -> t | _ -> assert false in let loc = Location.(t.ptyp_loc.loc_start, t.ptyp_loc.loc_end) in let typ = ghtyp ~loc (Ptyp_poly([],t)) in - let patloc = ($startpos($1), $endpos($2)) in - (ghpat ~loc:patloc (Ppat_constraint(v, typ)), - mkexp_constraint ~loc:$sloc $4 $2) } - | let_ident COLON typevar_list DOT core_type EQUAL seq_expr + let patloc = ($startpos($2), $endpos($3)) in + let pat = + mkpat_local_if $1 (ghpat ~loc:patloc (Ppat_constraint(v, typ))) + in + let exp = + mkexp_local_if $1 ~loc:$sloc + (wrap_exp_local_if $1 (mkexp_constraint ~loc:$sloc $5 $3)) + in + (pat, exp) } + | optional_local let_ident COLON typevar_list DOT core_type EQUAL seq_expr (* TODO: could replace [typevar_list DOT core_type] with [mktyp(poly(core_type))] and simplify the semantic action? *) - { let typloc = ($startpos($3), $endpos($5)) in - let patloc = ($startpos($1), $endpos($5)) in - (ghpat ~loc:patloc - (Ppat_constraint($1, ghtyp ~loc:typloc (Ptyp_poly($3,$5)))), - $7) } + { let typloc = ($startpos($4), $endpos($6)) in + let patloc = ($startpos($2), $endpos($6)) in + let pat = + mkpat_local_if $1 + (ghpat ~loc:patloc + (Ppat_constraint($2, ghtyp ~loc:typloc (Ptyp_poly($4,$6))))) + in + let exp = mkexp_local_if $1 ~loc:$sloc $8 in + (pat, exp) } | let_ident COLON TYPE lident_list DOT core_type EQUAL seq_expr { let exp, poly = wrap_type_annotation ~loc:$sloc $4 $6 $8 in @@ -2488,6 +2584,8 @@ let_binding_body: | simple_pattern_not_ident COLON core_type EQUAL seq_expr { let loc = ($startpos($1), $endpos($3)) in (ghpat ~loc (Ppat_constraint($1, $3)), $5) } + | LOCAL let_ident local_strict_binding + { ($2, mkexp_stack ~loc:$sloc $3) } ; (* The formal parameter EXT can be instantiated with ext or no_ext so as to indicate whether an extension is allowed or disallowed. *) @@ -2551,6 +2649,20 @@ strict_binding: | LPAREN TYPE lident_list RPAREN fun_binding { mk_newtypes ~loc:$sloc $3 $5 } ; +local_fun_binding: + local_strict_binding + { $1 } + | type_constraint EQUAL seq_expr + { wrap_exp_stack (mkexp_constraint ~loc:$sloc $3 $1) } +; +local_strict_binding: + EQUAL seq_expr + { $2 } + | labeled_simple_pattern local_fun_binding + { let (l, o, p) = $1 in ghexp ~loc:$sloc (Pexp_fun(l, o, p, $2)) } + | LPAREN TYPE lident_list RPAREN local_fun_binding + { mk_newtypes ~loc:$sloc $3 $5 } +; %inline match_cases: xs = preceded_or_separated_nonempty_llist(BAR, match_case) { xs } @@ -3092,18 +3204,23 @@ label_declarations: | label_declaration_semi label_declarations { $1 :: $2 } ; label_declaration: - mutable_flag mkrhs(label) COLON poly_type_no_attr attributes + mutable_or_global_flag mkrhs(label) COLON poly_type_no_attr attributes { let info = symbol_info $endpos in - Type.field $2 $4 ~mut:$1 ~attrs:$5 ~loc:(make_loc $sloc) ~info } + let mut, gbl = $1 in + mkld_global_maybe gbl + (Type.field $2 $4 ~mut ~attrs:$5 ~loc:(make_loc $sloc) ~info) } ; label_declaration_semi: - mutable_flag mkrhs(label) COLON poly_type_no_attr attributes SEMI attributes + mutable_or_global_flag mkrhs(label) COLON poly_type_no_attr attributes + SEMI attributes { let info = match rhs_info $endpos($5) with | Some _ as info_before_semi -> info_before_semi | None -> symbol_info $endpos in - Type.field $2 $4 ~mut:$1 ~attrs:($5 @ $7) ~loc:(make_loc $sloc) ~info } + let mut, gbl = $1 in + mkld_global_maybe gbl + (Type.field $2 $4 ~mut ~attrs:($5 @ $7) ~loc:(make_loc $sloc) ~info) } ; /* Type Extensions */ @@ -3264,12 +3381,31 @@ function_type: | ty = tuple_type %prec MINUSGREATER { ty } + | ty = strict_function_type + { ty } +; + +strict_function_type: | mktyp( label = arg_label + local = optional_local domain = extra_rhs(tuple_type) MINUSGREATER - codomain = function_type - { Ptyp_arrow(label, domain, codomain) } + codomain = strict_function_type + { Ptyp_arrow(label, mktyp_local_if local domain, codomain) } + ) + { $1 } + | mktyp( + label = arg_label + arg_local = optional_local + domain = extra_rhs(tuple_type) + MINUSGREATER + ret_local = optional_local + codomain = tuple_type + %prec MINUSGREATER + { Ptyp_arrow(label, + mktyp_local_if arg_local domain, + mktyp_local_if ret_local (maybe_curry_typ codomain)) } ) { $1 } ; @@ -3281,6 +3417,12 @@ function_type: | /* empty */ { Nolabel } ; +%inline optional_local: + | /* empty */ + { false } + | LOCAL + { true } +; (* Tuple types include: - atomic types (see below); - proper tuple types: int * int * int list @@ -3641,6 +3783,12 @@ mutable_flag: /* empty */ { Immutable } | MUTABLE { Mutable } ; +mutable_or_global_flag: + /* empty */ { Immutable, Nothing } + | MUTABLE { Mutable, Nothing } + | GLOBAL { Immutable, Global } + | NONLOCAL { Immutable, Nonlocal } +; virtual_flag: /* empty */ { Concrete } | VIRTUAL { Virtual } @@ -3720,6 +3868,7 @@ single_attr_id: | FUN { "fun" } | FUNCTION { "function" } | FUNCTOR { "functor" } + | NONLOCAL { "nonlocal_" } | IF { "if" } | IN { "in" } | INCLUDE { "include" } @@ -3727,6 +3876,7 @@ single_attr_id: | INITIALIZER { "initializer" } | LAZY { "lazy" } | LET { "let" } + | LOCAL { "local_" } | MATCH { "match" } | METHOD { "method" } | MODULE { "module" } diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index f2b49de7928..79d624be600 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -110,6 +110,25 @@ let protect_longident ppf print_longident longprefix txt = else "%a.(%s)" in fprintf ppf format print_longident longprefix txt +let is_curry_attr attr = + match attr.attr_name.txt with + | "ocaml.curry" -> true + | _ -> false + +let filter_curry_attrs attrs = + List.filter (fun attr -> not (is_curry_attr attr)) attrs + +let has_non_curry_attr attrs = + List.exists (fun attr -> not (is_curry_attr attr)) attrs + +let check_local_attr attrs = + match + List.partition (fun attr -> + attr.attr_name.txt = "ocaml.local") attrs + with + | [], _ -> attrs, false + | _::_, rest -> rest, true + type space_formatter = (unit, Format.formatter, unit) format let override = function @@ -277,6 +296,14 @@ let tyvar ppf s = let tyvar_loc f str = tyvar f str.txt let string_quot f x = pp f "`%s" x +let maybe_local_type pty ctxt f c = + let cattrs, is_local = check_local_attr c.ptyp_attributes in + let c = { c with ptyp_attributes = cattrs } in + if is_local then + pp f "local_ %a" (pty ctxt) c + else + pty ctxt f c + (* c ['a,'b] *) let rec class_params_def ctxt f = function | [] -> () @@ -286,19 +313,20 @@ let rec class_params_def ctxt f = function and type_with_label ctxt f (label, c) = match label with - | Nolabel -> core_type1 ctxt f c (* otherwise parenthesize *) - | Labelled s -> pp f "%s:%a" s (core_type1 ctxt) c - | Optional s -> pp f "?%s:%a" s (core_type1 ctxt) c + | Nolabel -> maybe_local_type core_type1 ctxt f c (* otherwise parenthesize *) + | Labelled s -> pp f "%s:%a" s (maybe_local_type core_type1 ctxt) c + | Optional s -> pp f "?%s:%a" s (maybe_local_type core_type1 ctxt) c and core_type ctxt f x = - if x.ptyp_attributes <> [] then begin + let filtered_attrs = filter_curry_attrs x.ptyp_attributes in + if filtered_attrs <> [] then begin pp f "((%a)%a)" (core_type ctxt) {x with ptyp_attributes=[]} - (attributes ctxt) x.ptyp_attributes + (attributes ctxt) filtered_attrs end else match x.ptyp_desc with | Ptyp_arrow (l, ct1, ct2) -> pp f "@[<2>%a@;->@;%a@]" (* FIXME remove parens later *) - (type_with_label ctxt) (l,ct1) (core_type ctxt) ct2 + (type_with_label ctxt) (l,ct1) (return_type ctxt) ct2 | Ptyp_alias (ct, s) -> pp f "@[<2>%a@;as@;%a@]" (core_type1 ctxt) ct tyvar s | Ptyp_poly ([], ct) -> @@ -317,7 +345,7 @@ and core_type ctxt f x = | _ -> pp f "@[<2>%a@]" (core_type1 ctxt) x and core_type1 ctxt f x = - if x.ptyp_attributes <> [] then core_type ctxt f x + if has_non_curry_attr x.ptyp_attributes then core_type ctxt f x else match x.ptyp_desc with | Ptyp_any -> pp f "_"; | Ptyp_var s -> tyvar f s; @@ -394,6 +422,10 @@ and core_type1 ctxt f x = | Ptyp_extension e -> extension ctxt f e | _ -> paren true (core_type ctxt) f x +and return_type ctxt f x = + if x.ptyp_attributes <> [] then maybe_local_type core_type1 ctxt f x + else maybe_local_type core_type ctxt f x + (********************pattern********************) (* be cautious when use [pattern], [pattern1] is preferred *) and pattern ctxt f x = @@ -498,30 +530,43 @@ and simple_pattern ctxt (f:Format.formatter) (x:pattern) : unit = (paren with_paren @@ pattern1 ctxt) p | _ -> paren true (pattern ctxt) f x +and maybe_local_pat ctxt is_local f p = + if is_local then + pp f "(local_ %a)" (simple_pattern ctxt) p + else + pp f "%a" (simple_pattern ctxt) p + and label_exp ctxt f (l,opt,p) = + let pattrs, is_local = check_local_attr p.ppat_attributes in + let p = { p with ppat_attributes = pattrs } in match l with | Nolabel -> (* single case pattern parens needed here *) - pp f "%a@ " (simple_pattern ctxt) p + pp f "%a" (maybe_local_pat ctxt is_local) p | Optional rest -> begin match p with | {ppat_desc = Ppat_var {txt;_}; ppat_attributes = []} - when txt = rest -> + when txt = rest && not is_local -> (match opt with - | Some o -> pp f "?(%s=@;%a)@;" rest (expression ctxt) o - | None -> pp f "?%s@ " rest) + | Some o -> pp f "?(%s=@;%a)" rest (expression ctxt) o + | None -> pp f "?%s" rest) | _ -> (match opt with | Some o -> - pp f "?%s:(%a=@;%a)@;" - rest (pattern1 ctxt) p (expression ctxt) o - | None -> pp f "?%s:%a@;" rest (simple_pattern ctxt) p) + pp f "?%s:(%s%a=@;%a)" + rest + (if is_local then "local_ " else "") + (pattern1 ctxt) p (expression ctxt) o + | None -> pp f "?%s:%a" rest (maybe_local_pat ctxt is_local) p) end | Labelled l -> match p with | {ppat_desc = Ppat_var {txt;_}; ppat_attributes = []} when txt = l -> - pp f "~%s@;" l - | _ -> pp f "~%s:%a@;" l (simple_pattern ctxt) p + if is_local then + pp f "~(local_ %s)" l + else + pp f "~%s" l + | _ -> pp f "~%s:%a" l (maybe_local_pat ctxt is_local) p and sugar_expr ctxt f e = if e.pexp_attributes <> [] then false @@ -615,12 +660,12 @@ and expression ctxt f x = when ctxt.semi -> paren true (expression reset_ctxt) f x | Pexp_fun (l, e0, p, e) -> - pp f "@[<2>fun@;%a->@;%a@]" + pp f "@[<2>fun@;%a@;%a@]" (label_exp ctxt) (l, e0, p) - (expression ctxt) e + (pp_print_pexp_function ctxt "->") e | Pexp_newtype (lid, e) -> - pp f "@[<2>fun@;(type@;%s)@;->@;%a@]" lid.txt - (expression ctxt) e + pp f "@[<2>fun@;(type@;%s)@;%a@]" lid.txt + (pp_print_pexp_function ctxt "->") e | Pexp_function l -> pp f "@[function%a@]" (case_list ctxt) l | Pexp_match (e, l) -> @@ -638,6 +683,10 @@ and expression ctxt f x = pp f "@[<2>%a in@;<1 -2>%a@]" (bindings reset_ctxt) (rf,l) (expression ctxt) e + | Pexp_apply + ({ pexp_desc = Pexp_extension({txt = "extension.local"}, PStr []) }, + [Nolabel, sbody]) -> + pp f "@[<2>local_ %a@]" (expression ctxt) sbody | Pexp_apply (e, l) -> begin if not (sugar_expr ctxt f x) then match view_fixity_of_exp e with @@ -1221,22 +1270,23 @@ and payload ctxt f = function pp f "?@ "; pattern ctxt f x; pp f " when "; expression ctxt f e +and pp_print_pexp_function ctxt sep f x = + (* do not print [@ocaml.local] on expressions *) + let attrs, _ = check_local_attr x.pexp_attributes in + let x = { x with pexp_attributes = attrs } in + if x.pexp_attributes <> [] then pp f "%s@;%a" sep (expression ctxt) x + else match x.pexp_desc with + | Pexp_fun (label, eo, p, e) -> + pp f "%a@ %a" + (label_exp ctxt) (label,eo,p) (pp_print_pexp_function ctxt sep) e + | Pexp_newtype (str,e) -> + pp f "(type@ %s)@ %a" str.txt (pp_print_pexp_function ctxt sep) e + | _ -> + pp f "%s@;%a" sep (expression ctxt) x + (* transform [f = fun g h -> ..] to [f g h = ... ] could be improved *) and binding ctxt f {pvb_pat=p; pvb_expr=x; _} = (* .pvb_attributes have already been printed by the caller, #bindings *) - let rec pp_print_pexp_function f x = - if x.pexp_attributes <> [] then pp f "=@;%a" (expression ctxt) x - else match x.pexp_desc with - | Pexp_fun (label, eo, p, e) -> - if label=Nolabel then - pp f "%a@ %a" (simple_pattern ctxt) p pp_print_pexp_function e - else - pp f "%a@ %a" - (label_exp ctxt) (label,eo,p) pp_print_pexp_function e - | Pexp_newtype (str,e) -> - pp f "(type@ %s)@ %a" str.txt pp_print_pexp_function e - | _ -> pp f "=@;%a" (expression ctxt) x - in let tyvars_str tyvars = List.map (fun v -> v.txt) tyvars in let is_desugared_gadt p e = let gadt_pattern = @@ -1294,7 +1344,8 @@ and binding ctxt f {pvb_pat=p; pvb_expr=x; _} = (core_type ctxt) ty (expression ctxt) x end | {ppat_desc=Ppat_var _; ppat_attributes=[]} -> - pp f "%a@ %a" (simple_pattern ctxt) p pp_print_pexp_function x + pp f "%a@ %a" (simple_pattern ctxt) p + (pp_print_pexp_function ctxt "=") x | _ -> pp f "%a@;=@;%a" (pattern ctxt) p (expression ctxt) x end @@ -1302,7 +1353,19 @@ and binding ctxt f {pvb_pat=p; pvb_expr=x; _} = (* [in] is not printed *) and bindings ctxt f (rf,l) = let binding kwd rf f x = - pp f "@[<2>%s %a%a@]%a" kwd rec_flag rf + let x, is_local = + match x.pvb_expr.pexp_desc with + | Pexp_apply + ({ pexp_desc = Pexp_extension({txt = "extension.local"}, PStr []) }, + [Nolabel, sbody]) -> + let sattrs, _ = check_local_attr sbody.pexp_attributes in + let sbody = {sbody with pexp_attributes = sattrs} in + let pattrs, _ = check_local_attr x.pvb_pat.ppat_attributes in + let pat = {x.pvb_pat with ppat_attributes = pattrs} in + {x with pvb_pat = pat; pvb_expr = sbody}, "local_ " + | _ -> x, "" + in + pp f "@[<2>%s %a%s%a@]%a" kwd rec_flag rf is_local (binding ctxt) x (item_attributes ctxt) x.pvb_attributes in match l with @@ -1396,7 +1459,7 @@ and structure_item ctxt f x = pp f "@[<2>%s %a%a%s %a%a=@;%a@]%a" kwd virtual_flag x.pci_virt (class_params_def ctxt) ls txt - (list (label_exp ctxt)) args + (list (label_exp ctxt) ~last:"@ ") args (option class_constraint) constr (class_expr ctxt) cl (item_attributes ctxt) x.pci_attributes @@ -1484,12 +1547,26 @@ and type_def_list ctxt f (rf, exported, l) = (list ~sep:"@," (type_decl "and" Recursive)) xs and record_declaration ctxt f lbls = + let has_attr pld name = + List.exists (fun attr -> attr.attr_name.txt = name) pld.pld_attributes + in + let field_flag f pld = + pp f "%a" mutable_flag pld.pld_mutable; + if has_attr pld "ocaml.nonlocal" then pp f "nonlocal_ "; + if has_attr pld "ocaml.global" then pp f "global_ " + in let type_record_field f pld = + let pld_attributes = + List.filter (fun attr -> + match attr.attr_name.txt with + | "ocaml.nonlocal" | "ocaml.global" -> false + | _ -> true) pld.pld_attributes + in pp f "@[<2>%a%s:@;%a@;%a@]" - mutable_flag pld.pld_mutable + field_flag pld pld.pld_name.txt (core_type ctxt) pld.pld_type - (attributes ctxt) pld.pld_attributes + (attributes ctxt) pld_attributes in pp f "{@\n%a}" (list type_record_field ~sep:";@\n" ) lbls diff --git a/runtime/Makefile b/runtime/Makefile index 4b6e2b7d0f9..71a580ea50f 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -416,5 +416,5 @@ DEP_FILES += $(addsuffix d, $(DEP_FILES)) \ DEP_FILES := $(addsuffix .$(D), $(DEP_FILES)) ifeq "$(COMPUTE_DEPS)" "true" -include $(addprefix $(DEPDIR)/, $(DEP_FILES)) +-include $(addprefix $(DEPDIR)/, $(DEP_FILES)) endif diff --git a/runtime/alloc.c b/runtime/alloc.c index 189d309d314..21fcc5e4dae 100644 --- a/runtime/alloc.c +++ b/runtime/alloc.c @@ -94,6 +94,20 @@ CAMLexport value caml_alloc_string (mlsize_t len) return result; } +/* [len] is a number of bytes (chars) */ +CAMLexport value caml_alloc_local_string (mlsize_t len) +{ + mlsize_t offset_index; + mlsize_t wosize = (len + sizeof (value)) / sizeof (value); + value result; + + result = caml_alloc_local(wosize, String_tag); + Field (result, wosize - 1) = 0; + offset_index = Bsize_wsize (wosize) - 1; + Byte (result, offset_index) = offset_index - len; + return result; +} + /* [len] is a number of bytes (chars) */ CAMLexport value caml_alloc_initialized_string (mlsize_t len, const char *p) { diff --git a/runtime/amd64.S b/runtime/amd64.S index 756d4a5a0ab..117dc5b0c61 100644 --- a/runtime/amd64.S +++ b/runtime/amd64.S @@ -445,6 +445,100 @@ CFI_STARTPROC CFI_ENDPROC ENDFUNCTION(G(caml_allocN)) + + +FUNCTION(G(caml_call_local_realloc)) + CFI_STARTPROC + /* Touch the stack to trigger a recoverable segfault + if insufficient space remains */ + subq $(STACK_PROBE_SIZE), %rsp; CFI_ADJUST(STACK_PROBE_SIZE); + movq %r11, 0(%rsp) + addq $(STACK_PROBE_SIZE), %rsp; CFI_ADJUST(-STACK_PROBE_SIZE); + /* Build array of registers, save it into Caml_state->gc_regs */ +#ifdef WITH_FRAME_POINTERS + ENTER_FUNCTION ; +#else + pushq %rbp; CFI_ADJUST(8); +#endif + pushq %r11; CFI_ADJUST (8); + pushq %r10; CFI_ADJUST (8); + pushq %r13; CFI_ADJUST (8); + pushq %r12; CFI_ADJUST (8); + pushq %r9; CFI_ADJUST (8); + pushq %r8; CFI_ADJUST (8); + pushq %rcx; CFI_ADJUST (8); + pushq %rdx; CFI_ADJUST (8); + pushq %rsi; CFI_ADJUST (8); + pushq %rdi; CFI_ADJUST (8); + pushq %rbx; CFI_ADJUST (8); + pushq %rax; CFI_ADJUST (8); + movq %rsp, Caml_state(gc_regs) + /* Save young_ptr */ + movq %r15, Caml_state(young_ptr) + /* Save floating-point registers */ + subq $(16*8), %rsp; CFI_ADJUST (16*8); + movsd %xmm0, 0*8(%rsp) + movsd %xmm1, 1*8(%rsp) + movsd %xmm2, 2*8(%rsp) + movsd %xmm3, 3*8(%rsp) + movsd %xmm4, 4*8(%rsp) + movsd %xmm5, 5*8(%rsp) + movsd %xmm6, 6*8(%rsp) + movsd %xmm7, 7*8(%rsp) + movsd %xmm8, 8*8(%rsp) + movsd %xmm9, 9*8(%rsp) + movsd %xmm10, 10*8(%rsp) + movsd %xmm11, 11*8(%rsp) + movsd %xmm12, 12*8(%rsp) + movsd %xmm13, 13*8(%rsp) + movsd %xmm14, 14*8(%rsp) + movsd %xmm15, 15*8(%rsp) + /* Call the garbage collector */ + PREPARE_FOR_C_CALL + call GCALL(caml_local_realloc) + CLEANUP_AFTER_C_CALL + /* Restore young_ptr */ + movq Caml_state(young_ptr), %r15 + /* Restore all regs used by the code generator */ + movsd 0*8(%rsp), %xmm0 + movsd 1*8(%rsp), %xmm1 + movsd 2*8(%rsp), %xmm2 + movsd 3*8(%rsp), %xmm3 + movsd 4*8(%rsp), %xmm4 + movsd 5*8(%rsp), %xmm5 + movsd 6*8(%rsp), %xmm6 + movsd 7*8(%rsp), %xmm7 + movsd 8*8(%rsp), %xmm8 + movsd 9*8(%rsp), %xmm9 + movsd 10*8(%rsp), %xmm10 + movsd 11*8(%rsp), %xmm11 + movsd 12*8(%rsp), %xmm12 + movsd 13*8(%rsp), %xmm13 + movsd 14*8(%rsp), %xmm14 + movsd 15*8(%rsp), %xmm15 + addq $(16*8), %rsp; CFI_ADJUST(-16*8) + popq %rax; CFI_ADJUST(-8) + popq %rbx; CFI_ADJUST(-8) + popq %rdi; CFI_ADJUST(-8) + popq %rsi; CFI_ADJUST(-8) + popq %rdx; CFI_ADJUST(-8) + popq %rcx; CFI_ADJUST(-8) + popq %r8; CFI_ADJUST(-8) + popq %r9; CFI_ADJUST(-8) + popq %r12; CFI_ADJUST(-8) + popq %r13; CFI_ADJUST(-8) + popq %r10; CFI_ADJUST(-8) + popq %r11; CFI_ADJUST(-8) +#ifdef WITH_FRAME_POINTERS + LEAVE_FUNCTION +#else + popq %rbp; CFI_ADJUST(-8); +#endif + /* Return to caller */ + ret +CFI_ENDPROC +ENDFUNCTION(G(caml_call_local_realloc)) + /* Call a C function from OCaml */ FUNCTION(G(caml_c_call)) diff --git a/runtime/array.c b/runtime/array.c index 9c93e0bfb72..ebf0df425b7 100644 --- a/runtime/array.c +++ b/runtime/array.c @@ -282,8 +282,14 @@ CAMLprim value caml_floatarray_create(value len) return caml_process_pending_actions_with_root (result); } +CAMLprim value caml_floatarray_create_local(value len) +{ + mlsize_t wosize = Long_val(len) * Double_wosize; + return caml_alloc_local (wosize, Double_array_tag); +} + /* [len] is a [value] representing number of words or floats */ -CAMLprim value caml_make_vect(value len, value init) +static value make_vect_gen(value len, value init, int local) { CAMLparam2 (len, init); CAMLlocal1 (res); @@ -301,18 +307,22 @@ CAMLprim value caml_make_vect(value len, value init) d = Double_val(init); wsize = size * Double_wosize; if (wsize > Max_wosize) caml_invalid_argument("Array.make"); - res = caml_alloc(wsize, Double_array_tag); + res = local ? + caml_alloc_local(wsize, Double_array_tag) : + caml_alloc(wsize, Double_array_tag); for (i = 0; i < size; i++) { Store_double_flat_field(res, i, d); } #endif } else { - if (size <= Max_young_wosize) { + if (size > Max_wosize) caml_invalid_argument("Array.make"); + else if (local) { + res = caml_alloc_local(size, 0); + for (i = 0; i < size; i++) Field(res, i) = init; + } else if (size <= Max_young_wosize) { res = caml_alloc_small(size, 0); for (i = 0; i < size; i++) Field(res, i) = init; - } - else if (size > Max_wosize) caml_invalid_argument("Array.make"); - else { + } else { if (Is_block(init) && Is_young(init)) { /* We don't want to create so many major-to-minor references, so [init] is moved to the major heap by doing a minor GC. */ @@ -327,10 +337,21 @@ CAMLprim value caml_make_vect(value len, value init) } } // Give the GC a chance to run, and run memprof callbacks - caml_process_pending_actions (); + if (!local) caml_process_pending_actions (); CAMLreturn (res); } + +CAMLprim value caml_make_vect(value len, value init) +{ + return make_vect_gen(len, init, 0); +} + +CAMLprim value caml_make_local_vect(value len, value init) +{ + return make_vect_gen(len, init, 1); +} + /* [len] is a [value] representing number of floats */ /* [ int -> float array ] */ CAMLprim value caml_make_float_vect(value len) @@ -353,7 +374,7 @@ CAMLprim value caml_make_float_vect(value len) boxed floats and returns the corresponding flat-allocated [float array]. In all other cases, it just returns its argument unchanged. */ -CAMLprim value caml_make_array(value init) +static value make_array_gen(value init, int local) { #ifdef FLAT_FLOAT_ARRAY CAMLparam1 (init); @@ -371,7 +392,9 @@ CAMLprim value caml_make_array(value init) CAMLreturn (init); } else { wsize = size * Double_wosize; - if (wsize <= Max_young_wosize) { + if (local) { + res = caml_alloc_local(wsize, Double_array_tag); + } else if (wsize <= Max_young_wosize) { res = caml_alloc_small(wsize, Double_array_tag); } else { res = caml_alloc_shr(wsize, Double_array_tag); @@ -381,7 +404,8 @@ CAMLprim value caml_make_array(value init) Store_double_flat_field(res, i, d); } // run memprof callbacks - caml_process_pending_actions(); + if (!local) + caml_process_pending_actions(); CAMLreturn (res); } } @@ -390,6 +414,16 @@ CAMLprim value caml_make_array(value init) #endif } +CAMLprim value caml_make_array(value init) +{ + return make_array_gen(init, 0); +} + +CAMLprim value caml_make_array_local(value init) +{ + return make_array_gen(init, 1); +} + /* Blitting */ CAMLprim value caml_floatarray_blit(value a1, value ofs1, value a2, value ofs2, @@ -419,8 +453,9 @@ CAMLprim value caml_array_blit(value a1, value ofs1, value a2, value ofs2, } #endif CAMLassert (Tag_val(a2) != Double_array_tag); - if (Is_young(a2)) { - /* Arrays of values, destination is in young generation. + if (Is_young(a2) || + Color_hd(Hd_val(a2)) == Local_unmarked) { + /* Arrays of values, destination is local or in young generation. Here too we can do a direct copy since this cannot create old-to-young pointers, nor mess up with the incremental major GC. Again, memmove takes care of overlap. */ @@ -459,7 +494,8 @@ CAMLprim value caml_array_blit(value a1, value ofs1, value a2, value ofs2, static value caml_array_gather(intnat num_arrays, value arrays[/*num_arrays*/], intnat offsets[/*num_arrays*/], - intnat lengths[/*num_arrays*/]) + intnat lengths[/*num_arrays*/], + int local) { CAMLparamN(arrays, num_arrays); value res; /* no need to register it as a root */ @@ -488,7 +524,9 @@ static value caml_array_gather(intnat num_arrays, /* This is an array of floats. We can use memcpy directly. */ if (size > Max_wosize/Double_wosize) caml_invalid_argument("Array.concat"); wsize = size * Double_wosize; - res = caml_alloc(wsize, Double_array_tag); + res = local ? + caml_alloc_local(wsize, Double_array_tag) : + caml_alloc(wsize, Double_array_tag); for (i = 0, pos = 0; i < num_arrays; i++) { memcpy((double *)res + pos, (double *)arrays[i] + offsets[i], @@ -498,10 +536,15 @@ static value caml_array_gather(intnat num_arrays, CAMLassert(pos == size); } #endif - else if (size <= Max_young_wosize) { - /* Array of values, small enough to fit in young generation. + else if (size > Max_wosize) { + /* Array of values, too big. */ + caml_invalid_argument("Array.concat"); + } else if (size <= Max_young_wosize || local) { + /* Array of values, local or small enough to fit in young generation. We can use memcpy directly. */ - res = caml_alloc_small(size, 0); + res = local ? + caml_alloc_local(size, 0) : + caml_alloc_small(size, 0); for (i = 0, pos = 0; i < num_arrays; i++) { memcpy(&Field(res, pos), &Field(arrays[i], offsets[i]), @@ -509,10 +552,6 @@ static value caml_array_gather(intnat num_arrays, pos += lengths[i]; } CAMLassert(pos == size); - } - else if (size > Max_wosize) { - /* Array of values, too big. */ - caml_invalid_argument("Array.concat"); } else { /* Array of values, must be allocated in old generation and filled using caml_initialize. */ @@ -539,7 +578,15 @@ CAMLprim value caml_array_sub(value a, value ofs, value len) value arrays[1] = { a }; intnat offsets[1] = { Long_val(ofs) }; intnat lengths[1] = { Long_val(len) }; - return caml_array_gather(1, arrays, offsets, lengths); + return caml_array_gather(1, arrays, offsets, lengths, 0); +} + +CAMLprim value caml_array_sub_local(value a, value ofs, value len) +{ + value arrays[1] = { a }; + intnat offsets[1] = { Long_val(ofs) }; + intnat lengths[1] = { Long_val(len) }; + return caml_array_gather(1, arrays, offsets, lengths, 1); } CAMLprim value caml_array_append(value a1, value a2) @@ -547,10 +594,18 @@ CAMLprim value caml_array_append(value a1, value a2) value arrays[2] = { a1, a2 }; intnat offsets[2] = { 0, 0 }; intnat lengths[2] = { caml_array_length(a1), caml_array_length(a2) }; - return caml_array_gather(2, arrays, offsets, lengths); + return caml_array_gather(2, arrays, offsets, lengths, 0); } -CAMLprim value caml_array_concat(value al) +CAMLprim value caml_array_append_local(value a1, value a2) +{ + value arrays[2] = { a1, a2 }; + intnat offsets[2] = { 0, 0 }; + intnat lengths[2] = { caml_array_length(a1), caml_array_length(a2) }; + return caml_array_gather(2, arrays, offsets, lengths, 1); +} + +static value array_concat_gen(value al, int local) { #define STATIC_SIZE 16 value static_arrays[STATIC_SIZE], * arrays; @@ -587,7 +642,7 @@ CAMLprim value caml_array_concat(value al) lengths[i] = caml_array_length(Field(l, 0)); } /* Do the concatenation */ - res = caml_array_gather(n, arrays, offsets, lengths); + res = caml_array_gather(n, arrays, offsets, lengths, local); /* Free the extra storage if needed */ if (n > STATIC_SIZE) { caml_stat_free(arrays); @@ -597,6 +652,16 @@ CAMLprim value caml_array_concat(value al) return res; } +CAMLprim value caml_array_concat(value al) +{ + return array_concat_gen(al, 0); +} + +CAMLprim value caml_array_concat_local(value al) +{ + return array_concat_gen(al, 1); +} + CAMLprim value caml_array_fill(value array, value v_ofs, value v_len, @@ -619,7 +684,8 @@ CAMLprim value caml_array_fill(value array, } #endif fp = &Field(array, ofs); - if (Is_young(array)) { + if (Is_young(array) || + Color_hd(Hd_val(array)) == Local_unmarked) { for (; len > 0; len--, fp++) *fp = val; } else { int is_val_young_block = Is_block(val) && Is_young(val); diff --git a/runtime/caml/address_class.h b/runtime/caml/address_class.h index 82e5cf71ffb..5a88ba94f41 100644 --- a/runtime/caml/address_class.h +++ b/runtime/caml/address_class.h @@ -82,7 +82,7 @@ #define Is_in_heap_or_young(a) (Classify_addr(a) & (In_heap | In_young)) #define Is_in_value_area(a) \ - (Classify_addr(a) & (In_heap | In_young | In_static_data)) + (Classify_addr(a) & (In_heap | In_young | In_static_data | In_local)) #define Is_in_static_data(a) (Classify_addr(a) & In_static_data) @@ -95,6 +95,7 @@ #define In_heap 1 #define In_young 2 #define In_static_data 4 +#define In_local 8 #ifdef ARCH_SIXTYFOUR diff --git a/runtime/caml/alloc.h b/runtime/caml/alloc.h index 13f0fac2fb5..2d86cb6dfcc 100644 --- a/runtime/caml/alloc.h +++ b/runtime/caml/alloc.h @@ -36,6 +36,7 @@ CAMLextern value caml_alloc_tuple (mlsize_t wosize); CAMLextern value caml_alloc_float_array (mlsize_t len); CAMLextern value caml_alloc_string (mlsize_t len); /* len in bytes (chars) */ CAMLextern value caml_alloc_initialized_string (mlsize_t len, const char *); +CAMLextern value caml_alloc_local_string (mlsize_t len); CAMLextern value caml_copy_string (char const *); CAMLextern value caml_copy_string_array (char const **); CAMLextern value caml_copy_double (double); diff --git a/runtime/caml/gc.h b/runtime/caml/gc.h index 854f9dba81f..0a98d6391d0 100644 --- a/runtime/caml/gc.h +++ b/runtime/caml/gc.h @@ -64,4 +64,40 @@ #define Colornum_hd(hd) ((color_t) (((hd) >> 8) & 3)) #define Coloredhd_hd(hd,colnum) (((hd) & ~Caml_black) | ((colnum) << 8)) +#ifdef CAML_INTERNALS + + +#define Init_local_arena_bsize 4096 +#ifdef ARCH_SIXTYFOUR +#define Max_local_arenas 10 /* max 4G */ +#else +#define Max_local_arenas 8 /* max 1G */ +#endif + +struct caml_local_arena { + char* base; + uintnat length; + void* alloc_block; +}; +typedef struct caml_local_arenas { + int count; + intnat saved_sp; + intnat next_length; + struct caml_local_arena arenas[Max_local_arenas]; +} caml_local_arenas; + +/* Colors for locally allocated values. + (Only used during root-scanning, never visible to the rest of the GC) */ +#define Local_marked Caml_black +#define Local_unmarked Caml_blue /* allocation color of local objects */ +#define Local_scanned Caml_gray + +#define With_color_hd(hd, color) \ + (((hd) & ~Caml_black) | color) + +/* Neither a valid header nor value */ +#define Local_uninit_hd Make_header(0, 0x42, Local_unmarked) + +#endif /* CAML_INTERNALS */ + #endif /* CAML_GC_H */ diff --git a/runtime/caml/memory.h b/runtime/caml/memory.h index 07370904c20..65feda06775 100644 --- a/runtime/caml/memory.h +++ b/runtime/caml/memory.h @@ -51,6 +51,8 @@ CAMLextern value caml_alloc_shr_no_track_noexc (mlsize_t, tag_t); parameter. */ CAMLextern value caml_alloc_shr_for_minor_gc (mlsize_t, tag_t, header_t); +CAMLextern value caml_alloc_local(mlsize_t, tag_t); + CAMLextern void caml_adjust_gc_speed (mlsize_t, mlsize_t); CAMLextern void caml_alloc_dependent_memory (mlsize_t bsz); CAMLextern void caml_free_dependent_memory (mlsize_t bsz); @@ -248,6 +250,9 @@ extern void caml_alloc_small_dispatch (intnat wosize, int flags, #define Modify(fp,val) caml_modify((fp), (val)) +struct caml_local_arenas* caml_get_local_arenas(); +void caml_set_local_arenas(struct caml_local_arenas* s); + #endif /* CAML_INTERNALS */ struct caml__roots_block { diff --git a/runtime/caml/misc.h b/runtime/caml/misc.h index 3872dd89ae5..2e7ca7077a8 100644 --- a/runtime/caml/misc.h +++ b/runtime/caml/misc.h @@ -418,9 +418,11 @@ int caml_runtime_warnings_active(void); #define Debug_free_shrink Debug_tag (0x03) #define Debug_free_truncate Debug_tag (0x04) #define Debug_free_unused Debug_tag (0x05) +#define Debug_free_local Debug_tag (0x06) #define Debug_uninit_minor Debug_tag (0x10) #define Debug_uninit_major Debug_tag (0x11) #define Debug_uninit_align Debug_tag (0x15) +#define Debug_uninit_local Debug_tag (0x16) #define Debug_filler_align Debug_tag (0x85) #define Debug_pool_magic Debug_tag (0x99) diff --git a/runtime/caml/roots.h b/runtime/caml/roots.h index 8ac9d8d2635..1a60f10eea6 100644 --- a/runtime/caml/roots.h +++ b/runtime/caml/roots.h @@ -34,9 +34,11 @@ CAMLextern void caml_do_local_roots_byt (scanning_action, value *, value *, #define caml_do_local_roots caml_do_local_roots_byt #else CAMLextern void caml_do_local_roots_nat ( - scanning_action f, char * c_bottom_of_stack, + scanning_action maj, scanning_action min, + char * c_bottom_of_stack, uintnat last_retaddr, value * v_gc_regs, - struct caml__roots_block * gc_local_roots); + struct caml__roots_block * gc_local_roots, + struct caml_local_arenas* local_arenas); #define caml_do_local_roots caml_do_local_roots_nat #endif diff --git a/runtime/caml/stack.h b/runtime/caml/stack.h index 9c182ee6a88..74cd512acf3 100644 --- a/runtime/caml/stack.h +++ b/runtime/caml/stack.h @@ -44,9 +44,11 @@ #else #error "TARGET_power: wrong MODEL" #endif +/* Already_scanned optimisation not supported on this branch #define Already_scanned(sp, retaddr) ((retaddr) & 1) #define Mask_already_scanned(retaddr) ((retaddr) & ~1) #define Mark_scanned(sp, retaddr) Saved_return_address(sp) = (retaddr) | 1 +*/ #endif #ifdef TARGET_s390x diff --git a/runtime/i386.S b/runtime/i386.S index e1cc5778aa2..4ee2b46bd49 100644 --- a/runtime/i386.S +++ b/runtime/i386.S @@ -203,6 +203,41 @@ FUNCTION(caml_allocN) CFI_ENDPROC ENDFUNCTION(caml_allocN) +FUNCTION(caml_call_local_realloc) + CFI_STARTPROC + movl G(Caml_state), %ebx +#if !defined(SYS_mingw) && !defined(SYS_cygwin) + /* Touch the stack to trigger a recoverable segfault + if insufficient space remains */ + subl $(STACK_PROBE_SIZE), %esp; CFI_ADJUST(STACK_PROBE_SIZE); + movl %eax, 0(%esp) + addl $(STACK_PROBE_SIZE), %esp; CFI_ADJUST(-STACK_PROBE_SIZE); +#endif + /* Build array of registers, save it into Caml_state->gc_regs */ + pushl %ebp; CFI_ADJUST(4) + pushl %edi; CFI_ADJUST(4) + pushl %esi; CFI_ADJUST(4) + pushl %edx; CFI_ADJUST(4) + pushl %ecx; CFI_ADJUST(4) + pushl %ebx; CFI_ADJUST(4) + pushl %eax; CFI_ADJUST(4) + movl %esp, CAML_STATE(gc_regs, %ebx) + /* MacOSX note: 16-alignment of stack preserved at this point */ + /* Call the garbage collector */ + call G(caml_local_realloc) + /* Restore all regs used by the code generator */ + popl %eax; CFI_ADJUST(-4) + popl %ebx; CFI_ADJUST(-4) + popl %ecx; CFI_ADJUST(-4) + popl %edx; CFI_ADJUST(-4) + popl %esi; CFI_ADJUST(-4) + popl %edi; CFI_ADJUST(-4) + popl %ebp; CFI_ADJUST(-4) + ret + CFI_ENDPROC + ENDFUNCTION(caml_call_local_realloc) + + /* Call a C function from OCaml */ FUNCTION(caml_c_call) diff --git a/runtime/memory.c b/runtime/memory.c index 7d25d37b58d..ca09297abf9 100644 --- a/runtime/memory.c +++ b/runtime/memory.c @@ -34,6 +34,7 @@ #include "caml/signals.h" #include "caml/memprof.h" #include "caml/eventlog.h" +#include "caml/alloc.h" int caml_huge_fallback_count = 0; /* Number of times that mmapping big pages fails and we fell back to small @@ -673,6 +674,135 @@ CAMLexport CAMLweakdef void caml_modify (value *fp, value val) } } +/* This version of [caml_modify] may additionally be used to mutate + locally-allocated objects. (This version is used by mutations + generated from OCaml code when the value being modified may be + locally allocated) */ +CAMLexport void caml_modify_local (value obj, intnat i, value val) +{ + if (Color_hd(Hd_val(obj)) == Local_unmarked) { + Field(obj, i) = val; + } else { + caml_modify(&Field(obj, i), val); + } +} + +CAMLexport intnat caml_local_region_begin() +{ + return Caml_state->local_sp; +} + +CAMLexport void caml_local_region_end(intnat reg) +{ + Caml_state->local_sp = reg; +} + +CAMLexport caml_local_arenas* caml_get_local_arenas() +{ + caml_local_arenas* s = Caml_state->local_arenas; + if (s != NULL) + s->saved_sp = Caml_state->local_sp; + return s; +} + +CAMLexport void caml_set_local_arenas(caml_local_arenas* s) +{ + Caml_state->local_arenas = s; + if (s != NULL) { + struct caml_local_arena a = s->arenas[s->count - 1]; + Caml_state->local_sp = s->saved_sp; + Caml_state->local_top = (void*)(a.base + a.length); + Caml_state->local_limit = - a.length; + } else { + Caml_state->local_sp = 0; + Caml_state->local_top = NULL; + Caml_state->local_limit = 0; + } +} + +void caml_local_realloc() +{ + caml_local_arenas* s = caml_get_local_arenas(); + intnat i; + char* arena; + caml_stat_block block; + if (s == NULL) { + s = caml_stat_alloc(sizeof(*s)); + s->count = 0; + s->next_length = 0; + s->saved_sp = Caml_state->local_sp; + } + if (s->count == Max_local_arenas) + caml_fatal_error("Local allocation stack overflow - exceeded Max_local_arenas"); + + do { + if (s->next_length == 0) { + s->next_length = Init_local_arena_bsize; + } else { + /* overflow check */ + CAML_STATIC_ASSERT(((intnat)Init_local_arena_bsize << (2*Max_local_arenas)) > 0); + s->next_length *= 4; + } + /* may need to loop, if a very large allocation was requested */ + } while (s->saved_sp + s->next_length < 0); + + arena = caml_stat_alloc_aligned_noexc(s->next_length, 0, &block); + if (arena == NULL) + caml_fatal_error("Local allocation stack overflow - out of memory"); + caml_page_table_add(In_local, arena, arena + s->next_length); +#ifdef DEBUG + for (i = 0; i < s->next_length; i += sizeof(value)) { + *((header_t*)(arena + i)) = Debug_uninit_local; + } +#endif + for (i = s->saved_sp; i < 0; i += sizeof(value)) { + *((header_t*)(arena + s->next_length + i)) = Local_uninit_hd; + } + caml_gc_message(0x08, + "Growing local stack to %"ARCH_INTNAT_PRINTF_FORMAT"d kB\n", + s->next_length / 1024); + s->count++; + s->arenas[s->count-1].length = s->next_length; + s->arenas[s->count-1].base = arena; + s->arenas[s->count-1].alloc_block = block; + caml_set_local_arenas(s); + CAMLassert(Caml_state->local_limit <= Caml_state->local_sp); +} + +CAMLexport value caml_alloc_local(mlsize_t wosize, tag_t tag) +{ +#ifdef NATIVE_CODE + intnat sp = Caml_state->local_sp; + header_t* hp; + sp -= Bhsize_wosize(wosize); + Caml_state->local_sp = sp; + if (sp < Caml_state->local_limit) + caml_local_realloc(); + hp = (header_t*)((char*)Caml_state->local_top + sp); + *hp = Make_header(wosize, tag, Local_unmarked); + return Val_hp(hp); +#else + if (wosize <= Max_young_wosize) { + return caml_alloc_small(wosize, tag); + } else { + /* The return value is initialised directly using Field. + This is invalid if it may create major -> minor pointers. + So, perform a minor GC to prevent this. (See caml_make_vect) */ + caml_minor_collection(); + return caml_alloc_shr(wosize, tag); + } +#endif +} + +CAMLprim value caml_local_stack_offset(value blk) +{ +#ifdef NATIVE_CODE + intnat sp = Caml_state->local_sp; + return Val_long(-sp); +#else + return Val_long(0); +#endif +} /* Global memory pool. diff --git a/runtime/minor_gc.c b/runtime/minor_gc.c index 9155a6fd632..ac766e4dd3f 100644 --- a/runtime/minor_gc.c +++ b/runtime/minor_gc.c @@ -348,6 +348,48 @@ void caml_oldify_mopup (void) if (redo) goto again; } +#ifdef DEBUG +static void verify_minor_heap() +{ + header_t* p; + struct caml_local_arena* arena = Caml_state->local_arenas ? + &Caml_state->local_arenas->arenas[Caml_state->local_arenas->count-1] : NULL; + for (p = (header_t*)Caml_state->young_ptr; + p < (header_t*)Caml_state->young_alloc_end; + p += Whsize_hp(p)) { + header_t hd = *p; + CAMLassert_young_header(hd); + if (Tag_hd(hd) < No_scan_tag) { + intnat i = 0; + if (Tag_hd(hd) == Closure_tag) + i = Start_env_closinfo(Closinfo_val(Val_hp(p))); + for (; i < Wosize_hd(hd); i++) { + value v = Field(Val_hp(p), i); + if (Is_block(v)) { + if (Is_young(v)) CAMLassert ((value)Caml_state->young_ptr < v); + if (arena) { + CAMLassert(!(arena->base <= (char*)v && + (char*)v < arena->base + arena->length)); + } + } + } + } + } + if (arena) { + value** r; + for (r = Caml_state->ref_table->base; + r < Caml_state->ref_table->ptr; r++) { + CAMLassert(!(arena->base <= (char*)*r && + (char*)*r < arena->base + arena->length)); + if (Is_block(**r)) { + CAMLassert(!(arena->base <= (char*)**r && + (char*)**r < arena->base + arena->length)); + } + } + } +} +#endif + /* Make sure the minor heap is empty by performing a minor collection if needed. */ @@ -360,6 +402,9 @@ void caml_empty_minor_heap (void) if (Caml_state->young_ptr != Caml_state->young_alloc_end){ CAMLassert_young_header(*(header_t*)Caml_state->young_ptr); +#ifdef DEBUG + verify_minor_heap(); +#endif if (caml_minor_gc_begin_hook != NULL) (*caml_minor_gc_begin_hook) (); prev_alloc_words = caml_allocated_words; Caml_state->in_minor_collection = 1; diff --git a/runtime/obj.c b/runtime/obj.c index 4530415505a..6674835d387 100644 --- a/runtime/obj.c +++ b/runtime/obj.c @@ -68,6 +68,11 @@ CAMLprim value caml_obj_make_forward (value blk, value fwd) return Val_unit; } +CAMLprim value caml_obj_is_local(value blk) +{ + return Val_int(Is_block(blk) && Color_hd(Hd_val(blk)) == Local_unmarked); +} + /* [size] is a value encoding a number of blocks */ CAMLprim value caml_obj_block(value tag, value size) { diff --git a/runtime/roots_nat.c b/runtime/roots_nat.c index 7a01d2cdd24..0e3ff63b133 100644 --- a/runtime/roots_nat.c +++ b/runtime/roots_nat.c @@ -268,19 +268,10 @@ static void compute_index_for_global_root_scan (value* glob_block, int* start) heap. */ void caml_oldify_local_roots (void) { - char * sp; - uintnat retaddr; - value * regs; - frame_descr * d; - uintnat h; intnat i, j; - int n, ofs; - unsigned short * p; value * glob; - value * root; value glob_block; int start; - struct caml__roots_block *lr; link *lnk; /* The global roots */ @@ -307,60 +298,12 @@ void caml_oldify_local_roots (void) } } - /* The stack and local roots */ - sp = Caml_state->bottom_of_stack; - retaddr = Caml_state->last_return_address; - regs = Caml_state->gc_regs; - if (sp != NULL) { - while (1) { - /* Find the descriptor corresponding to the return address */ - h = Hash_retaddr(retaddr); - while(1) { - d = caml_frame_descriptors[h]; - if (d->retaddr == retaddr) break; - h = (h+1) & caml_frame_descriptors_mask; - } - if (d->frame_size != 0xFFFF) { - /* Scan the roots in this frame */ - for (p = d->live_ofs, n = d->num_live; n > 0; n--, p++) { - ofs = *p; - if (ofs & 1) { - root = regs + (ofs >> 1); - } else { - root = (value *)(sp + ofs); - } - Oldify (root); - } - /* Move to next frame */ - sp += (d->frame_size & 0xFFFC); - retaddr = Saved_return_address(sp); -#ifdef Already_scanned - /* Stop here if the frame has been scanned during earlier GCs */ - if (Already_scanned(sp, retaddr)) break; - /* Mark frame as already scanned */ - Mark_scanned(sp, retaddr); -#endif - } else { - /* This marks the top of a stack chunk for an ML callback. - Skip C portion of stack and continue with next ML stack chunk. */ - struct caml_context * next_context = Callback_link(sp); - sp = next_context->bottom_of_stack; - retaddr = next_context->last_retaddr; - regs = next_context->gc_regs; - /* A null sp means no more ML stack chunks; stop here. */ - if (sp == NULL) break; - } - } - } - /* Local C roots */ - for (lr = Caml_state->local_roots; lr != NULL; lr = lr->next) { - for (i = 0; i < lr->ntables; i++){ - for (j = 0; j < lr->nitems; j++){ - root = &(lr->tables[i][j]); - Oldify (root); - } - } - } + /* Stack & local C roots */ + caml_do_local_roots_nat(NULL, &caml_oldify_one, Caml_state->bottom_of_stack, + Caml_state->last_return_address, Caml_state->gc_regs, + Caml_state->local_roots, + caml_get_local_arenas()); + /* Global C roots */ caml_scan_global_young_roots(&caml_oldify_one); /* Finalised values */ @@ -464,9 +407,10 @@ void caml_do_roots (scanning_action f, int do_globals) CAML_EV_END(EV_MAJOR_ROOTS_DYNAMIC_GLOBAL); /* The stack and local roots */ CAML_EV_BEGIN(EV_MAJOR_ROOTS_LOCAL); - caml_do_local_roots_nat(f, Caml_state->bottom_of_stack, + caml_do_local_roots_nat(f, f, Caml_state->bottom_of_stack, Caml_state->last_return_address, Caml_state->gc_regs, - Caml_state->local_roots); + Caml_state->local_roots, + caml_get_local_arenas()); CAML_EV_END(EV_MAJOR_ROOTS_LOCAL); /* Global C roots */ CAML_EV_BEGIN(EV_MAJOR_ROOTS_C); @@ -486,9 +430,154 @@ void caml_do_roots (scanning_action f, int do_globals) CAML_EV_END(EV_MAJOR_ROOTS_HOOK); } -void caml_do_local_roots_nat(scanning_action f, char * bottom_of_stack, +/* Returns 1 if it visits an unmarked local block */ +static int visit(scanning_action maj, scanning_action min, + value* p) +{ + value v = *p, vblock = v; + header_t hd; + if (!Is_block(v)) + return 0; + + hd = Hd_val(vblock); + /* Compaction can create things that look like Infix_tag, + but have color Caml_gray (cf. eptr in compact.c). + So, check Color_hd(hd) too. */ + if (Color_hd(hd) == 0 && Tag_hd(hd) == Infix_tag) { + vblock -= Infix_offset_val(v); + hd = Hd_val(vblock); + } + + if (Color_hd(hd) == Caml_black) + return 0; + + if (Is_young(vblock)) { + if (min != NULL) min(v, p); + return 0; + } + + if (Color_hd(hd) == Local_unmarked) { + Hd_val(vblock) = With_color_hd(hd, Local_marked); + return 1; + } + + if (maj != NULL) maj(v, p); + return 0; +} + +static int get_local_ix(caml_local_arenas* loc, value v) +{ + int i; + CAMLassert(Is_block(v)); + for (i = 0; i < loc->count; i++) { + struct caml_local_arena arena = loc->arenas[i]; + if (arena.base <= (char*)v && (char*)v < arena.base + arena.length) + return i; + } + caml_fatal_error("not a local value"); +} + +static void do_local_allocations(caml_local_arenas* loc, + scanning_action maj, scanning_action min) +{ + int arena_ix; + intnat sp; + struct caml_local_arena arena; + + if (loc == NULL) return; + CAMLassert(loc->count > 0); + sp = loc->saved_sp; + arena_ix = loc->count - 1; + arena = loc->arenas[arena_ix]; + + while (sp < 0) { + header_t* hp = (header_t*)(arena.base + arena.length + sp), hd = *hp; + intnat i; + + if (hd == Local_uninit_hd) { + CAMLassert(arena_ix > 0); + arena = loc->arenas[--arena_ix]; + continue; + } + if (Color_hd(hd) != Local_marked) { + sp += Bhsize_hd(hd); + continue; + } + *hp = With_color_hd(hd, Local_scanned); + if (Tag_hd(hd) >= No_scan_tag) { + sp += Bhsize_hd(hd); + continue; + } + i = 0; + if (Tag_hd(hd) == Closure_tag) + i = Start_env_closinfo(Closinfo_val(Val_hp(hp))); + for (; i < Wosize_hd(hd); i++) { + value *p = &Field(Val_hp(hp), i); + int marked_local = visit(maj, min, p); + if (marked_local) { + int ix = get_local_ix(loc, *p); + struct caml_local_arena a = loc->arenas[ix]; + intnat newsp = (char*)p - (a.base + a.length); + if (sp <= newsp) { + /* forwards pointer, common case */ + CAMLassert(ix <= arena_ix); + } else { + /* If backwards pointers are ever supported (e.g. local recursive + values), then this should reset sp and iterate to a fixpoint */ + CAMLassert(ix >= arena_ix); + caml_fatal_error("backwards local pointer"); + } + } + } + sp += Bhsize_hd(hd); + } + + /* clear marks */ + sp = loc->saved_sp; + arena_ix = loc->count - 1; + arena = loc->arenas[arena_ix]; +#ifdef DEBUG + { header_t* hp; + for (hp = (header_t*)arena.base; + hp < (header_t*)(arena.base + arena.length + sp); + hp++) { + *hp = Debug_free_local; + } + } +#endif + + while (sp < 0) { + header_t* hp = (header_t*)(arena.base + arena.length + sp); + if (*hp == Local_uninit_hd) { + arena = loc->arenas[--arena_ix]; +#ifdef DEBUG + for (hp = (header_t*)arena.base; + hp < (header_t*)(arena.base + arena.length + sp); + hp++) { + *hp = Debug_free_local; + } +#endif + continue; + } +#ifdef DEBUG + CAMLassert(Color_hd(*hp) != Local_marked); + if (Color_hd(*hp) == Local_unmarked) { + intnat i; + for (i = 0; i < Wosize_hd(*hp); i++) { + Field(Val_hp(hp), i) = Debug_free_local; + } + } +#endif + *hp = With_color_hd(*hp, Local_unmarked); + sp += Bhsize_hp(hp); + } +} + +void caml_do_local_roots_nat(scanning_action maj, scanning_action min, + char * bottom_of_stack, uintnat last_retaddr, value * gc_regs, - struct caml__roots_block * local_roots) + struct caml__roots_block * local_roots, + caml_local_arenas* arenas) { char * sp; uintnat retaddr; @@ -521,7 +610,7 @@ void caml_do_local_roots_nat(scanning_action f, char * bottom_of_stack, } else { root = (value *)(sp + ofs); } - f (*root, root); + visit(maj, min, root); } /* Move to next frame */ sp += (d->frame_size & 0xFFFC); @@ -546,10 +635,12 @@ void caml_do_local_roots_nat(scanning_action f, char * bottom_of_stack, for (i = 0; i < lr->ntables; i++){ for (j = 0; j < lr->nitems; j++){ root = &(lr->tables[i][j]); - f (*root, root); + visit(maj, min, root); } } } + /* Local allocations */ + do_local_allocations(arenas, maj, min); } uintnat (*caml_stack_usage_hook)(void) = NULL; diff --git a/runtime/startup_byt.c b/runtime/startup_byt.c index a06617da67d..95b38e72033 100644 --- a/runtime/startup_byt.c +++ b/runtime/startup_byt.c @@ -450,8 +450,11 @@ CAMLexport void caml_main(char_os **argv) caml_close_channel(chan); /* this also closes fd */ caml_stat_free(trail.section); /* Ensure that the globals are in the major heap. */ - caml_oldify_one (caml_global_data, &caml_global_data); - caml_oldify_mopup (); + { + CAMLparam1(caml_global_data); + caml_minor_collection(); + CAMLdrop; + } /* Initialize system libraries */ caml_sys_init(exe_name, argv + pos); /* Load debugging info, if b>=2 */ @@ -540,8 +543,11 @@ CAMLexport value caml_startup_code_exn( /* Load the globals */ caml_global_data = caml_input_value_from_block(data, data_size); /* Ensure that the globals are in the major heap. */ - caml_oldify_one (caml_global_data, &caml_global_data); - caml_oldify_mopup (); + { + CAMLparam1(caml_global_data); + caml_minor_collection(); + CAMLdrop; + } /* Record the sections (for caml_get_section_table in meta.c) */ caml_section_table = section_table; caml_section_table_size = section_table_size; diff --git a/runtime/str.c b/runtime/str.c index 32ca54c7a58..aa5b650ccf3 100644 --- a/runtime/str.c +++ b/runtime/str.c @@ -78,6 +78,14 @@ CAMLprim value caml_create_bytes(value len) return caml_alloc_string(size); } +CAMLprim value caml_create_local_bytes(value len) +{ + mlsize_t size = Long_val(len); + if (size > Bsize_wsize (Max_wosize) - 1){ + caml_invalid_argument("Bytes.create"); + } + return caml_alloc_local_string(size); +} CAMLprim value caml_string_get(value str, value index) diff --git a/stdlib/float.ml b/stdlib/float.ml index 76389e0a2a3..168c55d6c58 100644 --- a/stdlib/float.ml +++ b/stdlib/float.ml @@ -21,16 +21,16 @@ open! Stdlib [@@@ocaml.nolabels] -external neg : float -> float = "%negfloat" -external add : float -> float -> float = "%addfloat" -external sub : float -> float -> float = "%subfloat" -external mul : float -> float -> float = "%mulfloat" -external div : float -> float -> float = "%divfloat" +external neg : (float[@local_opt]) -> (float[@local_opt]) = "%negfloat" +external add : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%addfloat" +external sub : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%subfloat" +external mul : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%mulfloat" +external div : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%divfloat" external rem : float -> float -> float = "caml_fmod_float" "fmod" [@@unboxed] [@@noalloc] external fma : float -> float -> float -> float = "caml_fma_float" "caml_fma" [@@unboxed] [@@noalloc] -external abs : float -> float = "%absfloat" +external abs : (float[@local_opt]) -> (float[@local_opt]) = "%absfloat" let zero = 0. let one = 1. @@ -46,7 +46,7 @@ let pi = 0x1.921fb54442d18p+1 let max_float = Stdlib.max_float let min_float = Stdlib.min_float let epsilon = Stdlib.epsilon_float -external of_int : int -> float = "%floatofint" +external of_int : int -> (float[@local_opt]) = "%floatofint" external to_int : float -> int = "%intoffloat" external of_string : string -> float = "caml_float_of_string" let of_string_opt = Stdlib.float_of_string_opt diff --git a/stdlib/float.mli b/stdlib/float.mli index 85696eb6a1d..2dac4e1707b 100644 --- a/stdlib/float.mli +++ b/stdlib/float.mli @@ -53,19 +53,19 @@ val minus_one : float (** The floating-point -1. @since 4.08.0 *) -external neg : float -> float = "%negfloat" +external neg : (float[@local_opt]) -> (float[@local_opt]) = "%negfloat" (** Unary negation. *) -external add : float -> float -> float = "%addfloat" +external add : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%addfloat" (** Floating-point addition. *) -external sub : float -> float -> float = "%subfloat" +external sub : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%subfloat" (** Floating-point subtraction. *) -external mul : float -> float -> float = "%mulfloat" +external mul : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%mulfloat" (** Floating-point multiplication. *) -external div : float -> float -> float = "%divfloat" +external div : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%divfloat" (** Floating-point division. *) external fma : float -> float -> float -> float = @@ -95,7 +95,7 @@ val pred : float -> float {!next_after}. @since 4.08.0 *) -external abs : float -> float = "%absfloat" +external abs : (float[@local_opt]) -> (float[@local_opt]) = "%absfloat" (** [abs f] returns the absolute value of [f]. *) val infinity : float @@ -147,7 +147,7 @@ val is_integer : float -> bool @since 4.08.0 *) -external of_int : int -> float = "%floatofint" +external of_int : int -> (float[@local_opt]) = "%floatofint" (** Convert an integer to floating-point. *) external to_int : float -> int = "%intoffloat" diff --git a/stdlib/int.ml b/stdlib/int.ml index e1f2d56c43a..3bd50fcfa66 100644 --- a/stdlib/int.ml +++ b/stdlib/int.ml @@ -23,28 +23,28 @@ type t = int let zero = 0 let one = 1 let minus_one = -1 -external neg : int -> int = "%negint" -external add : int -> int -> int = "%addint" -external sub : int -> int -> int = "%subint" -external mul : int -> int -> int = "%mulint" -external div : int -> int -> int = "%divint" -external rem : int -> int -> int = "%modint" -external succ : int -> int = "%succint" -external pred : int -> int = "%predint" +external neg : (int[@local_opt]) -> int = "%negint" +external add : (int[@local_opt]) -> (int[@local_opt]) -> int = "%addint" +external sub : (int[@local_opt]) -> (int[@local_opt]) -> int = "%subint" +external mul : (int[@local_opt]) -> (int[@local_opt]) -> int = "%mulint" +external div : (int[@local_opt]) -> (int[@local_opt]) -> int = "%divint" +external rem : (int[@local_opt]) -> (int[@local_opt]) -> int = "%modint" +external succ : (int[@local_opt]) -> int = "%succint" +external pred : (int[@local_opt]) -> int = "%predint" let abs x = if x >= 0 then x else -x let max_int = (-1) lsr 1 let min_int = max_int + 1 -external logand : int -> int -> int = "%andint" -external logor : int -> int -> int = "%orint" -external logxor : int -> int -> int = "%xorint" +external logand : (int[@local_opt]) -> (int[@local_opt]) -> int = "%andint" +external logor : (int[@local_opt]) -> (int[@local_opt]) -> int = "%orint" +external logxor : (int[@local_opt]) -> (int[@local_opt]) -> int = "%xorint" let lognot x = logxor x (-1) -external shift_left : int -> int -> int = "%lslint" -external shift_right : int -> int -> int = "%asrint" -external shift_right_logical : int -> int -> int = "%lsrint" +external shift_left : (int[@local_opt]) -> (int[@local_opt]) -> int = "%lslint" +external shift_right : (int[@local_opt]) -> (int[@local_opt]) -> int = "%asrint" +external shift_right_logical : (int[@local_opt]) -> (int[@local_opt]) -> int = "%lsrint" let equal : int -> int -> bool = ( = ) let compare : int -> int -> int = Stdlib.compare -external to_float : int -> float = "%floatofint" -external of_float : float -> int = "%intoffloat" +external to_float : (int[@local_opt]) -> (float[@local_opt]) = "%floatofint" +external of_float : (float[@local_opt]) -> int = "%intoffloat" (* external int_of_string : string -> int = "caml_int_of_string" diff --git a/stdlib/int.mli b/stdlib/int.mli index 45a1474c04e..b81d05a03da 100644 --- a/stdlib/int.mli +++ b/stdlib/int.mli @@ -38,28 +38,28 @@ val one : int val minus_one : int (** [minus_one] is the integer [-1]. *) -external neg : int -> int = "%negint" +external neg : (int[@local_opt]) -> int = "%negint" (** [neg x] is [~-x]. *) -external add : int -> int -> int = "%addint" +external add : (int[@local_opt]) -> (int[@local_opt]) -> int = "%addint" (** [add x y] is the addition [x + y]. *) -external sub : int -> int -> int = "%subint" +external sub : (int[@local_opt]) -> (int[@local_opt]) -> int = "%subint" (** [sub x y] is the subtraction [x - y]. *) -external mul : int -> int -> int = "%mulint" +external mul : (int[@local_opt]) -> (int[@local_opt]) -> int = "%mulint" (** [mul x y] is the multiplication [x * y]. *) -external div : int -> int -> int = "%divint" +external div : (int[@local_opt]) -> (int[@local_opt]) -> int = "%divint" (** [div x y] is the division [x / y]. See {!Stdlib.( / )} for details. *) -external rem : int -> int -> int = "%modint" +external rem : (int[@local_opt]) -> (int[@local_opt]) -> int = "%modint" (** [rem x y] is the remainder [x mod y]. See {!Stdlib.( mod )} for details. *) -external succ : int -> int = "%succint" +external succ : (int[@local_opt]) -> int = "%succint" (** [succ x] is [add x 1]. *) -external pred : int -> int = "%predint" +external pred : (int[@local_opt]) -> int = "%predint" (** [pred x] is [sub x 1]. *) val abs : int -> int @@ -75,29 +75,29 @@ val min_int : int (** [min_int] is the smallest representable integer, [-2{^[Sys.int_size - 1]}]. *) -external logand : int -> int -> int = "%andint" +external logand : (int[@local_opt]) -> (int[@local_opt]) -> int = "%andint" (** [logand x y] is the bitwise logical and of [x] and [y]. *) -external logor : int -> int -> int = "%orint" +external logor : (int[@local_opt]) -> (int[@local_opt]) -> int = "%orint" (** [logor x y] is the bitwise logical or of [x] and [y]. *) -external logxor : int -> int -> int = "%xorint" +external logxor : (int[@local_opt]) -> (int[@local_opt]) -> int = "%xorint" (** [logxor x y] is the bitwise logical exclusive or of [x] and [y]. *) val lognot : int -> int (** [lognot x] is the bitwise logical negation of [x]. *) -external shift_left : int -> int -> int = "%lslint" +external shift_left : (int[@local_opt]) -> (int[@local_opt]) -> int = "%lslint" (** [shift_left x n] shifts [x] to the left by [n] bits. The result is unspecified if [n < 0] or [n > ]{!Sys.int_size}. *) -external shift_right : int -> int -> int = "%asrint" +external shift_right : (int[@local_opt]) -> (int[@local_opt]) -> int = "%asrint" (** [shift_right x n] shifts [x] to the right by [n] bits. This is an arithmetic shift: the sign bit of [x] is replicated and inserted in the vacated bits. The result is unspecified if [n < 0] or [n > ]{!Sys.int_size}. *) -external shift_right_logical : int -> int -> int = "%lsrint" +external shift_right_logical : (int[@local_opt]) -> (int[@local_opt]) -> int = "%lsrint" (** [shift_right x n] shifts [x] to the right by [n] bits. This is a logical shift: zeroes are inserted in the vacated bits regardless of the sign of [x]. The result is unspecified if [n < 0] or @@ -113,10 +113,10 @@ val compare : int -> int -> int (** {1:convert Converting} *) -external to_float : int -> float = "%floatofint" +external to_float : (int[@local_opt]) -> (float[@local_opt]) = "%floatofint" (** [to_float x] is [x] as a floating point number. *) -external of_float : float -> int = "%intoffloat" +external of_float : (float[@local_opt]) -> int = "%intoffloat" (** [of_float x] truncates [x] to an integer. The result is unspecified if the argument is [nan] or falls outside the range of representable integers. *) diff --git a/stdlib/int32.ml b/stdlib/int32.ml index 0f48534942b..27c8954f3b1 100644 --- a/stdlib/int32.ml +++ b/stdlib/int32.ml @@ -20,20 +20,20 @@ open! Stdlib (* Module [Int32]: 32-bit integers *) -external neg : int32 -> int32 = "%int32_neg" -external add : int32 -> int32 -> int32 = "%int32_add" -external sub : int32 -> int32 -> int32 = "%int32_sub" -external mul : int32 -> int32 -> int32 = "%int32_mul" -external div : int32 -> int32 -> int32 = "%int32_div" -external rem : int32 -> int32 -> int32 = "%int32_mod" -external logand : int32 -> int32 -> int32 = "%int32_and" -external logor : int32 -> int32 -> int32 = "%int32_or" -external logxor : int32 -> int32 -> int32 = "%int32_xor" -external shift_left : int32 -> int -> int32 = "%int32_lsl" -external shift_right : int32 -> int -> int32 = "%int32_asr" -external shift_right_logical : int32 -> int -> int32 = "%int32_lsr" -external of_int : int -> int32 = "%int32_of_int" -external to_int : int32 -> int = "%int32_to_int" +external neg : (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_neg" +external add : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_add" +external sub : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_sub" +external mul : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_mul" +external div : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_div" +external rem : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_mod" +external logand : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_and" +external logor : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_or" +external logxor : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_xor" +external shift_left : (int32[@local_opt]) -> int -> (int32[@local_opt]) = "%int32_lsl" +external shift_right : (int32[@local_opt]) -> int -> (int32[@local_opt]) = "%int32_asr" +external shift_right_logical : (int32[@local_opt]) -> int -> (int32[@local_opt]) = "%int32_lsr" +external of_int : int -> (int32[@local_opt]) = "%int32_of_int" +external to_int : (int32[@local_opt]) -> int = "%int32_to_int" external of_float : float -> int32 = "caml_int32_of_float" "caml_int32_of_float_unboxed" [@@unboxed] [@@noalloc] diff --git a/stdlib/int32.mli b/stdlib/int32.mli index c9d4b89f03b..92e62f54180 100644 --- a/stdlib/int32.mli +++ b/stdlib/int32.mli @@ -46,19 +46,19 @@ val one : int32 val minus_one : int32 (** The 32-bit integer -1. *) -external neg : int32 -> int32 = "%int32_neg" +external neg : (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_neg" (** Unary negation. *) -external add : int32 -> int32 -> int32 = "%int32_add" +external add : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_add" (** Addition. *) -external sub : int32 -> int32 -> int32 = "%int32_sub" +external sub : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_sub" (** Subtraction. *) -external mul : int32 -> int32 -> int32 = "%int32_mul" +external mul : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_mul" (** Multiplication. *) -external div : int32 -> int32 -> int32 = "%int32_div" +external div : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_div" (** Integer division. This division rounds the real quotient of its arguments towards zero, as specified for {!Stdlib.(/)}. @raise Division_by_zero if the second @@ -70,7 +70,7 @@ val unsigned_div : int32 -> int32 -> int32 @since 4.08.0 *) -external rem : int32 -> int32 -> int32 = "%int32_mod" +external rem : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_mod" (** Integer remainder. If [y] is not zero, the result of [Int32.rem x y] satisfies the following property: [x = Int32.add (Int32.mul (Int32.div x y) y) (Int32.rem x y)]. @@ -98,40 +98,40 @@ val min_int : int32 (** The smallest representable 32-bit integer, -2{^31}. *) -external logand : int32 -> int32 -> int32 = "%int32_and" +external logand : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_and" (** Bitwise logical and. *) -external logor : int32 -> int32 -> int32 = "%int32_or" +external logor : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_or" (** Bitwise logical or. *) -external logxor : int32 -> int32 -> int32 = "%int32_xor" +external logxor : (int32[@local_opt]) -> (int32[@local_opt]) -> (int32[@local_opt]) = "%int32_xor" (** Bitwise logical exclusive or. *) val lognot : int32 -> int32 (** Bitwise logical negation. *) -external shift_left : int32 -> int -> int32 = "%int32_lsl" +external shift_left : (int32[@local_opt]) -> int -> (int32[@local_opt]) = "%int32_lsl" (** [Int32.shift_left x y] shifts [x] to the left by [y] bits. The result is unspecified if [y < 0] or [y >= 32]. *) -external shift_right : int32 -> int -> int32 = "%int32_asr" +external shift_right : (int32[@local_opt]) -> int -> (int32[@local_opt]) = "%int32_asr" (** [Int32.shift_right x y] shifts [x] to the right by [y] bits. This is an arithmetic shift: the sign bit of [x] is replicated and inserted in the vacated bits. The result is unspecified if [y < 0] or [y >= 32]. *) -external shift_right_logical : int32 -> int -> int32 = "%int32_lsr" +external shift_right_logical : (int32[@local_opt]) -> int -> (int32[@local_opt]) = "%int32_lsr" (** [Int32.shift_right_logical x y] shifts [x] to the right by [y] bits. This is a logical shift: zeroes are inserted in the vacated bits regardless of the sign of [x]. The result is unspecified if [y < 0] or [y >= 32]. *) -external of_int : int -> int32 = "%int32_of_int" +external of_int : int -> (int32[@local_opt]) = "%int32_of_int" (** Convert the given integer (type [int]) to a 32-bit integer (type [int32]). On 64-bit platforms, the argument is taken modulo 2{^32}. *) -external to_int : int32 -> int = "%int32_to_int" +external to_int : (int32[@local_opt]) -> int = "%int32_to_int" (** Convert the given 32-bit integer (type [int32]) to an integer (type [int]). On 32-bit platforms, the 32-bit integer is taken modulo 2{^31}, i.e. the high-order bit is lost diff --git a/stdlib/int64.ml b/stdlib/int64.ml index 4f47109033d..4c688df62cf 100644 --- a/stdlib/int64.ml +++ b/stdlib/int64.ml @@ -20,20 +20,20 @@ open! Stdlib (* Module [Int64]: 64-bit integers *) -external neg : int64 -> int64 = "%int64_neg" -external add : int64 -> int64 -> int64 = "%int64_add" -external sub : int64 -> int64 -> int64 = "%int64_sub" -external mul : int64 -> int64 -> int64 = "%int64_mul" -external div : int64 -> int64 -> int64 = "%int64_div" -external rem : int64 -> int64 -> int64 = "%int64_mod" -external logand : int64 -> int64 -> int64 = "%int64_and" -external logor : int64 -> int64 -> int64 = "%int64_or" -external logxor : int64 -> int64 -> int64 = "%int64_xor" -external shift_left : int64 -> int -> int64 = "%int64_lsl" -external shift_right : int64 -> int -> int64 = "%int64_asr" -external shift_right_logical : int64 -> int -> int64 = "%int64_lsr" -external of_int : int -> int64 = "%int64_of_int" -external to_int : int64 -> int = "%int64_to_int" +external neg : (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_neg" +external add : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_add" +external sub : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_sub" +external mul : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_mul" +external div : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_div" +external rem : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_mod" +external logand : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_and" +external logor : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_or" +external logxor : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_xor" +external shift_left : (int64[@local_opt]) -> int -> (int64[@local_opt]) = "%int64_lsl" +external shift_right : (int64[@local_opt]) -> int -> (int64[@local_opt]) = "%int64_asr" +external shift_right_logical : (int64[@local_opt]) -> int -> (int64[@local_opt]) = "%int64_lsr" +external of_int : int -> (int64[@local_opt]) = "%int64_of_int" +external to_int : (int64[@local_opt]) -> int = "%int64_to_int" external of_float : float -> int64 = "caml_int64_of_float" "caml_int64_of_float_unboxed" [@@unboxed] [@@noalloc] diff --git a/stdlib/int64.mli b/stdlib/int64.mli index 4639a1965f0..43a63613aba 100644 --- a/stdlib/int64.mli +++ b/stdlib/int64.mli @@ -46,19 +46,19 @@ val one : int64 val minus_one : int64 (** The 64-bit integer -1. *) -external neg : int64 -> int64 = "%int64_neg" +external neg : (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_neg" (** Unary negation. *) -external add : int64 -> int64 -> int64 = "%int64_add" +external add : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_add" (** Addition. *) -external sub : int64 -> int64 -> int64 = "%int64_sub" +external sub : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_sub" (** Subtraction. *) -external mul : int64 -> int64 -> int64 = "%int64_mul" +external mul : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_mul" (** Multiplication. *) -external div : int64 -> int64 -> int64 = "%int64_div" +external div : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_div" (** Integer division. @raise Division_by_zero if the second argument is zero. This division rounds the real quotient of @@ -70,7 +70,7 @@ val unsigned_div : int64 -> int64 -> int64 @since 4.08.0 *) -external rem : int64 -> int64 -> int64 = "%int64_mod" +external rem : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_mod" (** Integer remainder. If [y] is not zero, the result of [Int64.rem x y] satisfies the following property: [x = Int64.add (Int64.mul (Int64.div x y) y) (Int64.rem x y)]. @@ -97,39 +97,39 @@ val max_int : int64 val min_int : int64 (** The smallest representable 64-bit integer, -2{^63}. *) -external logand : int64 -> int64 -> int64 = "%int64_and" +external logand : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_and" (** Bitwise logical and. *) -external logor : int64 -> int64 -> int64 = "%int64_or" +external logor : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_or" (** Bitwise logical or. *) -external logxor : int64 -> int64 -> int64 = "%int64_xor" +external logxor : (int64[@local_opt]) -> (int64[@local_opt]) -> (int64[@local_opt]) = "%int64_xor" (** Bitwise logical exclusive or. *) val lognot : int64 -> int64 (** Bitwise logical negation. *) -external shift_left : int64 -> int -> int64 = "%int64_lsl" +external shift_left : (int64[@local_opt]) -> int -> (int64[@local_opt]) = "%int64_lsl" (** [Int64.shift_left x y] shifts [x] to the left by [y] bits. The result is unspecified if [y < 0] or [y >= 64]. *) -external shift_right : int64 -> int -> int64 = "%int64_asr" +external shift_right : (int64[@local_opt]) -> int -> (int64[@local_opt]) = "%int64_asr" (** [Int64.shift_right x y] shifts [x] to the right by [y] bits. This is an arithmetic shift: the sign bit of [x] is replicated and inserted in the vacated bits. The result is unspecified if [y < 0] or [y >= 64]. *) -external shift_right_logical : int64 -> int -> int64 = "%int64_lsr" +external shift_right_logical : (int64[@local_opt]) -> int -> (int64[@local_opt]) = "%int64_lsr" (** [Int64.shift_right_logical x y] shifts [x] to the right by [y] bits. This is a logical shift: zeroes are inserted in the vacated bits regardless of the sign of [x]. The result is unspecified if [y < 0] or [y >= 64]. *) -external of_int : int -> int64 = "%int64_of_int" +external of_int : int -> (int64[@local_opt]) = "%int64_of_int" (** Convert the given integer (type [int]) to a 64-bit integer (type [int64]). *) -external to_int : int64 -> int = "%int64_to_int" +external to_int : (int64[@local_opt]) -> int = "%int64_to_int" (** Convert the given 64-bit integer (type [int64]) to an integer (type [int]). On 64-bit platforms, the 64-bit integer is taken modulo 2{^63}, i.e. the high-order bit is lost diff --git a/stdlib/nativeint.ml b/stdlib/nativeint.ml index e01bb989356..cf9eb6f2212 100644 --- a/stdlib/nativeint.ml +++ b/stdlib/nativeint.ml @@ -20,20 +20,20 @@ open! Stdlib (* Module [Nativeint]: processor-native integers *) -external neg: nativeint -> nativeint = "%nativeint_neg" -external add: nativeint -> nativeint -> nativeint = "%nativeint_add" -external sub: nativeint -> nativeint -> nativeint = "%nativeint_sub" -external mul: nativeint -> nativeint -> nativeint = "%nativeint_mul" -external div: nativeint -> nativeint -> nativeint = "%nativeint_div" -external rem: nativeint -> nativeint -> nativeint = "%nativeint_mod" -external logand: nativeint -> nativeint -> nativeint = "%nativeint_and" -external logor: nativeint -> nativeint -> nativeint = "%nativeint_or" -external logxor: nativeint -> nativeint -> nativeint = "%nativeint_xor" -external shift_left: nativeint -> int -> nativeint = "%nativeint_lsl" -external shift_right: nativeint -> int -> nativeint = "%nativeint_asr" -external shift_right_logical: nativeint -> int -> nativeint = "%nativeint_lsr" -external of_int: int -> nativeint = "%nativeint_of_int" -external to_int: nativeint -> int = "%nativeint_to_int" +external neg: (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_neg" +external add: (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_add" +external sub: (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_sub" +external mul: (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_mul" +external div: (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_div" +external rem: (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_mod" +external logand: (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_and" +external logor: (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_or" +external logxor: (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_xor" +external shift_left: (nativeint[@local_opt]) -> int -> (nativeint[@local_opt]) = "%nativeint_lsl" +external shift_right: (nativeint[@local_opt]) -> int -> (nativeint[@local_opt]) = "%nativeint_asr" +external shift_right_logical: (nativeint[@local_opt]) -> int -> (nativeint[@local_opt]) = "%nativeint_lsr" +external of_int: int -> (nativeint[@local_opt]) = "%nativeint_of_int" +external to_int: (nativeint[@local_opt]) -> int = "%nativeint_to_int" external of_float : float -> nativeint = "caml_nativeint_of_float" "caml_nativeint_of_float_unboxed" [@@unboxed] [@@noalloc] diff --git a/stdlib/nativeint.mli b/stdlib/nativeint.mli index 3ba7d62e828..007c7d56756 100644 --- a/stdlib/nativeint.mli +++ b/stdlib/nativeint.mli @@ -49,19 +49,19 @@ val one : nativeint val minus_one : nativeint (** The native integer -1.*) -external neg : nativeint -> nativeint = "%nativeint_neg" +external neg : (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_neg" (** Unary negation. *) -external add : nativeint -> nativeint -> nativeint = "%nativeint_add" +external add : (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_add" (** Addition. *) -external sub : nativeint -> nativeint -> nativeint = "%nativeint_sub" +external sub : (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_sub" (** Subtraction. *) -external mul : nativeint -> nativeint -> nativeint = "%nativeint_mul" +external mul : (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_mul" (** Multiplication. *) -external div : nativeint -> nativeint -> nativeint = "%nativeint_div" +external div : (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_div" (** Integer division. This division rounds the real quotient of its arguments towards zero, as specified for {!Stdlib.(/)}. @@ -74,7 +74,7 @@ val unsigned_div : nativeint -> nativeint -> nativeint @since 4.08.0 *) -external rem : nativeint -> nativeint -> nativeint = "%nativeint_mod" +external rem : (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_mod" (** Integer remainder. If [y] is not zero, the result of [Nativeint.rem x y] satisfies the following properties: [Nativeint.zero <= Nativeint.rem x y < Nativeint.abs y] and @@ -113,32 +113,32 @@ val min_int : nativeint either -2{^31} on a 32-bit platform, or -2{^63} on a 64-bit platform. *) -external logand : nativeint -> nativeint -> nativeint = "%nativeint_and" +external logand : (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_and" (** Bitwise logical and. *) -external logor : nativeint -> nativeint -> nativeint = "%nativeint_or" +external logor : (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_or" (** Bitwise logical or. *) -external logxor : nativeint -> nativeint -> nativeint = "%nativeint_xor" +external logxor : (nativeint[@local_opt]) -> (nativeint[@local_opt]) -> (nativeint[@local_opt]) = "%nativeint_xor" (** Bitwise logical exclusive or. *) val lognot : nativeint -> nativeint (** Bitwise logical negation. *) -external shift_left : nativeint -> int -> nativeint = "%nativeint_lsl" +external shift_left : (nativeint[@local_opt]) -> int -> (nativeint[@local_opt]) = "%nativeint_lsl" (** [Nativeint.shift_left x y] shifts [x] to the left by [y] bits. The result is unspecified if [y < 0] or [y >= bitsize], where [bitsize] is [32] on a 32-bit platform and [64] on a 64-bit platform. *) -external shift_right : nativeint -> int -> nativeint = "%nativeint_asr" +external shift_right : (nativeint[@local_opt]) -> int -> (nativeint[@local_opt]) = "%nativeint_asr" (** [Nativeint.shift_right x y] shifts [x] to the right by [y] bits. This is an arithmetic shift: the sign bit of [x] is replicated and inserted in the vacated bits. The result is unspecified if [y < 0] or [y >= bitsize]. *) external shift_right_logical : - nativeint -> int -> nativeint = "%nativeint_lsr" + (nativeint[@local_opt]) -> int -> (nativeint[@local_opt]) = "%nativeint_lsr" (** [Nativeint.shift_right_logical x y] shifts [x] to the right by [y] bits. This is a logical shift: zeroes are inserted in the vacated bits @@ -146,11 +146,11 @@ external shift_right_logical : The result is unspecified if [y < 0] or [y >= bitsize]. *) -external of_int : int -> nativeint = "%nativeint_of_int" +external of_int : int -> (nativeint[@local_opt]) = "%nativeint_of_int" (** Convert the given integer (type [int]) to a native integer (type [nativeint]). *) -external to_int : nativeint -> int = "%nativeint_to_int" +external to_int : (nativeint[@local_opt]) -> int = "%nativeint_to_int" (** Convert the given native integer (type [nativeint]) to an integer (type [int]). The high-order bit is lost during the conversion. *) diff --git a/stdlib/oo.mli b/stdlib/oo.mli index 07befe92409..079f84d32c6 100644 --- a/stdlib/oo.mli +++ b/stdlib/oo.mli @@ -18,6 +18,8 @@ open! Stdlib (** Operations on objects *) +[@@@ocaml.noprincipal] (* preserve structure sharing in copy (PR#9767) *) + val copy : (< .. > as 'a) -> 'a (** [Oo.copy o] returns a copy of object [o], that is a fresh object with the same methods and instance variables as [o]. *) diff --git a/stdlib/stdlib.ml b/stdlib/stdlib.ml index bf24d69b2ee..9398b81f170 100644 --- a/stdlib/stdlib.ml +++ b/stdlib/stdlib.ml @@ -67,63 +67,63 @@ external __POS_OF__ : 'a -> (string * int * int * int) * 'a = "%loc_POS" (* Comparisons *) -external ( = ) : 'a -> 'a -> bool = "%equal" -external ( <> ) : 'a -> 'a -> bool = "%notequal" -external ( < ) : 'a -> 'a -> bool = "%lessthan" -external ( > ) : 'a -> 'a -> bool = "%greaterthan" -external ( <= ) : 'a -> 'a -> bool = "%lessequal" -external ( >= ) : 'a -> 'a -> bool = "%greaterequal" -external compare : 'a -> 'a -> int = "%compare" +external ( = ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%equal" +external ( <> ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%notequal" +external ( < ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%lessthan" +external ( > ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%greaterthan" +external ( <= ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%lessequal" +external ( >= ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%greaterequal" +external compare : ('a[@local_opt]) -> ('a[@local_opt]) -> int = "%compare" let min x y = if x <= y then x else y let max x y = if x >= y then x else y -external ( == ) : 'a -> 'a -> bool = "%eq" -external ( != ) : 'a -> 'a -> bool = "%noteq" +external ( == ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%eq" +external ( != ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%noteq" (* Boolean operations *) -external not : bool -> bool = "%boolnot" -external ( & ) : bool -> bool -> bool = "%sequand" -external ( && ) : bool -> bool -> bool = "%sequand" -external ( or ) : bool -> bool -> bool = "%sequor" -external ( || ) : bool -> bool -> bool = "%sequor" +external not : (bool[@local_opt]) -> bool = "%boolnot" +external ( & ) : (bool[@local_opt]) -> (bool[@local_opt]) -> bool = "%sequand" +external ( && ) : (bool[@local_opt]) -> (bool[@local_opt]) -> bool = "%sequand" +external ( or ) : (bool[@local_opt]) -> (bool[@local_opt]) -> bool = "%sequor" +external ( || ) : (bool[@local_opt]) -> (bool[@local_opt]) -> bool = "%sequor" (* Integer operations *) -external ( ~- ) : int -> int = "%negint" -external ( ~+ ) : int -> int = "%identity" -external succ : int -> int = "%succint" -external pred : int -> int = "%predint" -external ( + ) : int -> int -> int = "%addint" -external ( - ) : int -> int -> int = "%subint" -external ( * ) : int -> int -> int = "%mulint" -external ( / ) : int -> int -> int = "%divint" -external ( mod ) : int -> int -> int = "%modint" +external ( ~- ) : (int[@local_opt]) -> int = "%negint" +external ( ~+ ) : (int[@local_opt]) -> int = "%identity" +external succ : (int[@local_opt]) -> int = "%succint" +external pred : (int[@local_opt]) -> int = "%predint" +external ( + ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%addint" +external ( - ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%subint" +external ( * ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%mulint" +external ( / ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%divint" +external ( mod ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%modint" let abs x = if x >= 0 then x else -x -external ( land ) : int -> int -> int = "%andint" -external ( lor ) : int -> int -> int = "%orint" -external ( lxor ) : int -> int -> int = "%xorint" +external ( land ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%andint" +external ( lor ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%orint" +external ( lxor ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%xorint" let lnot x = x lxor (-1) -external ( lsl ) : int -> int -> int = "%lslint" -external ( lsr ) : int -> int -> int = "%lsrint" -external ( asr ) : int -> int -> int = "%asrint" +external ( lsl ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%lslint" +external ( lsr ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%lsrint" +external ( asr ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%asrint" let max_int = (-1) lsr 1 let min_int = max_int + 1 (* Floating-point operations *) -external ( ~-. ) : float -> float = "%negfloat" -external ( ~+. ) : float -> float = "%identity" -external ( +. ) : float -> float -> float = "%addfloat" -external ( -. ) : float -> float -> float = "%subfloat" -external ( *. ) : float -> float -> float = "%mulfloat" -external ( /. ) : float -> float -> float = "%divfloat" +external ( ~-. ) : (float[@local_opt]) -> (float[@local_opt]) = "%negfloat" +external ( ~+. ) : (float[@local_opt]) -> (float[@local_opt]) = "%identity" +external ( +. ) : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%addfloat" +external ( -. ) : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%subfloat" +external ( *. ) : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%mulfloat" +external ( /. ) : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%divfloat" external ( ** ) : float -> float -> float = "caml_power_float" "pow" [@@unboxed] [@@noalloc] external exp : float -> float = "caml_exp_float" "exp" [@@unboxed] [@@noalloc] @@ -159,7 +159,7 @@ external ceil : float -> float = "caml_ceil_float" "ceil" [@@unboxed] [@@noalloc] external floor : float -> float = "caml_floor_float" "floor" [@@unboxed] [@@noalloc] -external abs_float : float -> float = "%absfloat" +external abs_float : (float[@local_opt]) -> (float[@local_opt]) = "%absfloat" external copysign : float -> float -> float = "caml_copysign_float" "caml_copysign" [@@unboxed] [@@noalloc] @@ -169,10 +169,10 @@ external frexp : float -> float * int = "caml_frexp_float" external ldexp : (float [@unboxed]) -> (int [@untagged]) -> (float [@unboxed]) = "caml_ldexp_float" "caml_ldexp_float_unboxed" [@@noalloc] external modf : float -> float * float = "caml_modf_float" -external float : int -> float = "%floatofint" -external float_of_int : int -> float = "%floatofint" -external truncate : float -> int = "%intoffloat" -external int_of_float : float -> int = "%intoffloat" +external float : (int[@local_opt]) -> (float[@local_opt]) = "%floatofint" +external float_of_int : (int[@local_opt]) -> (float[@local_opt]) = "%floatofint" +external truncate : (float[@local_opt]) -> int = "%intoffloat" +external int_of_float : (float[@local_opt]) -> int = "%intoffloat" external float_of_bits : int64 -> float = "caml_int64_float_of_bits" "caml_int64_float_of_bits_unboxed" [@@unboxed] [@@noalloc] @@ -229,17 +229,17 @@ external ignore : 'a -> unit = "%ignore" (* Pair operations *) -external fst : 'a * 'b -> 'a = "%field0_immut" -external snd : 'a * 'b -> 'b = "%field1_immut" +external fst : ('a * 'b[@local_opt]) -> ('a[@local_opt]) = "%field0_immut" +external snd : ('a * 'b[@local_opt]) -> ('b[@local_opt]) = "%field1_immut" (* References *) type 'a ref = { mutable contents : 'a } -external ref : 'a -> 'a ref = "%makemutable" -external ( ! ) : 'a ref -> 'a = "%field0" -external ( := ) : 'a ref -> 'a -> unit = "%setfield0" -external incr : int ref -> unit = "%incr" -external decr : int ref -> unit = "%decr" +external ref : 'a -> ('a ref[@local_opt]) = "%makemutable" +external ( ! ) : ('a ref[@local_opt]) -> 'a = "%field0" +external ( := ) : ('a ref[@local_opt]) -> 'a -> unit = "%setfield0" +external incr : (int ref[@local_opt]) -> unit = "%incr" +external decr : (int ref[@local_opt]) -> unit = "%decr" (* Result type *) diff --git a/stdlib/stdlib.mli b/stdlib/stdlib.mli index c4cb5153c18..6623f1ea36c 100644 --- a/stdlib/stdlib.mli +++ b/stdlib/stdlib.mli @@ -121,7 +121,7 @@ exception Undefined_recursive_module of (string * int * int) (** {1 Comparisons} *) -external ( = ) : 'a -> 'a -> bool = "%equal" +external ( = ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%equal" (** [e1 = e2] tests for structural equality of [e1] and [e2]. Mutable structures (e.g. references and arrays) are equal if and only if their current contents are structurally equal, @@ -130,27 +130,27 @@ external ( = ) : 'a -> 'a -> bool = "%equal" Equality between cyclic data structures may not terminate. Left-associative operator, see {!Ocaml_operators} for more information. *) -external ( <> ) : 'a -> 'a -> bool = "%notequal" +external ( <> ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%notequal" (** Negation of {!Stdlib.( = )}. Left-associative operator, see {!Ocaml_operators} for more information. *) -external ( < ) : 'a -> 'a -> bool = "%lessthan" +external ( < ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%lessthan" (** See {!Stdlib.( >= )}. Left-associative operator, see {!Ocaml_operators} for more information. *) -external ( > ) : 'a -> 'a -> bool = "%greaterthan" +external ( > ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%greaterthan" (** See {!Stdlib.( >= )}. Left-associative operator, see {!Ocaml_operators} for more information. *) -external ( <= ) : 'a -> 'a -> bool = "%lessequal" +external ( <= ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%lessequal" (** See {!Stdlib.( >= )}. Left-associative operator, see {!Ocaml_operators} for more information. *) -external ( >= ) : 'a -> 'a -> bool = "%greaterequal" +external ( >= ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%greaterequal" (** Structural ordering functions. These functions coincide with the usual orderings over integers, characters, strings, byte sequences and floating-point numbers, and extend them to a @@ -162,7 +162,7 @@ external ( >= ) : 'a -> 'a -> bool = "%greaterequal" Left-associative operator, see {!Ocaml_operators} for more information. *) -external compare : 'a -> 'a -> int = "%compare" +external compare : ('a[@local_opt]) -> ('a[@local_opt]) -> int = "%compare" (** [compare x y] returns [0] if [x] is equal to [y], a negative integer if [x] is less than [y], and a positive integer if [x] is greater than [y]. The ordering implemented by [compare] @@ -191,7 +191,7 @@ val max : 'a -> 'a -> 'a The result is unspecified if one of the arguments contains the float value [nan]. *) -external ( == ) : 'a -> 'a -> bool = "%eq" +external ( == ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%eq" (** [e1 == e2] tests for physical equality of [e1] and [e2]. On mutable types such as references, arrays, byte sequences, records with mutable fields and objects with mutable instance variables, @@ -203,7 +203,7 @@ external ( == ) : 'a -> 'a -> bool = "%eq" Left-associative operator, see {!Ocaml_operators} for more information. *) -external ( != ) : 'a -> 'a -> bool = "%noteq" +external ( != ) : ('a[@local_opt]) -> ('a[@local_opt]) -> bool = "%noteq" (** Negation of {!Stdlib.( == )}. Left-associative operator, see {!Ocaml_operators} for more information. *) @@ -211,30 +211,30 @@ external ( != ) : 'a -> 'a -> bool = "%noteq" (** {1 Boolean operations} *) -external not : bool -> bool = "%boolnot" +external not : (bool[@local_opt]) -> bool = "%boolnot" (** The boolean negation. *) -external ( && ) : bool -> bool -> bool = "%sequand" +external ( && ) : (bool[@local_opt]) -> (bool[@local_opt]) -> bool = "%sequand" (** The boolean 'and'. Evaluation is sequential, left-to-right: in [e1 && e2], [e1] is evaluated first, and if it returns [false], [e2] is not evaluated at all. Right-associative operator, see {!Ocaml_operators} for more information. *) -external ( & ) : bool -> bool -> bool = "%sequand" +external ( & ) : (bool[@local_opt]) -> (bool[@local_opt]) -> bool = "%sequand" [@@ocaml.deprecated "Use (&&) instead."] (** @deprecated {!Stdlib.( && )} should be used instead. Right-associative operator, see {!Ocaml_operators} for more information. *) -external ( || ) : bool -> bool -> bool = "%sequor" +external ( || ) : (bool[@local_opt]) -> (bool[@local_opt]) -> bool = "%sequor" (** The boolean 'or'. Evaluation is sequential, left-to-right: in [e1 || e2], [e1] is evaluated first, and if it returns [true], [e2] is not evaluated at all. Right-associative operator, see {!Ocaml_operators} for more information. *) -external ( or ) : bool -> bool -> bool = "%sequor" +external ( or ) : (bool[@local_opt]) -> (bool[@local_opt]) -> bool = "%sequor" [@@ocaml.deprecated "Use (||) instead."] (** @deprecated {!Stdlib.( || )} should be used instead. Right-associative operator, see {!Ocaml_operators} for more information. @@ -329,40 +329,40 @@ external ( @@ ) : ('a -> 'b) -> 'a -> 'b = "%apply" All operations are taken modulo 2{^[Sys.int_size]}. They do not fail on overflow. *) -external ( ~- ) : int -> int = "%negint" +external ( ~- ) : (int[@local_opt]) -> int = "%negint" (** Unary negation. You can also write [- e] instead of [~- e]. Unary operator, see {!Ocaml_operators} for more information. *) -external ( ~+ ) : int -> int = "%identity" +external ( ~+ ) : (int[@local_opt]) -> int = "%identity" (** Unary addition. You can also write [+ e] instead of [~+ e]. Unary operator, see {!Ocaml_operators} for more information. @since 3.12.0 *) -external succ : int -> int = "%succint" +external succ : (int[@local_opt]) -> int = "%succint" (** [succ x] is [x + 1]. *) -external pred : int -> int = "%predint" +external pred : (int[@local_opt]) -> int = "%predint" (** [pred x] is [x - 1]. *) -external ( + ) : int -> int -> int = "%addint" +external ( + ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%addint" (** Integer addition. Left-associative operator, see {!Ocaml_operators} for more information. *) -external ( - ) : int -> int -> int = "%subint" +external ( - ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%subint" (** Integer subtraction. Left-associative operator, , see {!Ocaml_operators} for more information. *) -external ( * ) : int -> int -> int = "%mulint" +external ( * ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%mulint" (** Integer multiplication. Left-associative operator, see {!Ocaml_operators} for more information. *) -external ( / ) : int -> int -> int = "%divint" +external ( / ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%divint" (** Integer division. Integer division rounds the real quotient of its arguments towards zero. More precisely, if [x >= 0] and [y > 0], [x / y] is the greatest integer @@ -373,7 +373,7 @@ external ( / ) : int -> int -> int = "%divint" @raise Division_by_zero if the second argument is 0. *) -external ( mod ) : int -> int -> int = "%modint" +external ( mod ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%modint" (** Integer remainder. If [y] is not zero, the result of [x mod y] satisfies the following properties: [x = (x / y) * y + x mod y] and @@ -398,17 +398,17 @@ val min_int : int (** {2 Bitwise operations} *) -external ( land ) : int -> int -> int = "%andint" +external ( land ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%andint" (** Bitwise logical and. Left-associative operator, see {!Ocaml_operators} for more information. *) -external ( lor ) : int -> int -> int = "%orint" +external ( lor ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%orint" (** Bitwise logical or. Left-associative operator, see {!Ocaml_operators} for more information. *) -external ( lxor ) : int -> int -> int = "%xorint" +external ( lxor ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%xorint" (** Bitwise logical exclusive or. Left-associative operator, see {!Ocaml_operators} for more information. *) @@ -416,13 +416,13 @@ external ( lxor ) : int -> int -> int = "%xorint" val lnot : int -> int (** Bitwise logical negation. *) -external ( lsl ) : int -> int -> int = "%lslint" +external ( lsl ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%lslint" (** [n lsl m] shifts [n] to the left by [m] bits. The result is unspecified if [m < 0] or [m > Sys.int_size]. Right-associative operator, see {!Ocaml_operators} for more information. *) -external ( lsr ) : int -> int -> int = "%lsrint" +external ( lsr ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%lsrint" (** [n lsr m] shifts [n] to the right by [m] bits. This is a logical shift: zeroes are inserted regardless of the sign of [n]. @@ -430,7 +430,7 @@ external ( lsr ) : int -> int -> int = "%lsrint" Right-associative operator, see {!Ocaml_operators} for more information. *) -external ( asr ) : int -> int -> int = "%asrint" +external ( asr ) : (int[@local_opt]) -> (int[@local_opt]) -> int = "%asrint" (** [n asr m] shifts [n] to the right by [m] bits. This is an arithmetic shift: the sign bit of [n] is replicated. The result is unspecified if [m < 0] or [m > Sys.int_size]. @@ -451,33 +451,33 @@ external ( asr ) : int -> int -> int = "%asrint" ([+.], [-.], [*.], [/.]) with [nan] as an argument return [nan], ... *) -external ( ~-. ) : float -> float = "%negfloat" +external ( ~-. ) : (float[@local_opt]) -> (float[@local_opt]) = "%negfloat" (** Unary negation. You can also write [-. e] instead of [~-. e]. Unary operator, see {!Ocaml_operators} for more information. *) -external ( ~+. ) : float -> float = "%identity" +external ( ~+. ) : (float[@local_opt]) -> (float[@local_opt]) = "%identity" (** Unary addition. You can also write [+. e] instead of [~+. e]. Unary operator, see {!Ocaml_operators} for more information. @since 3.12.0 *) -external ( +. ) : float -> float -> float = "%addfloat" +external ( +. ) : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%addfloat" (** Floating-point addition. Left-associative operator, see {!Ocaml_operators} for more information. *) -external ( -. ) : float -> float -> float = "%subfloat" +external ( -. ) : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%subfloat" (** Floating-point subtraction. Left-associative operator, see {!Ocaml_operators} for more information. *) -external ( *. ) : float -> float -> float = "%mulfloat" +external ( *. ) : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%mulfloat" (** Floating-point multiplication. Left-associative operator, see {!Ocaml_operators} for more information. *) -external ( /. ) : float -> float -> float = "%divfloat" +external ( /. ) : (float[@local_opt]) -> (float[@local_opt]) -> (float[@local_opt]) = "%divfloat" (** Floating-point division. Left-associative operator, see {!Ocaml_operators} for more information. *) @@ -580,7 +580,7 @@ external floor : float -> float = "caml_floor_float" "floor" equal to [f]. The result is returned as a float. *) -external abs_float : float -> float = "%absfloat" +external abs_float : (float[@local_opt]) -> (float[@local_opt]) = "%absfloat" (** [abs_float f] returns the absolute value of [f]. *) external copysign : float -> float -> float @@ -614,16 +614,16 @@ external modf : float -> float * float = "caml_modf_float" (** [modf f] returns the pair of the fractional and integral part of [f]. *) -external float : int -> float = "%floatofint" +external float : (int[@local_opt]) -> (float[@local_opt]) = "%floatofint" (** Same as {!Stdlib.float_of_int}. *) -external float_of_int : int -> float = "%floatofint" +external float_of_int : (int[@local_opt]) -> (float[@local_opt]) = "%floatofint" (** Convert an integer to floating-point. *) -external truncate : float -> int = "%intoffloat" +external truncate : (float[@local_opt]) -> int = "%intoffloat" (** Same as {!Stdlib.int_of_float}. *) -external int_of_float : float -> int = "%intoffloat" +external int_of_float : (float[@local_opt]) -> int = "%intoffloat" (** Truncate the given floating-point number to an integer. The result is unspecified if the argument is [nan] or falls outside the range of representable integers. *) @@ -781,10 +781,10 @@ external float_of_string : string -> float = "caml_float_of_string" (** {1 Pair operations} *) -external fst : 'a * 'b -> 'a = "%field0_immut" +external fst : ('a * 'b[@local_opt]) -> ('a[@local_opt]) = "%field0_immut" (** Return the first component of a pair. *) -external snd : 'a * 'b -> 'b = "%field1_immut" +external snd : ('a * 'b[@local_opt]) -> ('b[@local_opt]) = "%field1_immut" (** Return the second component of a pair. *) @@ -1182,26 +1182,26 @@ type 'a ref = { mutable contents : 'a } (** The type of references (mutable indirection cells) containing a value of type ['a]. *) -external ref : 'a -> 'a ref = "%makemutable" +external ref : 'a -> ('a ref[@local_opt]) = "%makemutable" (** Return a fresh reference containing the given value. *) -external ( ! ) : 'a ref -> 'a = "%field0" +external ( ! ) : ('a ref[@local_opt]) -> 'a = "%field0" (** [!r] returns the current contents of reference [r]. Equivalent to [fun r -> r.contents]. Unary operator, see {!Ocaml_operators} for more information. *) -external ( := ) : 'a ref -> 'a -> unit = "%setfield0" +external ( := ) : ('a ref[@local_opt]) -> 'a -> unit = "%setfield0" (** [r := a] stores the value of [a] in reference [r]. Equivalent to [fun r v -> r.contents <- v]. Right-associative operator, see {!Ocaml_operators} for more information. *) -external incr : int ref -> unit = "%incr" +external incr : (int ref[@local_opt]) -> unit = "%incr" (** Increment the integer contained in the given reference. Equivalent to [fun r -> r := succ !r]. *) -external decr : int ref -> unit = "%decr" +external decr : (int ref[@local_opt]) -> unit = "%decr" (** Decrement the integer contained in the given reference. Equivalent to [fun r -> r := pred !r]. *) diff --git a/testsuite/tests/formatting/test_locations.dlocations.ocamlc.reference b/testsuite/tests/formatting/test_locations.dlocations.ocamlc.reference index 33368c57411..1dde8d624f3 100644 --- a/testsuite/tests/formatting/test_locations.dlocations.ocamlc.reference +++ b/testsuite/tests/formatting/test_locations.dlocations.ocamlc.reference @@ -87,7 +87,9 @@ let rec fib = function | 0 | 1 -> 1 | n -> (fib (n - 1)) + (fib (n - 2)) pattern (test_locations.ml[17,534+8]..test_locations.ml[17,534+11]) Tpat_var "fib" expression (test_locations.ml[17,534+14]..test_locations.ml[19,572+34]) + value_mode global Texp_function + region true Nolabel [ @@ -98,60 +100,80 @@ let rec fib = function | 0 | 1 -> 1 | n -> (fib (n - 1)) + (fib (n - 2)) pattern (test_locations.ml[18,557+8]..test_locations.ml[18,557+9]) Tpat_constant Const_int 1 expression (test_locations.ml[18,557+13]..test_locations.ml[18,557+14]) + value_mode global Texp_constant Const_int 1 pattern (test_locations.ml[19,572+4]..test_locations.ml[19,572+5]) Tpat_var "n" expression (test_locations.ml[19,572+9]..test_locations.ml[19,572+34]) + value_mode global Texp_apply + apply_mode Tail expression (test_locations.ml[19,572+21]..test_locations.ml[19,572+22]) + value_mode Texp_ident "Stdlib!.+" [ Nolabel expression (test_locations.ml[19,572+9]..test_locations.ml[19,572+20]) + value_mode Texp_apply + apply_mode Nontail expression (test_locations.ml[19,572+9]..test_locations.ml[19,572+12]) + value_mode Texp_ident "fib" [ Nolabel expression (test_locations.ml[19,572+13]..test_locations.ml[19,572+20]) + value_mode global Texp_apply + apply_mode Nontail expression (test_locations.ml[19,572+16]..test_locations.ml[19,572+17]) + value_mode Texp_ident "Stdlib!.-" [ Nolabel expression (test_locations.ml[19,572+14]..test_locations.ml[19,572+15]) + value_mode Texp_ident "n" Nolabel expression (test_locations.ml[19,572+18]..test_locations.ml[19,572+19]) + value_mode Texp_constant Const_int 1 ] ] Nolabel expression (test_locations.ml[19,572+23]..test_locations.ml[19,572+34]) + value_mode Texp_apply + apply_mode Nontail expression (test_locations.ml[19,572+23]..test_locations.ml[19,572+26]) + value_mode Texp_ident "fib" [ Nolabel expression (test_locations.ml[19,572+27]..test_locations.ml[19,572+34]) + value_mode global Texp_apply + apply_mode Nontail expression (test_locations.ml[19,572+30]..test_locations.ml[19,572+31]) + value_mode Texp_ident "Stdlib!.-" [ Nolabel expression (test_locations.ml[19,572+28]..test_locations.ml[19,572+29]) + value_mode Texp_ident "n" Nolabel expression (test_locations.ml[19,572+32]..test_locations.ml[19,572+33]) + value_mode Texp_constant Const_int 2 ] ] diff --git a/testsuite/tests/formatting/test_locations.dno-locations.ocamlc.reference b/testsuite/tests/formatting/test_locations.dno-locations.ocamlc.reference index 60351f717df..5782bec816d 100644 --- a/testsuite/tests/formatting/test_locations.dno-locations.ocamlc.reference +++ b/testsuite/tests/formatting/test_locations.dno-locations.ocamlc.reference @@ -87,7 +87,9 @@ let rec fib = function | 0 | 1 -> 1 | n -> (fib (n - 1)) + (fib (n - 2)) pattern Tpat_var "fib" expression + value_mode global Texp_function + region true Nolabel [ @@ -98,60 +100,80 @@ let rec fib = function | 0 | 1 -> 1 | n -> (fib (n - 1)) + (fib (n - 2)) pattern Tpat_constant Const_int 1 expression + value_mode global Texp_constant Const_int 1 pattern Tpat_var "n" expression + value_mode global Texp_apply + apply_mode Tail expression + value_mode Texp_ident "Stdlib!.+" [ Nolabel expression + value_mode Texp_apply + apply_mode Nontail expression + value_mode Texp_ident "fib" [ Nolabel expression + value_mode global Texp_apply + apply_mode Nontail expression + value_mode Texp_ident "Stdlib!.-" [ Nolabel expression + value_mode Texp_ident "n" Nolabel expression + value_mode Texp_constant Const_int 1 ] ] Nolabel expression + value_mode Texp_apply + apply_mode Nontail expression + value_mode Texp_ident "fib" [ Nolabel expression + value_mode global Texp_apply + apply_mode Nontail expression + value_mode Texp_ident "Stdlib!.-" [ Nolabel expression + value_mode Texp_ident "n" Nolabel expression + value_mode Texp_constant Const_int 2 ] ] diff --git a/testsuite/tests/lib-dynlink-initializers/test10_main.ml b/testsuite/tests/lib-dynlink-initializers/test10_main.ml index 8dd92a7002d..30b66dd7d14 100644 --- a/testsuite/tests/lib-dynlink-initializers/test10_main.ml +++ b/testsuite/tests/lib-dynlink-initializers/test10_main.ml @@ -28,7 +28,7 @@ reference = "${test_source_directory}/test10_main.byte.reference" module = "test10_main.ml" ***** ocamlopt.byte program = "test10_plugin.cmxs" -flags = "-shared" +flags = "-shared -g" all_modules = "test10_plugin.ml" ***** ocamlopt.byte program = "${test_build_directory}/test10.exe" diff --git a/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference b/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference index d7d54bb0604..f475b4322c4 100755 --- a/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference +++ b/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference @@ -1,6 +1,7 @@ Error: Failure("Plugin error") Raised at Stdlib.failwith in file "stdlib.ml", line 32, characters 17-33 -Called from Test10_plugin.g in file "test10_plugin.ml", line 2, characters 15-38 +Called from Test10_plugin.g in file "test10_plugin.ml" (inlined), line 2, characters 15-38 +Called from Test10_plugin.f in file "test10_plugin.ml", line 6, characters 2-6 Called from Test10_plugin in file "test10_plugin.ml", line 10, characters 2-6 Called from Dynlink.Native.run.(fun) in file "otherlibs/dynlink/dynlink.ml", line 250, characters 12-29 Called from Dynlink.Native.run.(fun) in file "otherlibs/dynlink/dynlink.ml", line 250, characters 12-29 diff --git a/testsuite/tests/parsing/multi_indices.ml b/testsuite/tests/parsing/multi_indices.ml index 8b67bd91e6b..fcc79ffbe76 100644 --- a/testsuite/tests/parsing/multi_indices.ml +++ b/testsuite/tests/parsing/multi_indices.ml @@ -35,8 +35,7 @@ val ( .![;..]<- ) : ('a, 'b, 'c) A.t -> int array -> 'a -> unit = let (.![;..]) a n = Format.printf "indices: @[[|%a|]@]@." - (Format.pp_print_list - ~pp_sep:(fun ppf -> fun () -> Format.fprintf ppf ";@ ") + (Format.pp_print_list ~pp_sep:(fun ppf () -> Format.fprintf ppf ";@ ") Format.pp_print_int) (Array.to_list n); A.get a n;; val ( .![;..] ) : ('a, 'b, 'c) A.t -> int array -> 'a = diff --git a/testsuite/tests/prim-revapply/apply.ml b/testsuite/tests/prim-revapply/apply.ml index 4f947d9771a..94a17b272b9 100644 --- a/testsuite/tests/prim-revapply/apply.ml +++ b/testsuite/tests/prim-revapply/apply.ml @@ -1,4 +1,5 @@ (* TEST + flags="-w +48" *) external ( @@ ) : ('a -> 'b) -> 'a -> 'b = "%apply" @@ -37,3 +38,7 @@ let _ = h @@ g @@ f @@ 3; (* 37 *) add 4 @@ g @@ f @@ add 3 @@ add 2 @@ 3; (* 260 *) ] + +(* PR#10081 *) +let bump ?(cap = 100) x = min cap (x + 1) +let _f x = bump @@ x (* no warning 48 *) diff --git a/testsuite/tests/prim-revapply/revapply.ml b/testsuite/tests/prim-revapply/revapply.ml index 32435562afd..4a72154724d 100644 --- a/testsuite/tests/prim-revapply/revapply.ml +++ b/testsuite/tests/prim-revapply/revapply.ml @@ -1,4 +1,5 @@ (* TEST + flags="-w +48" *) external ( |> ) : 'a -> ('a -> 'b) -> 'b = "%revapply" @@ -19,3 +20,13 @@ let _ = 3 |> f |> g |> h; (* 37 *) 3 |> add 2 |> add 3 |> f |> g |> add 4; (* 260 *) ] + + +(* PR#10081 *) +let bump ?(cap = 100) x = min cap (x + 1) +let _f x = x |> bump (* no warning 48 *) + +(* PR#10081 *) +type t = A | B +type s = A | B +let _f (x : t) = x |> function A -> 0 | B -> 1 diff --git a/testsuite/tests/tool-ocamlc-stop-after/stop_after_typing_impl.compilers.reference b/testsuite/tests/tool-ocamlc-stop-after/stop_after_typing_impl.compilers.reference index a82c28e58e2..7409a86dfc7 100644 --- a/testsuite/tests/tool-ocamlc-stop-after/stop_after_typing_impl.compilers.reference +++ b/testsuite/tests/tool-ocamlc-stop-after/stop_after_typing_impl.compilers.reference @@ -8,7 +8,7 @@ core_type (stop_after_typing_impl.ml[13,365+16]..stop_after_typing_impl.ml[13,365+19]) Ttyp_constr "int!" [] - core_type (stop_after_typing_impl.ml[13,365+23]..stop_after_typing_impl.ml[13,365+26]) + core_type (stop_after_typing_impl.ml[13,365+16]..stop_after_typing_impl.ml[13,365+19]) Ttyp_constr "int!" [] [ diff --git a/testsuite/tests/translprim/array_spec.compilers.flat.reference b/testsuite/tests/translprim/array_spec.compilers.flat.reference index acc4d00c943..98477a22ae1 100644 --- a/testsuite/tests/translprim/array_spec.compilers.flat.reference +++ b/testsuite/tests/translprim/array_spec.compilers.flat.reference @@ -13,11 +13,11 @@ (function a[genarray] (array.unsafe_get[gen] a 0)) (array.set[int] int_a 0 1) (array.set[float] float_a 0 1.) (array.set[addr] addr_a 0 "a") - (function a[genarray] x : int (array.set[gen] a 0 x)) + (function a[genarray][->L] x[->L] : int (array.set[gen] a 0 x)) (array.unsafe_set[int] int_a 0 1) (array.unsafe_set[float] float_a 0 1.) (array.unsafe_set[addr] addr_a 0 "a") - (function a[genarray] x : int (array.unsafe_set[gen] a 0 x)) + (function a[genarray][->L] x[->L] : int (array.unsafe_set[gen] a 0 x)) (let (eta_gen_len = (function prim stub (array.length[gen] prim)) eta_gen_safe_get = diff --git a/testsuite/tests/translprim/array_spec.ml b/testsuite/tests/translprim/array_spec.ml index 6d0c1e49f85..5b8e64486ac 100644 --- a/testsuite/tests/translprim/array_spec.ml +++ b/testsuite/tests/translprim/array_spec.ml @@ -1,7 +1,7 @@ (* TEST * setup-ocamlc.byte-build-env ** ocamlc.byte - flags = "-dlambda -dno-unique-ids" + flags = "-dlambda -dno-unique-ids -extension local" *** flat-float-array **** check-ocamlc.byte-output compiler_reference = diff --git a/testsuite/tests/translprim/comparison_table.compilers.reference b/testsuite/tests/translprim/comparison_table.compilers.reference index 94d22f490e3..8f9a2cfb969 100644 --- a/testsuite/tests/translprim/comparison_table.compilers.reference +++ b/testsuite/tests/translprim/comparison_table.compilers.reference @@ -158,7 +158,7 @@ (function f param[0: *, *] (apply f (field 0 param) (field 1 param))) map = - (function f l + (function f[->L] l[->L] (apply (field 18 (global Stdlib__List!)) (apply uncurry f) l))) (makeblock 0 ([0: *, *],*) (makeblock 0 (apply map gen_cmp vec) (apply map cmp vec)) @@ -197,7 +197,7 @@ (function f param[0: *, *] (apply f (field 0 param) (field 1 param))) map = - (function f l + (function f[->L] l[->L] (apply (field 18 (global Stdlib__List!)) (apply uncurry f) l))) (makeblock 0 ([0: *, *],*) diff --git a/testsuite/tests/translprim/comparison_table.ml b/testsuite/tests/translprim/comparison_table.ml index 1a91430681e..88add3b9397 100644 --- a/testsuite/tests/translprim/comparison_table.ml +++ b/testsuite/tests/translprim/comparison_table.ml @@ -1,7 +1,7 @@ (* TEST * setup-ocamlc.byte-build-env ** ocamlc.byte - flags = "-dlambda -dno-unique-ids" + flags = "-dlambda -dno-unique-ids -extension local" *** check-ocamlc.byte-output *) diff --git a/testsuite/tests/translprim/ref_spec.compilers.reference b/testsuite/tests/translprim/ref_spec.compilers.reference index 39f9a5d34e9..5fda828ba77 100644 --- a/testsuite/tests/translprim/ref_spec.compilers.reference +++ b/testsuite/tests/translprim/ref_spec.compilers.reference @@ -24,13 +24,20 @@ (setfield_ptr 1 gen_rec [0: "foo"]) (setfield_ptr 1 gen_rec 0) (setfield_ptr 1 flt_rec 1.) (setfloatfield 1 flt_rec' 1.) (let - (set_open_poly = (function r y : int (setfield_ptr 0 r y)) - set_open_poly = (function r y : int (setfield_imm 0 r y)) - set_open_poly = (function r y : int (setfield_imm 0 r y)) - set_open_poly = (function r y : int (setfield_imm 0 r y)) - set_open_poly = (function r y : int (setfield_ptr 0 r y)) - set_open_poly = (function r y : int (setfield_ptr 0 r y)) - set_open_poly = (function r y : int (setfield_ptr 0 r y)) + (set_open_poly = + (function r[->L] y[->L] : int (setfield_ptr 0 r y)) + set_open_poly = + (function r[->L] y[->L] : int (setfield_imm 0 r y)) + set_open_poly = + (function r[->L] y[->L] : int (setfield_imm 0 r y)) + set_open_poly = + (function r[->L] y[->L] : int (setfield_imm 0 r y)) + set_open_poly = + (function r[->L] y[->L] : int (setfield_ptr 0 r y)) + set_open_poly = + (function r[->L] y[->L] : int (setfield_ptr 0 r y)) + set_open_poly = + (function r[->L] y[->L] : int (setfield_ptr 0 r y)) set_open_poly = (function r y : int (setfield_ptr 0 r y))) (makeblock 0 int_ref var_ref vargen_ref cst_ref gen_ref flt_ref int_rec var_rec vargen_rec cst_rec gen_rec flt_rec flt_rec' diff --git a/testsuite/tests/translprim/ref_spec.ml b/testsuite/tests/translprim/ref_spec.ml index 82cbd1eeef3..9f01fcac11b 100644 --- a/testsuite/tests/translprim/ref_spec.ml +++ b/testsuite/tests/translprim/ref_spec.ml @@ -1,7 +1,7 @@ (* TEST * setup-ocamlc.byte-build-env ** ocamlc.byte - flags = "-dlambda -dno-unique-ids" + flags = "-dlambda -dno-unique-ids -extension local" *** check-ocamlc.byte-output *) diff --git a/testsuite/tests/typing-local/alloc.ml b/testsuite/tests/typing-local/alloc.ml new file mode 100644 index 00000000000..ec3baa6d8ab --- /dev/null +++ b/testsuite/tests/typing-local/alloc.ml @@ -0,0 +1,453 @@ +(* TEST + flags += "-extension local" *) + +type t = int + +type smallrecord = { a : t; b : t; c : t } + + +external opaque_local : local_ 'a -> local_ 'a = "%opaque" +let ignore_local : local_ 'a -> unit = + fun x -> + Gc.minor (); + let _ = local_ opaque_local x in + () + +let makesmall n = + ignore_local { a = n; b = n; c = n }; + () + +let smallconst = { a = 0; b = 0; c = 0 } + +let dupsmall r = + ignore_local { r with a = 42 }; + () + +type bigrecord = { + v001 : t; v002 : t; v003 : t; v004 : t; v005 : t; v006 : t; v007 : t; v008 : t; v009 : t; v010 : t; + v011 : t; v012 : t; v013 : t; v014 : t; v015 : t; v016 : t; v017 : t; v018 : t; v019 : t; v020 : t; + v021 : t; v022 : t; v023 : t; v024 : t; v025 : t; v026 : t; v027 : t; v028 : t; v029 : t; v030 : t; + v031 : t; v032 : t; v033 : t; v034 : t; v035 : t; v036 : t; v037 : t; v038 : t; v039 : t; v040 : t; + v041 : t; v042 : t; v043 : t; v044 : t; v045 : t; v046 : t; v047 : t; v048 : t; v049 : t; v050 : t; + v051 : t; v052 : t; v053 : t; v054 : t; v055 : t; v056 : t; v057 : t; v058 : t; v059 : t; v060 : t; + v061 : t; v062 : t; v063 : t; v064 : t; v065 : t; v066 : t; v067 : t; v068 : t; v069 : t; v070 : t; + v071 : t; v072 : t; v073 : t; v074 : t; v075 : t; v076 : t; v077 : t; v078 : t; v079 : t; v080 : t; + v081 : t; v082 : t; v083 : t; v084 : t; v085 : t; v086 : t; v087 : t; v088 : t; v089 : t; v090 : t; + v091 : t; v092 : t; v093 : t; v094 : t; v095 : t; v096 : t; v097 : t; v098 : t; v099 : t; v100 : t; + v101 : t; v102 : t; v103 : t; v104 : t; v105 : t; v106 : t; v107 : t; v108 : t; v109 : t; v110 : t; + v111 : t; v112 : t; v113 : t; v114 : t; v115 : t; v116 : t; v117 : t; v118 : t; v119 : t; v120 : t; + v121 : t; v122 : t; v123 : t; v124 : t; v125 : t; v126 : t; v127 : t; v128 : t; v129 : t; v130 : t; + v131 : t; v132 : t; v133 : t; v134 : t; v135 : t; v136 : t; v137 : t; v138 : t; v139 : t; v140 : t; + v141 : t; v142 : t; v143 : t; v144 : t; v145 : t; v146 : t; v147 : t; v148 : t; v149 : t; v150 : t; + v151 : t; v152 : t; v153 : t; v154 : t; v155 : t; v156 : t; v157 : t; v158 : t; v159 : t; v160 : t; + v161 : t; v162 : t; v163 : t; v164 : t; v165 : t; v166 : t; v167 : t; v168 : t; v169 : t; v170 : t; + v171 : t; v172 : t; v173 : t; v174 : t; v175 : t; v176 : t; v177 : t; v178 : t; v179 : t; v180 : t; + v181 : t; v182 : t; v183 : t; v184 : t; v185 : t; v186 : t; v187 : t; v188 : t; v189 : t; v190 : t; + v191 : t; v192 : t; v193 : t; v194 : t; v195 : t; v196 : t; v197 : t; v198 : t; v199 : t; v200 : t; + v201 : t; v202 : t; v203 : t; v204 : t; v205 : t; v206 : t; v207 : t; v208 : t; v209 : t; v210 : t; + v211 : t; v212 : t; v213 : t; v214 : t; v215 : t; v216 : t; v217 : t; v218 : t; v219 : t; v220 : t; + v221 : t; v222 : t; v223 : t; v224 : t; v225 : t; v226 : t; v227 : t; v228 : t; v229 : t; v230 : t; + v231 : t; v232 : t; v233 : t; v234 : t; v235 : t; v236 : t; v237 : t; v238 : t; v239 : t; v240 : t; + v241 : t; v242 : t; v243 : t; v244 : t; v245 : t; v246 : t; v247 : t; v248 : t; v249 : t; v250 : t; + v251 : t; v252 : t; v253 : t; v254 : t; v255 : t; v256 : t; v257 : t; v258 : t; v259 : t; v260 : t; + v261 : t; v262 : t; v263 : t; v264 : t; v265 : t; v266 : t; v267 : t; v268 : t; v269 : t; v270 : t; + v271 : t; v272 : t; v273 : t; v274 : t; v275 : t; v276 : t; v277 : t; v278 : t; v279 : t; v280 : t; + v281 : t; v282 : t; v283 : t; v284 : t; v285 : t; v286 : t; v287 : t; v288 : t; v289 : t; v290 : t; + v291 : t; v292 : t; v293 : t; v294 : t; v295 : t; v296 : t; v297 : t; v298 : t; v299 : t; v300 : t; +} + +let bigconst = + let n = 0 in + { + v001 = n; v002 = n; v003 = n; v004 = n; v005 = n; v006 = n; v007 = n; v008 = n; v009 = n; v010 = n; + v011 = n; v012 = n; v013 = n; v014 = n; v015 = n; v016 = n; v017 = n; v018 = n; v019 = n; v020 = n; + v021 = n; v022 = n; v023 = n; v024 = n; v025 = n; v026 = n; v027 = n; v028 = n; v029 = n; v030 = n; + v031 = n; v032 = n; v033 = n; v034 = n; v035 = n; v036 = n; v037 = n; v038 = n; v039 = n; v040 = n; + v041 = n; v042 = n; v043 = n; v044 = n; v045 = n; v046 = n; v047 = n; v048 = n; v049 = n; v050 = n; + v051 = n; v052 = n; v053 = n; v054 = n; v055 = n; v056 = n; v057 = n; v058 = n; v059 = n; v060 = n; + v061 = n; v062 = n; v063 = n; v064 = n; v065 = n; v066 = n; v067 = n; v068 = n; v069 = n; v070 = n; + v071 = n; v072 = n; v073 = n; v074 = n; v075 = n; v076 = n; v077 = n; v078 = n; v079 = n; v080 = n; + v081 = n; v082 = n; v083 = n; v084 = n; v085 = n; v086 = n; v087 = n; v088 = n; v089 = n; v090 = n; + v091 = n; v092 = n; v093 = n; v094 = n; v095 = n; v096 = n; v097 = n; v098 = n; v099 = n; v100 = n; + v101 = n; v102 = n; v103 = n; v104 = n; v105 = n; v106 = n; v107 = n; v108 = n; v109 = n; v110 = n; + v111 = n; v112 = n; v113 = n; v114 = n; v115 = n; v116 = n; v117 = n; v118 = n; v119 = n; v120 = n; + v121 = n; v122 = n; v123 = n; v124 = n; v125 = n; v126 = n; v127 = n; v128 = n; v129 = n; v130 = n; + v131 = n; v132 = n; v133 = n; v134 = n; v135 = n; v136 = n; v137 = n; v138 = n; v139 = n; v140 = n; + v141 = n; v142 = n; v143 = n; v144 = n; v145 = n; v146 = n; v147 = n; v148 = n; v149 = n; v150 = n; + v151 = n; v152 = n; v153 = n; v154 = n; v155 = n; v156 = n; v157 = n; v158 = n; v159 = n; v160 = n; + v161 = n; v162 = n; v163 = n; v164 = n; v165 = n; v166 = n; v167 = n; v168 = n; v169 = n; v170 = n; + v171 = n; v172 = n; v173 = n; v174 = n; v175 = n; v176 = n; v177 = n; v178 = n; v179 = n; v180 = n; + v181 = n; v182 = n; v183 = n; v184 = n; v185 = n; v186 = n; v187 = n; v188 = n; v189 = n; v190 = n; + v191 = n; v192 = n; v193 = n; v194 = n; v195 = n; v196 = n; v197 = n; v198 = n; v199 = n; v200 = n; + v201 = n; v202 = n; v203 = n; v204 = n; v205 = n; v206 = n; v207 = n; v208 = n; v209 = n; v210 = n; + v211 = n; v212 = n; v213 = n; v214 = n; v215 = n; v216 = n; v217 = n; v218 = n; v219 = n; v220 = n; + v221 = n; v222 = n; v223 = n; v224 = n; v225 = n; v226 = n; v227 = n; v228 = n; v229 = n; v230 = n; + v231 = n; v232 = n; v233 = n; v234 = n; v235 = n; v236 = n; v237 = n; v238 = n; v239 = n; v240 = n; + v241 = n; v242 = n; v243 = n; v244 = n; v245 = n; v246 = n; v247 = n; v248 = n; v249 = n; v250 = n; + v251 = n; v252 = n; v253 = n; v254 = n; v255 = n; v256 = n; v257 = n; v258 = n; v259 = n; v260 = n; + v261 = n; v262 = n; v263 = n; v264 = n; v265 = n; v266 = n; v267 = n; v268 = n; v269 = n; v270 = n; + v271 = n; v272 = n; v273 = n; v274 = n; v275 = n; v276 = n; v277 = n; v278 = n; v279 = n; v280 = n; + v281 = n; v282 = n; v283 = n; v284 = n; v285 = n; v286 = n; v287 = n; v288 = n; v289 = n; v290 = n; + v291 = n; v292 = n; v293 = n; v294 = n; v295 = n; v296 = n; v297 = n; v298 = n; v299 = n; v300 = n; + } + +let makebig n = + let r = local_ + { + v001 = n; v002 = n; v003 = n; v004 = n; v005 = n; v006 = n; v007 = n; v008 = n; v009 = n; v010 = n; + v011 = n; v012 = n; v013 = n; v014 = n; v015 = n; v016 = n; v017 = n; v018 = n; v019 = n; v020 = n; + v021 = n; v022 = n; v023 = n; v024 = n; v025 = n; v026 = n; v027 = n; v028 = n; v029 = n; v030 = n; + v031 = n; v032 = n; v033 = n; v034 = n; v035 = n; v036 = n; v037 = n; v038 = n; v039 = n; v040 = n; + v041 = n; v042 = n; v043 = n; v044 = n; v045 = n; v046 = n; v047 = n; v048 = n; v049 = n; v050 = n; + v051 = n; v052 = n; v053 = n; v054 = n; v055 = n; v056 = n; v057 = n; v058 = n; v059 = n; v060 = n; + v061 = n; v062 = n; v063 = n; v064 = n; v065 = n; v066 = n; v067 = n; v068 = n; v069 = n; v070 = n; + v071 = n; v072 = n; v073 = n; v074 = n; v075 = n; v076 = n; v077 = n; v078 = n; v079 = n; v080 = n; + v081 = n; v082 = n; v083 = n; v084 = n; v085 = n; v086 = n; v087 = n; v088 = n; v089 = n; v090 = n; + v091 = n; v092 = n; v093 = n; v094 = n; v095 = n; v096 = n; v097 = n; v098 = n; v099 = n; v100 = n; + v101 = n; v102 = n; v103 = n; v104 = n; v105 = n; v106 = n; v107 = n; v108 = n; v109 = n; v110 = n; + v111 = n; v112 = n; v113 = n; v114 = n; v115 = n; v116 = n; v117 = n; v118 = n; v119 = n; v120 = n; + v121 = n; v122 = n; v123 = n; v124 = n; v125 = n; v126 = n; v127 = n; v128 = n; v129 = n; v130 = n; + v131 = n; v132 = n; v133 = n; v134 = n; v135 = n; v136 = n; v137 = n; v138 = n; v139 = n; v140 = n; + v141 = n; v142 = n; v143 = n; v144 = n; v145 = n; v146 = n; v147 = n; v148 = n; v149 = n; v150 = n; + v151 = n; v152 = n; v153 = n; v154 = n; v155 = n; v156 = n; v157 = n; v158 = n; v159 = n; v160 = n; + v161 = n; v162 = n; v163 = n; v164 = n; v165 = n; v166 = n; v167 = n; v168 = n; v169 = n; v170 = n; + v171 = n; v172 = n; v173 = n; v174 = n; v175 = n; v176 = n; v177 = n; v178 = n; v179 = n; v180 = n; + v181 = n; v182 = n; v183 = n; v184 = n; v185 = n; v186 = n; v187 = n; v188 = n; v189 = n; v190 = n; + v191 = n; v192 = n; v193 = n; v194 = n; v195 = n; v196 = n; v197 = n; v198 = n; v199 = n; v200 = n; + v201 = n; v202 = n; v203 = n; v204 = n; v205 = n; v206 = n; v207 = n; v208 = n; v209 = n; v210 = n; + v211 = n; v212 = n; v213 = n; v214 = n; v215 = n; v216 = n; v217 = n; v218 = n; v219 = n; v220 = n; + v221 = n; v222 = n; v223 = n; v224 = n; v225 = n; v226 = n; v227 = n; v228 = n; v229 = n; v230 = n; + v231 = n; v232 = n; v233 = n; v234 = n; v235 = n; v236 = n; v237 = n; v238 = n; v239 = n; v240 = n; + v241 = n; v242 = n; v243 = n; v244 = n; v245 = n; v246 = n; v247 = n; v248 = n; v249 = n; v250 = n; + v251 = n; v252 = n; v253 = n; v254 = n; v255 = n; v256 = n; v257 = n; v258 = n; v259 = n; v260 = n; + v261 = n; v262 = n; v263 = n; v264 = n; v265 = n; v266 = n; v267 = n; v268 = n; v269 = n; v270 = n; + v271 = n; v272 = n; v273 = n; v274 = n; v275 = n; v276 = n; v277 = n; v278 = n; v279 = n; v280 = n; + v281 = n; v282 = n; v283 = n; v284 = n; v285 = n; v286 = n; v287 = n; v288 = n; v289 = n; v290 = n; + v291 = n; v292 = n; v293 = n; v294 = n; v295 = n; v296 = n; v297 = n; v298 = n; v299 = n; v300 = n; + } in + ignore_local r; + () + +let dupbig r = + let v = local_ { r with v001 = 42 } in + ignore_local v; + () + +type floatrecord = { x: float; y: float; z: float } +let makefloat n = + ignore_local { x=n; y=n; z=n }; + () + +let projfloat n = + let local_ r = opaque_local {x=n;y=n;z=n} in + ignore_local (r.x,r.y,r.z); + () + +let floatconst = {x=0.; y=0.; z=0.} + +let dupfloat n = + ignore_local {n with x=42.}; + () + +let makepolyvariant n = + ignore_local (`Foo (n, n, n)); + () + +type 'a ext = .. +type 'a ext += Foo of 'a +let makeextension n = + ignore_local (Foo (n, n, n)); + () + +external add32_local : local_ int32 -> local_ int32 -> local_ int32 = + "%int32_add" +let arithint32 n = + ignore_local (Int32.add n 1l); + ignore_local (add32_local n 1l); + () + +let arithfloat n = + ignore_local (n +. float_of_int (int_of_float n + 42)); + () + +let closure n = + let f x = x + n in + ignore_local f; + () + +let local_arg_fn ~a:(local_ a) ~b:(local_ b) = + ignore_local (a, b); () +let currylocal1 n = + ignore_local (local_arg_fn ~a:n); () +let currylocal2 n = + ignore_local (Sys.opaque_identity local_arg_fn ~a:n); () +let currylocal3 n = + ignore_local (local_arg_fn ~b:n); + () + +let partprim1 n = + let add : local_ int32 -> local_ int32 -> local_ int32 = Int32.add in + ignore_local (add n); () + +let partprim2 n = + let add = Int32.add in + ignore_local (Sys.opaque_identity add n); () + +let makeintarray (n:int) = + ignore_local [| n |]; + () + +let makeaddrarray (n:int list) = + ignore_local [| n |]; + () + +let makefloatarray (n:float) = + ignore_local [| n |]; + () + +external floatarray_create : int -> local_ floatarray = + "caml_floatarray_create_local" +let makeflatfloatarray () = + ignore_local (floatarray_create 20); + () + +let makeshortarray n = + ignore_local [| n |]; + () + +let makelongarray n = + ignore_local + [| n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; |]; + () + +external local_array: int -> 'a -> local_ 'a array = "caml_make_local_vect" + +external array_concat : local_ 'a array list -> local_ 'a array = + "caml_array_concat_local" +external array_append : local_ 'a array -> local_ 'a array -> local_ 'a array = + "caml_array_append_local" +external array_sub : local_ 'a array -> int -> int -> local_ 'a array = + "caml_array_sub_local" +external array_blit : + local_ 'a array -> int -> local_ 'a array -> int -> int -> unit = "caml_array_blit" +external array_fill : + local_ 'a array -> int -> int -> 'a -> unit = "caml_array_fill" + +let maniparray arr = (* arr = 1,2,3,1,2,3 *) + let x = local_array 2 [2] in (* 2,2 *) + let x = array_append x x in (* 2,2,2,2 *) + array_fill x 1 1 [3]; (* 2,3,2,2 *) + array_blit arr 3 x 2 1; (* 2,3,1,2 *) + let x = array_concat [array_sub x 2 1; x; array_sub x 1 1] in + assert (x = arr); (* 1,2,3,1,2,3 *) + () + +let manipfarray arr = (* arr = 1,2,3,1,2,3 *) + let x = local_array 2 2. in (* 2,2 *) + let x = array_append x x in (* 2,2,2,2 *) + array_fill x 1 1 3.; (* 2,3,2,2 *) + array_blit arr 3 x 2 1; (* 2,3,1,2 *) + let x = array_concat [array_sub x 2 1; x; array_sub x 1 1] in + assert (x = arr); (* 1,2,3,1,2,3 *) + () + + +let makeref n = + let r = ref n in + r := n+1; + incr r; + decr r; + ignore_local r; + () + +external bytes_create : + int -> local_ bytes = "caml_create_local_bytes" +external bytes_set : + local_ bytes -> int -> char -> unit = "%bytes_unsafe_set" +external bytes_fill : + local_ bytes -> int -> int -> char -> unit = "caml_fill_bytes" +external bytes_blit_string : + local_ string -> int -> local_ bytes -> int -> int -> unit = + "caml_blit_string" +let hello = Bytes.of_string "hello" +let makebytes () = + let b = bytes_create 5 in + bytes_fill b 0 5 'l'; + bytes_set b 4 'o'; + bytes_blit_string "he" 0 b 0 2; + assert (b = hello) + +external get_int32_ne : bytes -> int -> (int32[@local_opt]) = "%caml_bytes_get32" +external get_int64_ne : bytes -> int -> (int64[@local_opt]) = "%caml_bytes_get64" +external swap32 : (int32[@local_opt]) -> (int32[@local_opt]) = "%bswap_int32" +external swap64 : (int64[@local_opt]) -> (int64[@local_opt]) = "%bswap_int64" + +let get_int32_be b i = local_ + if Sys.big_endian then get_int32_ne b i + else swap32 (opaque_local (get_int32_ne b i)) +let get_int64_be b i = local_ + if Sys.big_endian then get_int64_ne b i + else swap64 (opaque_local (get_int64_ne b i)) +let data = Bytes.of_string "\x00\x11\x22\x33\x44\x55\x66\x77" +let readstringbint () = + let t = + (get_int32_be data 0, + get_int32_be data 4, + (* 32-bit does not currently support local alloc of int64 in all cases *) + (if Sys.word_size = 64 + then get_int64_be data 0 + else 0x0011223344556677L)) + in + assert (t = (0x00112233l, 0x44556677l, + 0x0011223344556677L)) + +type bigstring = + (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t +external bigstring_get_int32_ne : + bigstring -> int -> (int32[@local_opt]) = "%caml_bigstring_get32" +external bigstring_get_int64_ne : + bigstring -> int -> (int64[@local_opt]) = "%caml_bigstring_get64" +let bigstring_get_int32_be b i = local_ + if Sys.big_endian then bigstring_get_int32_ne b i + else swap32 (opaque_local (bigstring_get_int32_ne b i)) +let bigstring_get_int64_be b i = local_ + if Sys.big_endian then bigstring_get_int64_ne b i + else swap64 (opaque_local (bigstring_get_int64_ne b i)) +let bigstring_of_string s = + let open Bigarray in + let a = Array1.create char c_layout (String.length s) in + for i = 0 to String.length s - 1 do + a.{i} <- s.[i] + done; + a +let data = bigstring_of_string "\x00\x11\x22\x33\x44\x55\x66\x77" +let readbigstringbint () = + let t = + (bigstring_get_int32_be data 0, + bigstring_get_int32_be data 4, + (* 32-bit does not currently support local alloc of int64 in all cases *) + (if Sys.word_size = 64 + then bigstring_get_int64_be data 0 + else 0x0011223344556677L)) + in + assert (t = (0x00112233l, 0x44556677l, + 0x0011223344556677L)) + + +let rec makemanylong n = + if n = 0 then () else + let stuff = local_ + [| n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; + n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; n; |] + in + makemanylong (n-1); + ignore_local stuff; + () + +let makeverylong n = + (* This is many times larger than the largest allocation so far. + The local region will have to grow several times to accommodate it. *) + ignore_local (local_array 100_000 n); + () + +let run name f x = + let prebefore = Gc.allocated_bytes () in + let before = Gc.allocated_bytes () in + let r = Sys.opaque_identity f x in + let after = Gc.allocated_bytes () in + let delta = + int_of_float ((after -. before) -. (before -. prebefore)) + / (Sys.word_size/8) + in + let msg = + match delta with + | 0 -> "OK" + | _ when Sys.backend_type <> Sys.Native -> "OK" + | n -> Printf.sprintf "%d words allocated" n + in + Printf.printf "%15s: %s\n" name msg; + r + +let () = + run "small" makesmall 42; + run "dupsmall" dupsmall smallconst; + run "big" makebig 42; + run "dupbig" dupbig bigconst; + run "float" makefloat 42.; + run "projfloat" projfloat 42.; + run "dupfloat" dupfloat floatconst; + run "polyvariant" makepolyvariant 42; + run "extension" makeextension 42; + run "arith32" arithint32 42l; + run "arithfloat" arithfloat 42.0; + run "closure" closure 1; + run "currylocal1" currylocal1 1; + run "currylocal2" currylocal2 1; + run "currylocal3" currylocal3 1; + run "partprim1" partprim1 42l; + run "partprim2" partprim2 42l; + run "intarray" makeintarray 42; + run "addrarray" makeaddrarray []; + run "floatarray" makefloatarray 42.; + run "flatfloatarray" makeflatfloatarray (); + run "shortarray" makeshortarray 42; + run "longarray" makelongarray 42; + run "floatgenarray" makeshortarray 42.; + run "longfgarray" makelongarray 42.; + run "maniparray" maniparray [| [1]; [2]; [3]; [1]; [2]; [3] |]; + run "manipfarray" manipfarray [| 1.; 2.; 3.; 1.; 2.; 3. |]; + run "ref" makeref 42; + run "bytes" makebytes (); + run "stringbint" readstringbint (); + run "bigstringbint" readbigstringbint (); + run "verylong" makeverylong 42; + run "manylong" makemanylong 100 + + +(* In debug mode, Gc.minor () checks for minor heap->local pointers *) +let () = Gc.minor () diff --git a/testsuite/tests/typing-local/alloc.reference b/testsuite/tests/typing-local/alloc.reference new file mode 100644 index 00000000000..9334bbb3a82 --- /dev/null +++ b/testsuite/tests/typing-local/alloc.reference @@ -0,0 +1,33 @@ + small: OK + dupsmall: OK + big: OK + dupbig: OK + float: OK + projfloat: OK + dupfloat: OK + polyvariant: OK + extension: OK + arith32: OK + arithfloat: OK + closure: OK + currylocal1: OK + currylocal2: OK + currylocal3: OK + partprim1: OK + partprim2: OK + intarray: OK + addrarray: OK + floatarray: OK + flatfloatarray: OK + shortarray: OK + longarray: OK + floatgenarray: OK + longfgarray: OK + maniparray: OK + manipfarray: OK + ref: OK + bytes: OK + stringbint: OK + bigstringbint: OK + verylong: OK + manylong: OK diff --git a/testsuite/tests/typing-local/aritybug.ml b/testsuite/tests/typing-local/aritybug.ml new file mode 100644 index 00000000000..94e8e740ce1 --- /dev/null +++ b/testsuite/tests/typing-local/aritybug.ml @@ -0,0 +1,560 @@ +(* TEST + flags += "-extension local" *) + +let[@inline never] wat x = + let f ~a:_ ~b:_ ~c:_ () () = x in + let g = Sys.opaque_identity (f ~c:1) in + let h = Sys.opaque_identity (g ~b:"b") in + h ~a:0 () () + +let () = Printf.printf "%d\n%!" (wat 42) + +module M : sig + val count : int +end = struct + let fold + ~init + ~v001 + ~v002 + ~v003 + ~v004 + ~v005 + ~v006 + ~v007 + ~v008 + ~v009 + ~v010 + ~v011 + ~v012 + ~v013 + ~v014 + ~v015 + ~v016 + ~v017 + ~v018 + ~v019 + ~v020 + ~v021 + ~v022 + ~v023 + ~v024 + ~v025 + ~v026 + ~v027 + ~v028 + ~v029 + ~v030 + ~v031 + ~v032 + ~v033 + ~v034 + ~v035 + ~v036 + ~v037 + ~v038 + ~v039 + ~v040 + ~v041 + ~v042 + ~v043 + ~v044 + ~v045 + ~v046 + ~v047 + ~v048 + ~v049 + ~v050 + ~v051 + ~v052 + ~v053 + ~v054 + ~v055 + ~v056 + ~v057 + ~v058 + ~v059 + ~v060 + ~v061 + ~v062 + ~v063 + ~v064 + ~v065 + ~v066 + ~v067 + ~v068 + ~v069 + ~v070 + ~v071 + ~v072 + ~v073 + ~v074 + ~v075 + ~v076 + ~v077 + ~v078 + ~v079 + ~v080 + ~v081 + ~v082 + ~v083 + ~v084 + ~v085 + ~v086 + ~v087 + ~v088 + ~v089 + ~v090 + ~v091 + ~v092 + ~v093 + ~v094 + ~v095 + ~v096 + ~v097 + ~v098 + ~v099 + ~v100 + ~v101 + ~v102 + ~v103 + ~v104 + ~v105 + ~v106 + ~v107 + ~v108 + ~v109 + ~v110 + ~v111 + ~v112 + ~v113 + ~v114 + ~v115 + ~v116 + ~v117 + ~v118 + ~v119 + ~v120 + ~v121 + ~v122 + ~v123 + ~v124 + ~v125 + ~v126 + ~v127 + ~v128 + ~v129 + ~v130 + ~v131 + ~v132 + ~v133 + = + (v001 + (v002 + (v003 + (v004 + (v005 + (v006 + (v007 + (v008 + (v009 + (v010 + (v011 + (v012 + (v013 + (v014 + (v015 + (v016 + (v017 + (v018 + (v019 + (v020 + (v021 + (v022 + (v023 + (v024 + (v025 + (v026 + (v027 + (v028 + (v029 + (v030 + (v031 + (v032 + (v033 + (v034 + (v035 + (v036 + (v037 + (v038 + (v039 + (v040 + (v041 + (v042 + (v043 + (v044 + (v045 + (v046 + (v047 + (v048 + (v049 + (v050 + (v051 + (v052 + (v053 + (v054 + (v055 + (v056 + (v057 + (v058 + (v059 + (v060 + (v061 + (v062 + (v063 + (v064 + (v065 + (v066 + (v067 + (v068 + (v069 + (v070 + (v071 + (v072 + (v073 + (v074 + (v075 + (v076 + (v077 + (v078 + (v079 + (v080 + (v081 + (v082 + (v083 + (v084 + (v085 + (v086 + (v087 + (v088 + (v089 + (v090 + (v091 + (v092 + (v093 + (v094 + (v095 + (v096 + (v097 + (v098 + (v099 + (v100 + (v101 + (v102 + (v103 + (v104 + (v105 + (v106 + (v107 + (v108 + (v109 + (v110 + (v111 + (v112 + (v113 + (v114 + (v115 + (v116 + (v117 + (v118 + (v119 + (v120 + (v121 + (v122 + (v123 + (v124 + (v125 + (v126 + (v127 + (v128 + (v129 + (v130 + (v131 + (v132 + (v133 + init + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + +let f ?override_name acc _ = 1 + acc + +let count = + fold + ~init:0 + ~v001:f + ~v002:f + ~v003:f + ~v004:f + ~v005:f + ~v006:f + ~v007:f + ~v008:f + ~v009:f + ~v010:f + ~v011:f + ~v012:f + ~v013:f + ~v014:f + ~v015:f + ~v016:f + ~v017:f + ~v018:f + ~v019:f + ~v020:f + ~v021:f + ~v022:f + ~v023:f + ~v024:f + ~v025:f + ~v026:f + ~v027:f + ~v028:f + ~v029:f + ~v030:f + ~v031:f + ~v032:f + ~v033:f + ~v034:f + ~v035:f + ~v036:f + ~v037:f + ~v038:f + ~v039:f + ~v040:f + ~v041:f + ~v042:f + ~v043:f + ~v044:f + ~v045:f + ~v046:f + ~v047:f + ~v048:f + ~v049:f + ~v050:f + ~v051:f + ~v052:f + ~v053:f + ~v054:f + ~v055:f + ~v056:f + ~v057:f + ~v058:f + ~v059:f + ~v060:f + ~v061:f + ~v062:f + ~v063:f + ~v064:f + ~v065:f + ~v066:f + ~v067:f + ~v068:f + ~v069:f + ~v070:f + ~v071:f + ~v072:f + ~v073:f + ~v074:f + ~v075:f + ~v076:f + ~v077:f + ~v078:f + ~v079:f + ~v080:f + ~v081:f + ~v082:f + ~v083:f + ~v084:f + ~v085:f + ~v086:f + ~v087:f + ~v088:f + ~v089:f + ~v090:f + ~v091:f + ~v092:f + ~v093:f + ~v094:f + ~v095:f + ~v096:f + ~v097:f + ~v098:f + ~v099:f + ~v100:f + ~v101:f + ~v102:f + ~v103:f + ~v104:f + ~v105:f + ~v106:f + ~v107:f + ~v108:f + ~v109:f + ~v110:f + ~v111:f + ~v112:f + ~v113:f + ~v114:f + ~v115:f + ~v116:f + ~v117:f + ~v118:f + ~v119:f + ~v120:f + ~v121:f + ~v122:f + ~v123:f + ~v124:f + ~v125:f + ~v126:f + ~v127:f + ~v128:f + ~v129:f + ~v130:f + ~v131:f + ~v132:f + ~v133:f +end +;; + +let () = Printf.printf "%d\n" M.count diff --git a/testsuite/tests/typing-local/aritybug.reference b/testsuite/tests/typing-local/aritybug.reference new file mode 100644 index 00000000000..e68b4aeeedf --- /dev/null +++ b/testsuite/tests/typing-local/aritybug.reference @@ -0,0 +1,2 @@ +42 +133 diff --git a/testsuite/tests/typing-local/comballoc.ml b/testsuite/tests/typing-local/comballoc.ml new file mode 100644 index 00000000000..1483a52173e --- /dev/null +++ b/testsuite/tests/typing-local/comballoc.ml @@ -0,0 +1,29 @@ +(* TEST + flags += "-extension local" *) +let glob = ref [] + +let[@inline never] f g n = + let a = local_ [n] in + let b = [n+1] in + let c = local_ [n+2] in + glob := b; + g a c; + () + +type junk = { a : float; b : float; c : float; d : float; e : float; f : float } +let[@inline never] clear g n = + let junk = local_ {a=n;b=n;c=n;d=n;e=n;f=n} in + g junk; + () + +(* As a header, this looks like tag 0 and marked, + while as a value it's (probably) an invalid pointer *) +let ones = Int64.float_of_bits 0x3FFF_FF00_FFFF_FF00L +let () = + for i = 1 to 1_000_000 do + clear (fun _ -> ()) ones; + f (fun _ _ -> ()) 42 + done; + print_endline "ok" + + diff --git a/testsuite/tests/typing-local/comballoc.reference b/testsuite/tests/typing-local/comballoc.reference new file mode 100644 index 00000000000..9766475a418 --- /dev/null +++ b/testsuite/tests/typing-local/comballoc.reference @@ -0,0 +1 @@ +ok diff --git a/testsuite/tests/typing-local/curry.byte.reference b/testsuite/tests/typing-local/curry.byte.reference new file mode 100644 index 00000000000..58f8ff6f681 --- /dev/null +++ b/testsuite/tests/typing-local/curry.byte.reference @@ -0,0 +1,6 @@ + specialise local: 000000 + caml_curry local: 000000 + all heap: 000000 + all local: 000000 + tupled: ok + primcurry: 0000 diff --git a/testsuite/tests/typing-local/curry.ml b/testsuite/tests/typing-local/curry.ml new file mode 100644 index 00000000000..fb45373880f --- /dev/null +++ b/testsuite/tests/typing-local/curry.ml @@ -0,0 +1,103 @@ +(* TEST + flags += "-extension local" + * bytecode + reference = "${test_source_directory}/curry.byte.reference" + * native + reference = "${test_source_directory}/curry.opt.reference" *) +module M : sig + (* explicit signature to force return modes *) + val part_local : int -> int -> local_ string -> int -> int -> int -> int list + val all_heap : int -> int -> string -> int -> int -> int -> int list +end = struct + let part_local a b (local_ c) d e f = + let _ = c in + [a; b; d; e; f] + let all_heap a b c d e f = [a;b;int_of_string c;d;e;f] +end + + +external is_local : local_ 'a -> bool = "caml_obj_is_local" +let loc (local_ x) = + if is_local x then 1 else 0 + +let[@inline never] flocal (local_ arg) = + let g = M.part_local in + let a = g 1 in + let b = a 2 in + let c = b arg in + let d = c 4 in + let e = d 5 in + Gc.minor (); + Printf.printf "%20s: %d%d%d%d%d%d\n" + "specialise local" + (loc g) (loc a) (loc b) (loc c) (loc d) (loc e) + +let _ = flocal "asdf" + +let fopaque () = + let g = Sys.opaque_identity M.part_local in + let a = g 1 in + let b = a 2 in + let c = b (local_ "asdf") in + let d = c 4 in + let e = d 5 in + Gc.minor (); + Printf.printf "%20s: %d%d%d%d%d%d\n" + "caml_curry local" + (loc g) (loc a) (loc b) (loc c) (loc d) (loc e) + +let _ = fopaque () + + +let[@inline never] fheap () = + let g = local_ M.all_heap in + let a = local_ g 1 in + let b = local_ a 2 in + let c = local_ b "asdf" in + let d = local_ c 4 in + let e = local_ d 5 in + Gc.minor (); + Printf.printf "%20s: %d%d%d%d%d%d\n" + "all heap" + (loc g) (loc a) (loc b) (loc c) (loc d) (loc e) + +let () = fheap () + +(* partial application of a local function *) +let[@inline never] f z = + let local_ g a b c d e f = [a;b;c;d;e;f;z] in + let a = g 1 in + let b = a 2 in + let c = b 3 in + let d = c 4 in + let e = d 5 in + Gc.minor (); + Printf.printf "%20s: %d%d%d%d%d%d\n" + "all local" + (loc g) (loc a) (loc b) (loc c) (loc d) (loc e) + +let () = f 42 + +let[@inline never] tupled : (string*string) -> local_ string = + fun (a,b) -> local_ (a^b) +let () = + match tupled ("a","b") with + | "ab" -> Printf.printf "%20s: ok\n" "tupled" + | _ -> assert false + +let globalref = ref 42 +type 'a glob = { global_ g : 'a } +let escape x = { g = x }.g +let[@inline never] prim () = + let r = local_ ref 42 in + (* currying of primitives (opaque goes via caml_curry) *) + let a,b,c,d = + ((Sys.opaque_identity (:=)) r, + ((:=) r), + escape ((Sys.opaque_identity (:=)) globalref), + escape ((:=) globalref)) in + Gc.minor (); + Printf.printf "%20s: %d%d%d%d\n" "primcurry" + (loc a) (loc b) (loc c) (loc d) + +let () = prim () diff --git a/testsuite/tests/typing-local/curry.opt.reference b/testsuite/tests/typing-local/curry.opt.reference new file mode 100644 index 00000000000..b5f40cda186 --- /dev/null +++ b/testsuite/tests/typing-local/curry.opt.reference @@ -0,0 +1,6 @@ + specialise local: 000111 + caml_curry local: 000111 + all heap: 000000 + all local: 111111 + tupled: ok + primcurry: 1100 diff --git a/testsuite/tests/typing-local/example_syntax.ml b/testsuite/tests/typing-local/example_syntax.ml new file mode 100644 index 00000000000..ee5fcc94e2a --- /dev/null +++ b/testsuite/tests/typing-local/example_syntax.ml @@ -0,0 +1,13 @@ +let f a b c = 1 +let f (local_ a) ~foo:(local_ b) ?foo:(local_ c= 1) ~(local_ d) = () +let f () = + let a = [local_ 1] in + let local_ r = 1 in + let local_ f : 'a . 'a -> 'a = fun x -> x in + local_ "asdfasdfasdfasdfasdfasdfasdf" +type 'a r = { + mutable a: 'a ; + nonlocal_ b: 'a ; + global_ c: 'a } +type ('a, 'b) cfn = + a:local_ 'a -> ?b:local_ b -> local_ 'a -> (int -> local_ 'b) diff --git a/testsuite/tests/typing-local/exceptions.ml b/testsuite/tests/typing-local/exceptions.ml new file mode 100644 index 00000000000..568e67edb3c --- /dev/null +++ b/testsuite/tests/typing-local/exceptions.ml @@ -0,0 +1,37 @@ +(* TEST + flags += "-extension local" + * native *) + +external local_stack_offset : unit -> int = "caml_local_stack_offset" + +let leak () = + let r = local_ ref 42 in + let[@inline never] f () = incr r in + f (); + f (); + raise Exit + +let count_leak f = + let before = local_stack_offset () in + f (); + let after = local_stack_offset () in + after - before + +let glob = ref 0 + +let tests = + [ "try", (fun () -> + begin try leak () with Exit -> () end; + incr glob); + "tailtry", (fun () -> + try leak () with Exit -> ()); + "match", (fun () -> + let g = match leak () with exception Exit -> glob | () -> glob in + incr g); + "tailmatch", (fun () -> + match leak () with exception Exit -> () | () -> ()) + ] + +let () = + Sys.opaque_identity tests |> List.iter (fun (s,f) -> + Printf.printf "%15s: %d\n" s (count_leak f)) diff --git a/testsuite/tests/typing-local/exceptions.reference b/testsuite/tests/typing-local/exceptions.reference new file mode 100644 index 00000000000..958eef90d2a --- /dev/null +++ b/testsuite/tests/typing-local/exceptions.reference @@ -0,0 +1,4 @@ + try: 0 + tailtry: 0 + match: 0 + tailmatch: 0 diff --git a/testsuite/tests/typing-local/lifetime.ml b/testsuite/tests/typing-local/lifetime.ml new file mode 100644 index 00000000000..1d4bd6ad511 --- /dev/null +++ b/testsuite/tests/typing-local/lifetime.ml @@ -0,0 +1,43 @@ +(* TEST + flags += "-extension local" *) + +let final = ref false +let rtrue = ref true +let ev s = Printf.printf "%15s: %b\n" s !final + +let[@inline never] alloc () = + let r = ref 42 in + Gc.finalise (fun _ -> final := true) r; + ev "initial"; + Gc.full_major (); + ev "live reg"; + r + +let[@inline never] use (local_ _) = () + +let[@inline never] live_local () = + if !rtrue then begin + let g = + if !rtrue then begin + let s = local_ (Some (Some (alloc ()))) in + Gc.full_major (); + ev "live local"; + use s; + + let rec local_ f x = if x then (use s; ()) else (g (); ()) + and g () = f true; () + in + g + end else (fun () -> assert false) in + Gc.full_major (); + ev "live infix"; + g (); + end; + Gc.full_major (); + ev "dead local"; + () + +let () = + live_local (); + Gc.full_major (); + ev "after return" diff --git a/testsuite/tests/typing-local/lifetime.reference b/testsuite/tests/typing-local/lifetime.reference new file mode 100644 index 00000000000..e800fafc886 --- /dev/null +++ b/testsuite/tests/typing-local/lifetime.reference @@ -0,0 +1,6 @@ + initial: false + live reg: false + live local: false + live infix: false + dead local: true + after return: true diff --git a/testsuite/tests/typing-local/local.ml b/testsuite/tests/typing-local/local.ml new file mode 100644 index 00000000000..b535cd5c25d --- /dev/null +++ b/testsuite/tests/typing-local/local.ml @@ -0,0 +1,1837 @@ +(* TEST + flags += "-extension local" + * expect *) + +let leak n = + let r = local_ ref n in + r +[%%expect{| +Line 3, characters 2-3: +3 | r + ^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] + +external idint : local_ int -> int = "%identity" +[%%expect{| +external idint : local_ int -> int = "%identity" +|}] + +let noleak n = + let r = local_ ref n in + idint (r.contents) +[%%expect{| +val noleak : int -> int = +|}] + + +let (!) = fun (local_ r) -> r.contents +[%%expect{| +val ( ! ) : local_ 'a ref -> 'a = +|}] + +(* Local lets *) + +let leak n = + let local_ r = ref n in + r +[%%expect{| +Line 3, characters 2-3: +3 | r + ^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] + +let leak n = + let local_ r : int ref = ref n in + r +[%%expect{| +Line 3, characters 2-3: +3 | r + ^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] + +let leak n = + let local_ f : 'a. 'a -> 'a = fun x -> x in + f +[%%expect{| +Line 3, characters 2-3: +3 | f + ^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] + +let leak n = + let local_ f x : int = x in + f +[%%expect{| +Line 3, characters 2-3: +3 | f + ^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] + +(* + * Type equalities of function types + *) + + (* When a [local_] argument appears in a function type with multiple arguments, + return modes are implicitly stack until the final argument. *) +type equ_fn = unit + constraint + 'a -> local_ 'b -> 'c -> 'd -> 'e + = 'a -> local_ 'b -> local_ ('c -> local_ ('d -> 'e)) +[%%expect{| +type equ_fn = unit +|}] + +type distinct_sarg = unit constraint local_ int -> int = int -> int +[%%expect{| +Line 1, characters 37-67: +1 | type distinct_sarg = unit constraint local_ int -> int = int -> int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The type constraints are not consistent. +Type local_ int -> int is not compatible with type int -> int +|}] +type distinct_sret = unit constraint int -> local_ int = int -> int +[%%expect{| +Line 1, characters 37-67: +1 | type distinct_sret = unit constraint int -> local_ int = int -> int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The type constraints are not consistent. +Type int -> local_ int is not compatible with type int -> int +|}] +type distinct_sarg_sret = unit constraint local_ int -> int = local_ int -> local_ int +[%%expect{| +Line 1, characters 42-86: +1 | type distinct_sarg_sret = unit constraint local_ int -> int = local_ int -> local_ int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The type constraints are not consistent. +Type local_ int -> int is not compatible with type local_ int -> local_ int +|}] + +type local_higher_order = unit constraint + local_ (int -> int -> int) -> int = local_ (int -> local_ (int -> int)) -> int +[%%expect{| +type local_higher_order = unit +|}] + +type nonlocal_higher_order = unit constraint + (int -> int -> int) -> int = (int -> local_ (int -> int)) -> int +[%%expect{| +Line 2, characters 2-66: +2 | (int -> int -> int) -> int = (int -> local_ (int -> int)) -> int + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The type constraints are not consistent. +Type (int -> int -> int) -> int is not compatible with type + (int -> local_ (int -> int)) -> int +Type int -> int -> int is not compatible with type int -> local_ (int -> int) +|}] + +type local_higher_order = unit constraint + int -> local_ (int -> int -> int) = int -> local_ (int -> local_ (int -> int)) +[%%expect{| +type local_higher_order = unit +|}] + +type nonlocal_higher_order = unit constraint + int -> (int -> int -> int) = int -> (int -> local_ (int -> int)) +[%%expect{| +Line 2, characters 2-66: +2 | int -> (int -> int -> int) = int -> (int -> local_ (int -> int)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The type constraints are not consistent. +Type int -> int -> int -> int is not compatible with type + int -> int -> local_ (int -> int) +Type int -> int -> int is not compatible with type int -> local_ (int -> int) +|}] + +let foo () = + let local_ _bar : int -> int -> int = + ((fun y z -> z) : int -> local_ (int -> int)) in + () +[%%expect{| +val foo : unit -> unit = +|}] + +let foo () = + let _bar : int -> int -> int = + ((fun y z -> z) : int -> local_ (int -> int)) in + () +[%%expect{| +Line 3, characters 4-49: +3 | ((fun y z -> z) : int -> local_ (int -> int)) in + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type int -> local_ (int -> int) + but an expression was expected of type int -> int -> int +|}] + +let foo () = + let local_ _bar : 'a. 'a -> 'a -> 'a = + ((fun y z -> z) : _ -> local_ (_ -> _)) in + () +[%%expect{| +val foo : unit -> unit = +|}] + +let foo () = + let _bar : 'a. 'a -> 'a -> 'a = + ((fun y z -> z) : _ -> local_ (_ -> _)) in + () +[%%expect{| +Line 3, characters 4-43: +3 | ((fun y z -> z) : _ -> local_ (_ -> _)) in + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type 'b -> local_ ('c -> 'c) + but an expression was expected of type 'a -> 'a -> 'a +|}] + +let foo () = + let local_ _bar x : int -> int -> int = + ((fun y z -> z) : int -> local_ (int -> int)) in + () +[%%expect{| +val foo : unit -> unit = +|}] + +let foo () = + let _bar x : int -> int -> int = + ((fun y z -> z) : int -> local_ (int -> int)) in + () +[%%expect{| +Line 3, characters 4-49: +3 | ((fun y z -> z) : int -> local_ (int -> int)) in + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type int -> local_ (int -> int) + but an expression was expected of type int -> int -> int +|}] + +let foo (local_ bar : int -> int -> int) = + let _ = (bar : int -> local_ (int -> int)) in + () +[%%expect{| +val foo : local_ (int -> int -> int) -> unit = +|}] + +let foo (bar : int -> int -> int) = + let _ = (bar : int -> local_ (int -> int)) in + () +[%%expect{| +Line 2, characters 11-14: +2 | let _ = (bar : int -> local_ (int -> int)) in + ^^^ +Error: This expression has type int -> int -> int + but an expression was expected of type int -> local_ (int -> int) +|}] + + +(* + * Curried functions and partial application + *) + +(* f4 results in a local value if it is partially applied to two or + three arguments, because it closes over the locally-allocated + second argument. Applications to 1 or 4 arguments are not local. *) +let f4 : int -> local_ 'a -> int -> int -> int = + fun a _ b c -> a + b + c +[%%expect{| +val f4 : int -> local_ 'a -> int -> int -> int = +|}] + +let apply1 x = f4 x +[%%expect{| +val apply1 : int -> local_ 'a -> int -> int -> int = +|}] +let apply2 x = f4 x x +[%%expect{| +Line 1, characters 15-21: +1 | let apply2 x = f4 x x + ^^^^^^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] +let apply3 x = f4 x x x +[%%expect{| +Line 1, characters 15-23: +1 | let apply3 x = f4 x x x + ^^^^^^^^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] +let apply4 x = + f4 x x x x +[%%expect{| +val apply4 : int -> int = +|}] + +(* Partial applications of two or three arguments are OK if bound locally *) +let apply2_stack x = + let g = f4 x x in + let res = g x x in + res +let apply3_stack x = + let g = f4 x x x in + let res = g x in + res +[%%expect{| +val apply2_stack : int -> int = +val apply3_stack : int -> int = +|}] + +(* + * Overapplication (functions that return functions) + *) + +let g : local_ 'a -> int -> _ = fun _ _ -> (fun[@curry] (local_ _) (x : int) -> x) +[%%expect{| +val g : local_ 'a -> int -> (local_ 'b -> int -> int) = +|}] +let apply1 x = g x +[%%expect{| +Line 1, characters 15-18: +1 | let apply1 x = g x + ^^^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] +let apply2 x = g x x +[%%expect{| +val apply2 : int -> local_ 'a -> int -> int = +|}] +let apply3 x = g x x x +[%%expect{| +Line 1, characters 15-22: +1 | let apply3 x = g x x x + ^^^^^^^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] +let apply4 x = g x x x x +[%%expect{| +val apply4 : int -> int = +|}] + +(* + * Labels and reordering + *) + +let app1 (f : a:int -> b:local_ int ref -> unit -> unit) = f ~b:(local_ ref 42) () +[%%expect{| +Line 1, characters 64-79: +1 | let app1 (f : a:int -> b:local_ int ref -> unit -> unit) = f ~b:(local_ ref 42) () + ^^^^^^^^^^^^^^^ +Error: This value escapes its region + Hint: It is captured by a partial application +|}] +let app2 (f : a:int -> b:local_ int ref -> unit -> unit) = f ~b:(local_ ref 42) +[%%expect{| +Line 1, characters 64-79: +1 | let app2 (f : a:int -> b:local_ int ref -> unit -> unit) = f ~b:(local_ ref 42) + ^^^^^^^^^^^^^^^ +Error: This value escapes its region + Hint: It is captured by a partial application +|}] +let app3 (f : a:int -> b:local_ int ref -> unit) = f ~b:(local_ ref 42) +[%%expect{| +Line 1, characters 56-71: +1 | let app3 (f : a:int -> b:local_ int ref -> unit) = f ~b:(local_ ref 42) + ^^^^^^^^^^^^^^^ +Error: This value escapes its region + Hint: It is captured by a partial application +|}] +let app4 (f : b:local_ int ref -> a:int -> unit) = f ~b:(local_ ref 42) +[%%expect{| +Line 1, characters 56-71: +1 | let app4 (f : b:local_ int ref -> a:int -> unit) = f ~b:(local_ ref 42) + ^^^^^^^^^^^^^^^ +Error: This local value escapes its region + Hint: This argument cannot be local, because this is a tail call +|}] +let app42 (f : a:local_ int ref -> (int -> b:local_ int ref -> c:int -> unit)) = + f ~a:(local_ ref 1) 2 ~c:4 +[%%expect{| +val app42 : + (a:local_ int ref -> (int -> b:local_ int ref -> c:int -> unit)) -> + b:local_ int ref -> unit = +|}] +let app43 (f : a:local_ int ref -> (int -> b:local_ int ref -> c:int -> unit)) = + f ~a:(local_ ref 1) 2 +[%%expect{| +Line 2, characters 7-21: +2 | f ~a:(local_ ref 1) 2 + ^^^^^^^^^^^^^^ +Error: This local value escapes its region + Hint: This argument cannot be local, because this is a tail call +|}] +let app5 (f : b:local_ int ref -> a:int -> unit) = f ~a:42 +[%%expect{| +val app5 : (b:local_ int ref -> a:int -> unit) -> b:local_ int ref -> unit = + +|}] +let app6 (f : a:local_ int ref -> b:local_ int ref -> c:int -> unit) = f ~c:42 +[%%expect{| +val app6 : + (a:local_ int ref -> b:local_ int ref -> c:int -> unit) -> + a:local_ int ref -> b:local_ int ref -> unit = +|}] + +let app1' (f : a:int -> b:local_ int ref -> unit -> unit) = f ~b:(ref 42) () +[%%expect{| +val app1' : (a:int -> b:local_ int ref -> unit -> unit) -> a:int -> unit = + +|}] +let app2' (f : a:int -> b:local_ int ref -> unit -> unit) = f ~b:(ref 42) +[%%expect{| +val app2' : + (a:int -> b:local_ int ref -> unit -> unit) -> + a:int -> local_ (unit -> unit) = +|}] +let app3' (f : a:int -> b:local_ int ref -> unit) = f ~b:(ref 42) +[%%expect{| +val app3' : (a:int -> b:local_ int ref -> unit) -> a:int -> unit = +|}] +let app4' (f : b:local_ int ref -> a:int -> unit) = f ~b:(ref 42) +[%%expect{| +Line 1, characters 52-65: +1 | let app4' (f : b:local_ int ref -> a:int -> unit) = f ~b:(ref 42) + ^^^^^^^^^^^^^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] +let app42' (f : a:local_ int ref -> (int -> b:local_ int ref -> c:int -> unit)) = + f ~a:(ref 1) 2 ~c:4 +[%%expect{| +val app42' : + (a:local_ int ref -> (int -> b:local_ int ref -> c:int -> unit)) -> + b:local_ int ref -> unit = +|}] +let app43' (f : a:local_ int ref -> (int -> b:local_ int ref -> c:int -> unit)) = + f ~a:(ref 1) 2 +[%%expect{| +val app43' : + (a:local_ int ref -> (int -> b:local_ int ref -> c:int -> unit)) -> + b:local_ int ref -> c:int -> unit = +|}] + +let rapp1 (f : a:int -> unit -> local_ int ref) = f () +[%%expect{| +val rapp1 : (a:int -> unit -> local_ int ref) -> a:int -> local_ int ref = + +|}] +let rapp2 (f : a:int -> unit -> local_ int ref) = f ~a:1 +[%%expect{| +val rapp2 : (a:int -> unit -> local_ int ref) -> unit -> local_ int ref = + +|}] +let rapp3 (f : a:int -> unit -> local_ int ref) = f ~a:1 () +[%%expect{| +Line 1, characters 50-59: +1 | let rapp3 (f : a:int -> unit -> local_ int ref) = f ~a:1 () + ^^^^^^^^^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] + +let bug1 () = + let foo : a:local_ string -> b:local_ string -> c:int -> unit = + fun ~a ~b ~c -> () + in + let bar = local_ foo ~b:"hello" in + let res = bar ~a:"world" in + res +[%%expect{| +Line 7, characters 2-5: +7 | res + ^^^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] +let bug2 () = + let foo : a:local_ string -> (b:local_ string -> (c:int -> unit)) = + fun ~a -> fun[@curry] ~b -> fun[@curry] ~c -> () + in + let bar = local_ foo ~b:"hello" in + let res = bar ~a:"world" in + res +[%%expect{| +val bug2 : unit -> c:int -> unit = +|}] +let bug3 () = + let foo : a:local_ string -> (b:local_ string -> (c:int -> unit)) = + fun ~a -> fun[@curry] ~b -> fun[@curry] ~c -> print_string a + in + let[@stack] bar = foo ~b:"hello" in + let res = bar ~a:"world" in + res +[%%expect{| +Line 3, characters 63-64: +3 | fun ~a -> fun[@curry] ~b -> fun[@curry] ~c -> print_string a + ^ +Error: The value a is local, so cannot be used inside a closure that might escape +|}] + + +(* + * Optional arguments + *) +let appopt1 (f : ?a:local_ int ref -> unit -> unit) = + let res = f ~a:(let x = local_ ref 42 in x) () in + res +[%%expect{| +val appopt1 : (?a:local_ int ref -> unit -> unit) -> unit = +|}] +let appopt2 (f : ?a:local_ int ref -> unit -> unit) = + let res = f ~a:(let x = local_ ref 42 in x) in + res +[%%expect{| +Line 3, characters 2-5: +3 | res + ^^^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] + +(* In principle. it would be sound to allow this one: + we close over a value in Alloc_local mode, but it is known to be immediate *) +let appopt3 (f : ?a:local_ int ref -> int -> int -> unit) = + let res = f 42 in + res +[%%expect{| +Line 3, characters 2-5: +3 | res + ^^^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] + +let optret1 (f : ?x:int -> local_ (y:unit -> unit -> int)) = f () +[%%expect{| +Line 1, characters 61-65: +1 | let optret1 (f : ?x:int -> local_ (y:unit -> unit -> int)) = f () + ^^^^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] + +(* Default arguments *) + +let foo ?(local_ x) () = x;; +[%%expect{| +val foo : ?x:local_ 'a -> unit -> local_ 'a option = +|}] + +let foo ?(local_ x = "hello") () = x;; +[%%expect{| +val foo : ?x:local_ string -> unit -> local_ string = +|}] + +let foo ?(local_ x = local_ "hello") () = x;; +[%%expect{| +Line 1, characters 21-35: +1 | let foo ?(local_ x = local_ "hello") () = x;; + ^^^^^^^^^^^^^^ +Error: This value escapes its region +|}] + +let foo ?(local_ x = local_ "hello") () = local_ x;; +[%%expect{| +Line 1, characters 21-35: +1 | let foo ?(local_ x = local_ "hello") () = local_ x;; + ^^^^^^^^^^^^^^ +Error: This value escapes its region +|}] + +(* + * Closures and context locks + *) + +let heap_closure () = + let foo = local_ ref 1 in + let fn () = + let[@stack] fn2 () = + let[@stack] _baz = foo in + () in + let res = fn2 () in + res + in + let _force_heap = ref fn in + let res = fn () in + res + +[%%expect{| +Line 10, characters 24-26: +10 | let _force_heap = ref fn in + ^^ +Error: This value escapes its region +|}] + +let local_closure () = + let foo = local_ ref 1 in + let local_ fn () = + let local_ fn2 () = + let _baz = local_ foo in + () + in + let res = fn2 () in + res + in + let res = fn () in + res + +[%%expect{| +val local_closure : unit -> unit = +|}] + +(* + * Always-nonlocal things + *) +let toplevel_stack = local_ {contents=42} +[%%expect{| +Line 1, characters 4-18: +1 | let toplevel_stack = local_ {contents=42} + ^^^^^^^^^^^^^^ +Error: This value escapes its region +|}] + +module M = struct + let _ = local_ {contents=42} +end +[%%expect{| +module M : sig end +|}] + +let _ = local_ {contents=42} +[%%expect{| +Line 1, characters 4-5: +1 | let _ = local_ {contents=42} + ^ +Error: This value escapes its region +|}] + + +module type T = sig val x : int option end +let first_class_module () = + let thing = local_ Some 1 in + let _m : (module T) = local_ (module struct let x = thing end) in + () +[%%expect{| +module type T = sig val x : int option end +Line 4, characters 50-51: +4 | let _m : (module T) = local_ (module struct let x = thing end) in + ^ +Error: This value escapes its region +|}] +let local_module () = + let thing = local_ Some 1 in + let _ = + let module M = struct let x = thing end in + local_ () + in () +[%%expect{| +Line 4, characters 30-31: +4 | let module M = struct let x = thing end in + ^ +Error: This value escapes its region +|}] +let obj () = + let thing = local_ Some 1 in + let _obj = object method foo = thing end in + () +[%%expect{| +Line 3, characters 33-38: +3 | let _obj = object method foo = thing end in + ^^^^^ +Error: The value thing is local, so cannot be used inside a closure that might escape +|}] + + +(* + * Higher order functions, with arguments that promise not to leak + *) + +let use_locally (f : local_ 'a -> 'a) (x : 'a) = f x +(* This version also promises not to leak the closure *) +let use_locally' (local_ f : local_ 'a -> 'a) (x : 'a) = + let res = f x in + res +[%%expect{| +val use_locally : (local_ 'a -> 'a) -> 'a -> 'a = +val use_locally' : local_ (local_ 'a -> 'a) -> 'a -> 'a = +|}] + +let no_leak = use_locally (fun x -> 1) 42 +let no_leak' = use_locally' (fun x -> 1) 42 +[%%expect{| +val no_leak : int = 1 +val no_leak' : int = 1 +|}] + +let leak_id = + use_locally (fun x -> x) 42 +[%%expect{| +Line 2, characters 24-25: +2 | use_locally (fun x -> x) 42 + ^ +Error: This value escapes its region +|}] + +let leak_ref = + let r = ref None in + use_locally (fun x -> r.contents <- Some x; x) 42 + +[%%expect{| +Line 3, characters 43-44: +3 | use_locally (fun x -> r.contents <- Some x; x) 42 + ^ +Error: This value escapes its region +|}] + +let leak_ref_2 = + let r = local_ ref None in + use_locally (fun x -> let _ = local_ r in r.contents <- Some x; x) 42 +[%%expect{| +Line 3, characters 39-40: +3 | use_locally (fun x -> let _ = local_ r in r.contents <- Some x; x) 42 + ^ +Error: The value r is local, so cannot be used inside a closure that might escape +|}] + +let leak_ref_3 = + let r = local_ ref None in + use_locally' (fun x -> let _ = local_ r in r.contents <- Some x; x) 42 +[%%expect{| +Line 3, characters 64-65: +3 | use_locally' (fun x -> let _ = local_ r in r.contents <- Some x; x) 42 + ^ +Error: This value escapes its region +|}] + + +(* raised exceptions must be global *) +let no_leak_exn = + use_locally (fun x -> let _exn = local_ Invalid_argument x in "bluh") "blah" +[%%expect{| +val no_leak_exn : string = "bluh" +|}] +let do_leak_exn = + use_locally (fun x -> let _exn = local_ raise (Invalid_argument x) in "bluh") "blah" + +[%%expect{| +Line 2, characters 66-67: +2 | use_locally (fun x -> let _exn = local_ raise (Invalid_argument x) in "bluh") "blah" + ^ +Error: This value escapes its region +|}] + +(* handled exceptions are known to be global *) +let catch (f : unit -> local_ string) = + let a = + match f () with + | _ -> "hello" + | exception (Invalid_argument x) -> x + in + let b = + try let _ = f () in "hello" with + | Invalid_argument x -> x + in + (a, b) +[%%expect{| +val catch : (unit -> local_ string) -> string * string = +|}] + + +(* same, but this time the function is allowed to return its argument *) +let use_locally (f : local_ 'a -> local_ 'a) : local_ 'a -> local_ 'a = f +[%%expect{| +val use_locally : (local_ 'a -> local_ 'a) -> local_ 'a -> local_ 'a = +|}] + +let loc = ((fun x -> local_ x) : local_ int -> local_ int) + +let no_leak_id = + let _ = + local_ use_locally ((fun x -> local_ x) : local_ int -> local_ int) 42 + in () + +[%%expect{| +val loc : local_ int -> local_ int = +val no_leak_id : unit = () +|}] + +module type S = sig val s : string end + +(* Don't escape through being unpacked as a module *) + +let bar (local_ (m : (module S))) = + let (module _) = m in + () +[%%expect{| +module type S = sig val s : string end +val bar : local_ (module S) -> unit = +|}] + +let bar (local_ (m : (module S))) = + let (module M) = m in + M.s +[%%expect{| +Line 2, characters 19-20: +2 | let (module M) = m in + ^ +Error: This value escapes its region +|}] + +let bar (local_ m) = + let module M = (val m : S) in + M.s +[%%expect{| +Line 2, characters 22-23: +2 | let module M = (val m : S) in + ^ +Error: This value escapes its region +|}] + +(* Don't escape through a lazy value *) + +let foo (local_ x) = + let _ = lazy (print_string !x) in + () +[%%expect{| +Line 2, characters 30-31: +2 | let _ = lazy (print_string !x) in + ^ +Error: The value x is local, so cannot be used inside a closure that might escape +|}] + +(* Don't escape through a functor *) + +let foo (local_ x) = + let module Foo (X : sig end) = struct + let () = print_string !x + end in + let module _ = Foo(struct end) in + () +[%%expect{| +Line 3, characters 27-28: +3 | let () = print_string !x + ^ +Error: The value x is local, so cannot be used inside a closure that might escape +|}] + +(* Don't escape through a class method *) + +let foo (local_ x) = + let module M = struct + class c = object + method m = !x + end + end in new c +[%%expect{| +Line 4, characters 18-19: +4 | method m = !x + ^ +Error: The value x is local, so cannot be used inside a closure that might escape +|}] + +(* Don't escape through an object method *) + +let foo (local_ x) = + let o = object + method m = !x + end in + o#m + +[%%expect{| +Line 3, characters 16-17: +3 | method m = !x + ^ +Error: The value x is local, so cannot be used inside a closure that might escape +|}] + +(* Don't escape through a class instance variable *) + +let foo (local_ x) = + let module M = struct + class c = object + val m = !x + end + end in new c +[%%expect{| +Line 4, characters 15-16: +4 | val m = !x + ^ +Error: The value x is local, so cannot be used inside a closure that might escape +|}] + +(* Don't escape through a class instance variable *) + +let foo (local_ x) = + let o = object + val m = !x + end in o +[%%expect{| +Line 3, characters 13-14: +3 | val m = !x + ^ +Error: The value x is local, so cannot be used inside a closure that might escape +|}] + +(* Don't escape through a class local variable *) + +let foo (local_ x) = + let module M = struct + class c = + let y = x in + object end + end in new M.c +[%%expect{| +Line 4, characters 10-11: +4 | let y = x in + ^ +Error: This value escapes its region +|}] + +let foo (local_ x) = + let module M = struct + class c = + let _ = x in + object end + end in new M.c +[%%expect{| +val foo : local_ 'a -> < > = +|}] + +let foo (local_ x : string ref) = + let module M = struct + class c = + let y = !x in + object method m = y + end + end in new M.c +[%%expect{| +val foo : local_ string ref -> < m : string > = +|}] + +(* Don't escape under a class parameter variable *) + +let foo (local_ x : string ref) = + let module M = struct + class c = + fun () -> + let y = !x in + object method m = y end + end in new M.c +[%%expect{| +Line 5, characters 15-16: +5 | let y = !x in + ^ +Error: The value x is local, so cannot be used inside a closure that might escape +|}] + +let foo (local_ x : string ref) = + let module M = struct + class c = + let y = !x in + fun () -> + object method m = y end + end in new M.c +[%%expect{| +val foo : local_ string ref -> (unit -> < m : string >) = +|}] + +(* Don't escape in inherit expressions *) + +class d (p : string) = object method m = p end + +let foo (local_ x : string ref) = + let module M = struct + class c = object + inherit d !x + method n = 42 + end + end in new M.c +[%%expect{| +class d : string -> object method m : string end +Line 6, characters 17-18: +6 | inherit d !x + ^ +Error: The value x is local, so cannot be used inside a closure that might escape +|}] + +(* Don't escape in initializers *) + +let foo (local_ x) = + let o = object + initializer (print_string !x) + end in + o#m + +[%%expect{| +Line 3, characters 31-32: +3 | initializer (print_string !x) + ^ +Error: The value x is local, so cannot be used inside a closure that might escape +|}] + +(* Don't escape in non-function 'let rec' bindings *) +let foo (local_ x) = + (* fine, local recursive function *) + let rec g () = let _ = x in h (); () and h () = g (); () in + g (); () +[%%expect {| +val foo : local_ 'a -> unit = +|}] + +let foo (local_ x) = + (* fine, local non-recursive binding *) + let _ = (x, 1) in + 1 +[%%expect {| +val foo : local_ 'a -> int = +|}] + +let foo (local_ x) = + (* not fine, local recursive non-function (needs caml_alloc_dummy) *) + let rec g = x :: g in + let _ = g in () +[%%expect {| +Line 3, characters 14-15: +3 | let rec g = x :: g in + ^ +Error: This value escapes its region +|}] + +(* Cannot pass local values to tail calls *) + +let print (local_ x) = print_string !x + +let foo x = + let r = local_ { contents = x } in + print r +[%%expect{| +val print : local_ string ref -> unit = +Line 5, characters 8-9: +5 | print r + ^ +Error: This local value escapes its region + Hint: This argument cannot be local, because this is a tail call +|}] + +let foo x = + let r = local_ { contents = x } in + print r; + () +[%%expect{| +val foo : string -> unit = +|}] + +let foo x = + let r = local_ { contents = x } in + local_ print r +[%%expect{| +val foo : string -> local_ unit = +|}] + +(* Cannot call local values in tail calls *) + +let foo x = + let r = local_ { contents = x } in + let local_ foo () = r.contents in + foo () +[%%expect{| +Line 4, characters 2-5: +4 | foo () + ^^^ +Error: This local value escapes its region + Hint: This function cannot be local, because this is a tail call +|}] + +let foo x = + let r = local_ { contents = x } in + let local_ foo () = r.contents in + let res = foo () in + res +[%%expect{| +val foo : 'a -> 'a = +|}] + +let foo x = + let r = local_ { contents = x } in + let local_ foo () = r.contents in + local_ foo () +[%%expect{| +val foo : 'a -> local_ 'a = +|}] + +(* Cannot return local values without annotations on all exits *) + +let foo x = + let r = local_ { contents = x } in + r +[%%expect{| +Line 3, characters 2-3: +3 | r + ^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] + +let foo x = + let r = local_ { contents = x } in + local_ r +[%%expect{| +val foo : 'a -> local_ 'a ref = +|}] + +let foo p x = + let r = local_ { contents = x } in + if p then local_ r + else r +[%%expect{| +Line 4, characters 7-8: +4 | else r + ^ +Error: This function return is not annotated with "local_" + whilst other returns were. +|}] + +let foo p x = + let r = local_ { contents = x } in + if p then local_ r + else local_ r +[%%expect{| +val foo : bool -> 'a -> local_ 'a ref = +|}] + +let foo p x = local_ + let r = local_ { contents = x } in + if p then r + else r +[%%expect{| +val foo : bool -> 'a -> local_ 'a ref = +|}] + +(* Non-local regional values can be passed to tail calls *) +let rec length acc (local_ xl) = + match xl with + | [] -> 0 + | x :: xs -> length (acc + 1) xs +[%%expect{| +val length : int -> local_ 'a list -> int = +|}] + +let foo () = + let r = local_ ref 5 in + let bar x = !x in + let baz () = + bar r + in + let x = baz () in + x +[%%expect{| +val foo : unit -> int = +|}] + + +(* Parameter modes must be matched by the type *) + +let foo : 'a -> unit = fun (local_ x) -> () +[%%expect{| +Line 1, characters 23-43: +1 | let foo : 'a -> unit = fun (local_ x) -> () + ^^^^^^^^^^^^^^^^^^^^ +Error: This function has a local parameter, but was expected to have type: + 'a -> unit +|}] + +(* Return mode must be greater than the type *) + +let foo : unit -> local_ string = fun () -> "hello" +[%%expect{| +val foo : unit -> local_ string = +|}] + +let foo : unit -> string = fun () -> local_ "hello" +[%%expect{| +Line 1, characters 37-51: +1 | let foo : unit -> string = fun () -> local_ "hello" + ^^^^^^^^^^^^^^ +Error: This value escapes its region +|}] + +(* Fields have the same mode unless they are nonlocal or mutable *) + +type 'a imm = { imm : 'a } +type 'a mut = { mutable mut : 'a } +type 'a gbl = { global_ gbl : 'a } +type 'a nlcl = { nonlocal_ nlcl : 'a } +[%%expect{| +type 'a imm = { imm : 'a; } +type 'a mut = { mutable mut : 'a; } +type 'a gbl = { global_ gbl : 'a; } +type 'a nlcl = { nonlocal_ nlcl : 'a; } +|}] + +let foo (local_ x) = x.imm +[%%expect{| +val foo : local_ 'a imm -> local_ 'a = +|}] +let foo y = + let x = local_ { imm = y } in + x.imm +[%%expect{| +Line 3, characters 2-7: +3 | x.imm + ^^^^^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] +let foo (local_ x) = x.mut +[%%expect{| +val foo : local_ 'a mut -> 'a = +|}] +let foo y = + let x = local_ { mut = y } in + x.mut +[%%expect{| +val foo : 'a -> 'a = +|}] +let foo (local_ x) = x.gbl +[%%expect{| +val foo : local_ 'a gbl -> 'a = +|}] +let foo y = + let x = local_ { gbl = y } in + x.gbl +[%%expect{| +val foo : 'a -> 'a = +|}] +let foo (local_ x) = x.nlcl +[%%expect{| +val foo : local_ 'a nlcl -> local_ 'a = +|}] +let foo (local_ y) = + let x = local_ { nlcl = y } in + x.nlcl +[%%expect{| +val foo : local_ 'a -> local_ 'a = +|}] + +let foo (local_ { imm }) = imm +[%%expect{| +val foo : local_ 'a imm -> local_ 'a = +|}] +let foo y = + let { imm } = local_ { imm = y } in + imm +[%%expect{| +Line 3, characters 2-5: +3 | imm + ^^^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] +let foo (local_ { mut }) = mut +[%%expect{| +val foo : local_ 'a mut -> 'a = +|}] +let foo y = + let { mut } = local_ { mut = y } in + mut +[%%expect{| +val foo : 'a -> 'a = +|}] +let foo (local_ { gbl }) = gbl +[%%expect{| +val foo : local_ 'a gbl -> 'a = +|}] +let foo y = + let { gbl } = local_ { gbl = y } in + gbl +[%%expect{| +val foo : 'a -> 'a = +|}] +let foo (local_ { nlcl }) = nlcl +[%%expect{| +val foo : local_ 'a nlcl -> local_ 'a = +|}] +let foo (local_ y) = + let { nlcl } = local_ { nlcl = y } in + nlcl +[%%expect{| +val foo : local_ 'a -> local_ 'a = +|}] + +let foo (local_ imm) = + let _ = { imm } in + () +[%%expect{| +val foo : local_ 'a -> unit = +|}] +let foo () = + let imm = local_ ref 5 in + let _ = { imm } in + () +[%%expect{| +val foo : unit -> unit = +|}] +let foo (local_ mut) = + let _ = { mut } in + () +[%%expect{| +Line 2, characters 12-15: +2 | let _ = { mut } in + ^^^ +Error: This value escapes its region +|}] +let foo () = + let mut = local_ ref 5 in + let _ = { mut } in + () +[%%expect{| +Line 3, characters 12-15: +3 | let _ = { mut } in + ^^^ +Error: This value escapes its region +|}] +let foo (local_ gbl) = + let _ = { gbl } in + () +[%%expect{| +Line 2, characters 12-15: +2 | let _ = { gbl } in + ^^^ +Error: This value escapes its region +|}] +let foo () = + let gbl = local_ ref 5 in + let _ = { gbl } in + () +[%%expect{| +Line 3, characters 12-15: +3 | let _ = { gbl } in + ^^^ +Error: This value escapes its region +|}] +let foo (local_ nlcl) = + let _ = { nlcl } in + () +[%%expect{| +val foo : local_ 'a -> unit = +|}] +let foo () = + let nlcl = local_ ref 5 in + let _ = { nlcl } in + () +[%%expect{| +Line 3, characters 12-16: +3 | let _ = { nlcl } in + ^^^^ +Error: This local value escapes its region +|}] + +(* Global and nonlocal fields are preserved in module inclusion *) +module M : sig + type t = { nonlocal_ foo : string } +end = struct + type t = { foo : string } +end +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type t = { foo : string } +5 | end +Error: Signature mismatch: + Modules do not match: + sig type t = { foo : string; } end + is not included in + sig type t = { nonlocal_ foo : string; } end + Type declarations do not match: + type t = { foo : string; } + is not included in + type t = { nonlocal_ foo : string; } + Fields do not match: + foo : string; + is not compatible with: + nonlocal_ foo : string; + The second is nonlocal and the first is not. +|}] + +module M : sig + type t = { foo : string } +end = struct + type t = { nonlocal_ foo : string } +end +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type t = { nonlocal_ foo : string } +5 | end +Error: Signature mismatch: + Modules do not match: + sig type t = { nonlocal_ foo : string; } end + is not included in + sig type t = { foo : string; } end + Type declarations do not match: + type t = { nonlocal_ foo : string; } + is not included in + type t = { foo : string; } + Fields do not match: + nonlocal_ foo : string; + is not compatible with: + foo : string; + The first is nonlocal and the second is not. +|}] + +module M : sig + type t = { global_ foo : string } +end = struct + type t = { foo : string } +end +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type t = { foo : string } +5 | end +Error: Signature mismatch: + Modules do not match: + sig type t = { foo : string; } end + is not included in + sig type t = { global_ foo : string; } end + Type declarations do not match: + type t = { foo : string; } + is not included in + type t = { global_ foo : string; } + Fields do not match: + foo : string; + is not compatible with: + global_ foo : string; + The second is global and the first is not. +|}] + +module M : sig + type t = { foo : string } +end = struct + type t = { global_ foo : string } +end +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | type t = { global_ foo : string } +5 | end +Error: Signature mismatch: + Modules do not match: + sig type t = { global_ foo : string; } end + is not included in + sig type t = { foo : string; } end + Type declarations do not match: + type t = { global_ foo : string; } + is not included in + type t = { foo : string; } + Fields do not match: + global_ foo : string; + is not compatible with: + foo : string; + The first is global and the second is not. +|}] + +(* Special handling of tuples in matches and let bindings *) +let escape : 'a -> unit = fun x -> () + +let foo (local_ x) y = + match x, y with + | Some _, Some b -> escape b + | None, _ -> () + | pr -> let _, _ = pr in ();; +[%%expect{| +val escape : 'a -> unit = +val foo : local_ 'a option -> 'b option -> unit = +|}] + +let foo (local_ x) y = + let pr = x, y in + match pr with + | Some _, Some b -> escape b + | None, _ -> () + | _ -> ();; +[%%expect{| +Line 4, characters 29-30: +4 | | Some _, Some b -> escape b + ^ +Error: This value escapes its region +|}] + +let foo (local_ x) y = + match x, y with + | pr -> + let _, b = pr in + escape b + | _ -> ();; +[%%expect{| +Line 5, characters 11-12: +5 | escape b + ^ +Error: This value escapes its region +|}] + +let foo p (local_ x) y z = + let (_, b) as pr = + if p then x, y else z + in + let _, _ = pr in + escape b;; +[%%expect{| +val foo : bool -> local_ 'a -> 'b -> 'a * 'b -> unit = +|}] + +let foo p (local_ x) y (local_ z) = + let _, b = + if p then x, y else z + in + escape b;; +[%%expect{| +Line 5, characters 9-10: +5 | escape b;; + ^ +Error: This value escapes its region +|}] + +let foo p (local_ x) y z = + let a, _ = + if p then x, y else z + in + escape a;; +[%%expect{| +Line 5, characters 9-10: +5 | escape a;; + ^ +Error: This value escapes its region +|}] + +let foo p (local_ x) y z = + let pr = + if p then x, y else z + in + let _, b = pr in + escape b;; +[%%expect{| +Line 6, characters 9-10: +6 | escape b;; + ^ +Error: This value escapes its region +|}] + +(* [as] patterns *) + +let foo (local_ x) = + match x with + | None as y -> escape y + | Some _ -> () +[%%expect{| +val foo : local_ 'a option -> unit = +|}] + +let foo (local_ x) = + match x with + | None -> () + | Some _ as y -> escape y +[%%expect{| +Line 4, characters 26-27: +4 | | Some _ as y -> escape y + ^ +Error: This value escapes its region +|}] + +let foo (local_ x) = + match x with + | 0 as y -> escape y + | _ -> () +[%%expect{| +val foo : local_ int -> unit = +|}] + +let foo (local_ x) = + match x with + | 'a'..'e' as y -> escape y + | _ -> () +[%%expect{| +val foo : local_ char -> unit = +|}] + +let foo (local_ x) = + match x with + | 1.1 as y -> escape y + | _ -> () +[%%expect{| +Line 3, characters 23-24: +3 | | 1.1 as y -> escape y + ^ +Error: This value escapes its region +|}] + +let foo (local_ x) = + match x with + | `Foo as y -> escape y + | _ -> () +[%%expect{| +val foo : local_ [> `Foo ] -> unit = +|}] + +let foo (local_ x) = + match x with + | (`Foo _) as y -> escape y + | _ -> () +[%%expect{| +Line 3, characters 28-29: +3 | | (`Foo _) as y -> escape y + ^ +Error: This value escapes its region +|}] + +let foo (local_ x) = + match x with + | (None | Some _) as y -> escape y +[%%expect{| +Line 3, characters 35-36: +3 | | (None | Some _) as y -> escape y + ^ +Error: This value escapes its region +|}] + +let foo (local_ x) = + match x with + | (Some _|None) as y -> escape y +[%%expect{| +Line 3, characters 33-34: +3 | | (Some _|None) as y -> escape y + ^ +Error: This value escapes its region +|}] + +type foo = [`Foo | `Bar] + +let foo (local_ x) = + match x with + | #foo as y -> escape y +[%%expect{| +type foo = [ `Bar | `Foo ] +val foo : local_ [< foo ] -> unit = +|}] + +type foo = [`Foo | `Bar of int] + +let foo (local_ x) = + match x with + | #foo as y -> escape y +[%%expect{| +type foo = [ `Bar of int | `Foo ] +Line 5, characters 24-25: +5 | | #foo as y -> escape y + ^ +Error: This value escapes its region +|}] + +(* Primitives *) + +(* Poly-moded eta expansion *) +module Heap32 : sig val add : int32 -> int32 -> int32 end = Int32 +module Heap32E : sig external add : int32 -> int32 -> int32 = "%int32_add" end = Int32 +module Local32 : sig val add : local_ int32 -> local_ int32 -> local_ int32 end = Int32 +module Local32E : sig external add : local_ int32 -> local_ int32 -> local_ int32 = "%int32_add" end = Int32 +[%%expect{| +module Heap32 : sig val add : int32 -> int32 -> int32 end +module Heap32E : + sig external add : int32 -> int32 -> int32 = "%int32_add" end +module Local32 : + sig val add : local_ int32 -> local_ int32 -> local_ int32 end +module Local32E : + sig + external add : local_ int32 -> local_ int32 -> local_ int32 + = "%int32_add" + end +|}] +module Bad32 : sig val add : local_ int32 -> local_ int32 -> int32 end = + struct let add = Int32.add end +[%%expect{| +Line 2, characters 2-32: +2 | struct let add = Int32.add end + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Signature mismatch: + Modules do not match: + sig val add : local_ int32 -> local_ int32 -> local_ int32 end + is not included in + sig val add : local_ int32 -> local_ int32 -> int32 end + Values do not match: + val add : local_ int32 -> local_ int32 -> local_ int32 + is not included in + val add : local_ int32 -> local_ int32 -> int32 +|}] +(* Return modes *) +let zx : int ref -> (int -> unit) = (:=) +let zz : local_ (int ref) -> int -> unit = (:=) +let zy : local_ (int ref) -> (int -> unit) = (:=) +[%%expect{| +val zx : int ref -> int -> unit = +val zz : local_ int ref -> int -> unit = +Line 3, characters 45-49: +3 | let zy : local_ (int ref) -> (int -> unit) = (:=) + ^^^^ +Error: This expression has type local_ 'a ref -> 'a -> unit + but an expression was expected of type local_ int ref -> (int -> unit) +|}] + +let int32 (local_ x) (local_ y) = local_ + Int32.(div (logxor (mul x y) (sub x y)) (shift_right y 10)) +let int64 (local_ x) (local_ y) = local_ + Int64.(div (logxor (mul x y) (sub x y)) (shift_right y 10)) +let nativeint (local_ x) (local_ y) = local_ + Nativeint.(div (logxor (mul x y) (sub x y)) (shift_right y 10)) +let float (local_ x) (local_ y) = local_ + (x +. y *. x -. 42.) +[%%expect{| +val int32 : local_ int32 -> local_ int32 -> local_ int32 = +val int64 : local_ int64 -> local_ int64 -> local_ int64 = +val nativeint : local_ nativeint -> local_ nativeint -> local_ nativeint = + +val float : local_ float -> local_ float -> local_ float = +|}] + +let etapair (local_ x) = local_ (fst x, snd x) +[%%expect{| +val etapair : local_ 'a * 'b -> local_ 'a * 'b = +|}] + +(* Arity checking on primitives *) +external goodadd : int32 -> int32 -> int32 = "%int32_add" +[%%expect{| +external goodadd : int32 -> int32 -> int32 = "%int32_add" +|}] +external badadd : int32 -> (int32 -> int32) = "%int32_add" +[%%expect{| +Line 1, characters 0-58: +1 | external badadd : int32 -> (int32 -> int32) = "%int32_add" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Wrong arity for builtin primitive "%int32_add" +|}] + +let compare (local_ x) (local_ y) = + [x = y; x <> y; x < y; x > y; x <= y; x >= y; compare x y = 0; x == y; x != y] +[%%expect{| +val compare : local_ 'a -> local_ 'a -> bool list = +|}] + +(* integer primitives accept local args *) +let intf (local_ x) = x |> Int.succ |> Int.add 42 |> pred |> (/) 100 |> (+) 1 +[%%expect{| +val intf : local_ int -> int = +|}] + +(* primitives don't count as tail calls, so you can pass them locals *) +let primloc x = let local_ y = Int32.add x 1l in Int32.to_int y +[%%expect{| +val primloc : int32 -> int = +|}] + +(* (&&) and (||) tail call on the right *) +let testbool1 x = + let local_ b = not x in + (b || false) && true + +let testbool2 x = + let local_ b = not x in + true && (false || b) +[%%expect{| +val testbool1 : bool -> bool = +Line 7, characters 20-21: +7 | true && (false || b) + ^ +Error: This local value escapes its region + Hint: Cannot return local value without an explicit "local_" annotation +|}] + + +(* mode-crossing using unary + *) +let promote (local_ x) = +x +[%%expect{| +val promote : local_ int -> int = +|}] + +(* Or-patterns *) +let foo (local_ x) y = + match y, x with + | Some z, None | None, Some z -> z + | None, None | Some _, Some _ -> assert false +[%%expect{| +val foo : local_ 'a option -> 'a option -> local_ 'a = +|}] + +let foo (local_ x) y = + match x, y with + | Some z, None | None, Some z -> z + | None, None | Some _, Some _ -> assert false +[%%expect{| +val foo : local_ 'a option -> 'a option -> local_ 'a = +|}] + +module M = struct + let (Some z, _, _) | (None, Some z, _) + | (None, None, z) = (Some (ref 0), (local_ (Some (ref 0))), (ref 0)) +end +[%%expect{| +Line 2, characters 35-36: +2 | let (Some z, _, _) | (None, Some z, _) + ^ +Error: This value escapes its region +|}] + +module M = struct + let (Some z, _, _) | (None, Some z, _) + | (None, None, z) = ((local_ Some (ref 0)), (Some (ref 0)), (ref 0)) +end +[%%expect{| +Line 2, characters 12-13: +2 | let (Some z, _, _) | (None, Some z, _) + ^ +Error: This value escapes its region +|}] + +(* Example of backtracking after mode error *) +let f g n = + let a = local_ [n+1] in + let () = g a in + () +let z : (int list -> unit) -> int -> unit = f +[%%expect{| +val f : (local_ int list -> unit) -> int -> unit = +Line 5, characters 44-45: +5 | let z : (int list -> unit) -> int -> unit = f + ^ +Error: This expression has type (local_ int list -> unit) -> int -> unit + but an expression was expected of type + (int list -> unit) -> int -> unit + Type local_ int list -> unit is not compatible with type + int list -> unit +|}] + +module M = struct + let f g n = + let a = local_ [n+1] in + let () = g a in + () + let z : (int list -> unit) -> int -> unit = f +end +[%%expect{| +Line 6, characters 46-47: +6 | let z : (int list -> unit) -> int -> unit = f + ^ +Error: This expression has type (local_ int list -> unit) -> int -> unit + but an expression was expected of type + (int list -> unit) -> int -> unit + Type local_ int list -> unit is not compatible with type + int list -> unit +|}] diff --git a/testsuite/tests/typing-local/mutate.ml b/testsuite/tests/typing-local/mutate.ml new file mode 100644 index 00000000000..500393aaced --- /dev/null +++ b/testsuite/tests/typing-local/mutate.ml @@ -0,0 +1,11 @@ +(* TEST + flags += "-extension local" *) +let[@inline never] f (g : local_ _ -> unit) n = + let r = local_ { contents = ref 0 } in + g r; + r.contents <- ref n; + Gc.minor (); + r.contents.contents + +let _ = + Printf.printf "%d\n" (f (fun _ -> ()) 42) diff --git a/testsuite/tests/typing-local/mutate.reference b/testsuite/tests/typing-local/mutate.reference new file mode 100644 index 00000000000..d81cc0710eb --- /dev/null +++ b/testsuite/tests/typing-local/mutate.reference @@ -0,0 +1 @@ +42 diff --git a/testsuite/tests/typing-local/partial.ml b/testsuite/tests/typing-local/partial.ml new file mode 100644 index 00000000000..8ffef312b37 --- /dev/null +++ b/testsuite/tests/typing-local/partial.ml @@ -0,0 +1,37 @@ +(* TEST + flags += " -g -extension local" *) + +let f1 ~a ~b ~c ~d ~e = a + b + c + d + e +let f2 ~b ~c ~e = f1 ~b ~c ~e +let f3 = f2 ~a:1 +let f4 () = f3 ~b:2 ~c:3 ~d:4 +let () = Printf.printf "%d\n" (f4 () ~e:5) + + +(* the mutable pattern causes this function to split + into two functions *) +let next {contents} a b = contents a b + +(* nonetheless, this should still be a tail call *) +let[@inline never] app c d e = next c d e + +let backtrace () () = + let open Printexc in + get_callstack 1000 + |> backtrace_slots + |> Option.value ~default:[||] + |> Array.map Slot.name + |> Array.map (Option.value ~default:"??") + +let test () = + let slots = app (ref backtrace) () () in + Array.iteri (fun i s -> Printf.printf "%s%s" (if i > 0 then "; " else "") s) slots; + Printf.printf "\n%!" + +let () = test () + +let[@inline never] rec spin ({contents} as r) a b = + if b = 0 then contents + a + else (Sys.opaque_identity spin) r a (b-1) + +let () = Printf.printf "%d\n" (spin (ref 1) 1 1_000_000) diff --git a/testsuite/tests/typing-local/partial.reference b/testsuite/tests/typing-local/partial.reference new file mode 100644 index 00000000000..4617cd2551e --- /dev/null +++ b/testsuite/tests/typing-local/partial.reference @@ -0,0 +1,3 @@ +15 +Partial.backtrace; Partial.test; Partial +2 diff --git a/testsuite/tests/typing-local/print_syntax.ml b/testsuite/tests/typing-local/print_syntax.ml new file mode 100644 index 00000000000..fdde6d0e41c --- /dev/null +++ b/testsuite/tests/typing-local/print_syntax.ml @@ -0,0 +1,15 @@ +(* TEST + include ocamlcommon + files = "example_syntax.ml" + reference = "${test_source_directory}/example_syntax.ml" +*) + +let () = + let fname = "example_syntax.ml" in + Clflags.Extension.enable "local"; + let ic = open_in fname in + let lexbuf = Lexing.from_channel ic in + Location.init lexbuf fname; + let ast = Parse.implementation lexbuf in + close_in ic; + Format.printf "%a@." Pprintast.structure ast diff --git a/testsuite/tests/typing-local/regions.ml b/testsuite/tests/typing-local/regions.ml new file mode 100644 index 00000000000..de8160017f2 --- /dev/null +++ b/testsuite/tests/typing-local/regions.ml @@ -0,0 +1,213 @@ +(* TEST + flags += "-extension local" + * native *) + +external local_stack_offset : unit -> int = "caml_local_stack_offset" +external opaque_identity : ('a[@local_opt]) -> ('a[@local_opt]) = "%opaque" +let[@inline never] ignore_local (local_ x) = let _ = opaque_identity x in () +let last_offset = ref 0 + +let check_empty name = + let offs = local_stack_offset () in + if offs <> !last_offset then begin + Printf.printf "%25s: %d bytes leaked\n%!" name (offs - !last_offset) + end else begin + Printf.printf "%25s: OK\n%!" name + end; + last_offset := offs + +let () = check_empty "startup" + +let[@inline never] uses_local x = + let local_ r = ref x in + let _ = opaque_identity r in + () +let () = + uses_local 42; + check_empty "function call" + +let[@inline never] uses_local_try x = + try + let r = local_ ref x in + if opaque_identity false then raise Exit; + let _ = opaque_identity r in + () + with Exit -> () +let () = + uses_local_try 42; + check_empty "exn function call" + +let[@inline never][@specialise never][@local never] do_tailcall f = + let local_ r = ref 42 in + let _ = opaque_identity r in + f () +let () = + do_tailcall (fun () -> check_empty "during indirect tailcall"); + check_empty "after indirect tailcall" + + +let[@inline always] tailcalled_function () = + check_empty "during direct tailcall" +let[@inline never] do_direct_tailcall () = + let local_ r = ref 42 in + let _ = opaque_identity r in + tailcalled_function () +let () = + do_direct_tailcall (); + check_empty "after direct tailcall" + + +let[@inline never][@specialise never][@local never] do_overtailcall f = + let local_ r = ref 42 in + let _ = opaque_identity r in + f () () +let () = + do_overtailcall (fun () -> + let local_ r = ref 42 in + let _ = opaque_identity r in + fun () -> + check_empty "during indirect overtail"); + check_empty "after indirect overtail" + +let[@inline always] overtailcalled_function () = + let local_ r = ref 42 in + let _ = opaque_identity r in + fun () -> + check_empty "during direct overtail" +let[@inline never] do_direct_overtailcall () = + let local_ r = ref 42 in + let _ = opaque_identity r in + overtailcalled_function () () +let () = + do_direct_overtailcall (); + check_empty "after direct overtail" + + + +let[@inline never] local_ret a b = local_ ref (a + b) +let[@inline never] calls_local_ret () = + let local_ r = (local_ret 1) 2 in + let () = ignore_local r in + () +let () = + calls_local_ret (); + check_empty "apply merging" + + +let () = + let local_ z = ref 1000 in + let _ = opaque_identity z in + () +let () = check_empty "toplevel binding" + + +let rec foo = 1 :: bar +and bar = + let local_ z = ref 1000 in + let _ = opaque_identity z in + 1 :: foo +let () = check_empty "toplevel rec binding" + + +;; +(let local_ z = ref 1000 in + let _ = opaque_identity z in + ());; +let () = check_empty "toplevel eval" + +module type T = sig val x : int end +let _ = + let module M : T = + (val (let local_ r = ref 42 in + let _ = opaque_identity r in + ((module struct let x = !r + 1 end) : (module T)))) in + M.x +let () = check_empty "first class mod" + +class d x = + let z = + let r = local_ ref 1000 in + let _ = opaque_identity r in + !r + 1 + in + object + val p = + let r = opaque_identity (local_ ref 42) in + !r + initializer + let r = local_ ref 42 in + let _ = opaque_identity r in + () + method getd = + z + p + x + end + +let () = check_empty "class d definition" + +class c = + let z = + let r = local_ ref 1000 in + let _ = opaque_identity r in + !r + 1 + in + object + initializer + let r = local_ ref 42 in + let _ = opaque_identity r in + () + val q = + let r = opaque_identity (local_ ref 42) in + !r + inherit d ( + let r = local_ ref 42 in + let _ = opaque_identity r in + 42) + method getc = + z + p + q + end + +class e = d ( + let r = local_ ref 42 in + let _ = opaque_identity r in + !r) + +let () = check_empty "class definitions" + +let o1 = new c +let o2 = new d 42 +let o3 = new e +let () = check_empty "class instantiation" + + +let glob = ref 0 +let[@inline never] local_fn_ret () s = local_ + incr glob; + fun x -> Gc.minor (); string_of_int x ^ s + +let globstr = ref "" +let unknown_fn = ref local_fn_ret +let gpart_fn = ref (local_fn_ret ()) +let obj = ref (object + method local_ret s = local_ + incr glob; + fun x -> Gc.minor (); string_of_int x ^ s + end) +let () = + let check s = + globstr := s; assert (s = "5!") + in + check (local_fn_ret () "!" 5); + check_empty "static overapply"; + check (!unknown_fn () "!" 5); + check_empty "dynamic overapply"; + let part_fn = local_fn_ret () in + check (part_fn "!" 5); + check_empty "static/partial overapply"; + gpart_fn := local_fn_ret (); + check (!gpart_fn "!" 5); + check_empty "dynamic/partial overapply"; + check (!obj#local_ret "!" 5); + check_empty "method overapply" + + +let () = Gc.compact () diff --git a/testsuite/tests/typing-local/regions.reference b/testsuite/tests/typing-local/regions.reference new file mode 100644 index 00000000000..bea73d31191 --- /dev/null +++ b/testsuite/tests/typing-local/regions.reference @@ -0,0 +1,24 @@ + startup: OK + function call: OK + exn function call: OK + during indirect tailcall: OK + after indirect tailcall: OK + during direct tailcall: OK + after direct tailcall: OK + during indirect overtail: OK + after indirect overtail: OK + during direct overtail: OK + after direct overtail: OK + apply merging: OK + toplevel binding: OK + toplevel rec binding: OK + toplevel eval: OK + first class mod: OK + class d definition: OK + class definitions: OK + class instantiation: OK + static overapply: OK + dynamic overapply: OK + static/partial overapply: OK +dynamic/partial overapply: OK + method overapply: OK diff --git a/testsuite/tests/typing-local/tailcalls.ml b/testsuite/tests/typing-local/tailcalls.ml new file mode 100644 index 00000000000..d5cbb900f1d --- /dev/null +++ b/testsuite/tests/typing-local/tailcalls.ml @@ -0,0 +1,144 @@ +(* TEST + flags += "-extension local" + * native *) + +open Printexc + +let get_backtrace () = + raw_backtrace_entries (get_callstack 10) + +let equal_backtraces b1 b2 = + Array.length b1 = Array.length b2 + && Array.for_all2 + (fun s1 s2 -> + Int.equal + (s1 : raw_backtrace_entry :> int) + (s2 : raw_backtrace_entry :> int)) + b1 b2 + +let rec foo x stack = + let r = local_ ref x in + r := !r - 1; + let stack' = get_backtrace () in + begin match stack with + | None -> () + | Some stack -> assert (equal_backtraces stack stack') + end; + if !r <= 0 then () + else foo !r (Some stack') + +let () = foo 20 None + +let[@inline never][@specialise never][@local never] bar stack = + let stack' = get_backtrace () in + assert (equal_backtraces stack stack'); + () + +let foo () = + let stack = get_backtrace () in + bar stack + +external local_stack_offset : unit -> int = "caml_local_stack_offset" + +let[@inline never][@specialise never][@local never] allocate () = + local_ ref 0 + +let[@inline never][@specialise never][@local never] use (local_ r) = + r := 10 + +let[@inline never][@specialise never][@local never] bar original = + let in_tail_call = local_stack_offset () in + assert (original = in_tail_call) + +let[@inline never][@specialise never][@local never] foo () = + let original = local_stack_offset () in + let r = allocate () in + let with_ref = local_stack_offset () in + assert (with_ref > original); + use r; + bar original + +let () = foo () + +let[@inline never][@specialise never][@local never] foo f = + let original = local_stack_offset () in + let r = allocate () in + let with_ref = local_stack_offset () in + assert (with_ref > original); + use r; + f original + +let () = foo bar + +let[@inline never][@specialise never][@local never] bar original + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () = + let in_tail_call = local_stack_offset () in + assert (original = in_tail_call) + +let[@inline never][@specialise never][@local never] foo () = + let original = local_stack_offset () in + let r = allocate () in + let with_ref = local_stack_offset () in + assert (with_ref > original); + use r; + bar original + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + +let () = foo () + +let[@inline never][@specialise never][@local never] foo f = + let original = local_stack_offset () in + let r = allocate () in + let with_ref = local_stack_offset () in + assert (with_ref > original); + use r; + f original + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + () () () () () () () () () () + +let () = foo bar + +let[@inline never][@specialise never][@local never] rec foo previous = + match previous with + | None -> + let original = local_stack_offset () in + let r = allocate () in + let with_ref = local_stack_offset () in + assert (with_ref > original); + use r; + foo (Some original) + | Some original -> + let in_tail_call = local_stack_offset () in + assert (original = in_tail_call) + +let () = foo None + +let[@inline always] inl a b = let local_ z = (a, b) in let r = fst z + snd z in r +let[@inline never] lret a b = local_ let local_ _z = [|a;b|] in inl a b +let () = assert ((lret 1 2)+1 = 4) diff --git a/testsuite/tests/typing-local/tailcalls.reference b/testsuite/tests/typing-local/tailcalls.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/testsuite/tests/typing-misc/printing.ml b/testsuite/tests/typing-misc/printing.ml index 526bfa8fea6..4c6cee131f8 100644 --- a/testsuite/tests/typing-misc/printing.ml +++ b/testsuite/tests/typing-misc/printing.ml @@ -110,9 +110,9 @@ and bar () = let x = foo () in x |> List.fold_left max 0 x [%%expect {| -Line 4, characters 7-29: +Line 4, characters 26-27: 4 | x |> List.fold_left max 0 x - ^^^^^^^^^^^^^^^^^^^^^^ + ^ Error: This expression has type int but an expression was expected of type - int list -> 'a + 'a -> 'b |}] diff --git a/testsuite/tools/parsecmm.mly b/testsuite/tools/parsecmm.mly index e75aadb9e6a..a239b3a2e53 100644 --- a/testsuite/tools/parsecmm.mly +++ b/testsuite/tools/parsecmm.mly @@ -216,10 +216,11 @@ expr: | LPAREN LETMUT letmutdef sequence RPAREN { make_letmutdef $3 $4 } | LPAREN ASSIGN IDENT expr RPAREN { Cassign(find_ident $3, $4) } | LPAREN APPLY location expr exprlist machtype RPAREN - { Cop(Capply $6, $4 :: List.rev $5, debuginfo ?loc:$3 ()) } + { Cop(Capply ($6, Lambda.Rc_normal), + $4 :: List.rev $5, debuginfo ?loc:$3 ()) } | LPAREN EXTCALL STRING exprlist machtype RPAREN {Cop(Cextcall($3, $5, [], false), List.rev $4, debuginfo ())} - | LPAREN ALLOC exprlist RPAREN { Cop(Calloc, List.rev $3, debuginfo ()) } + | LPAREN ALLOC exprlist RPAREN { Cop(Calloc Lambda.Alloc_heap, List.rev $3, debuginfo ()) } | LPAREN SUBF expr RPAREN { Cop(Cnegf, [$3], debuginfo ()) } | LPAREN SUBF expr expr RPAREN { Cop(Csubf, [$3; $4], debuginfo ()) } | LPAREN unaryop expr RPAREN { Cop($2, [$3], debuginfo ()) } diff --git a/tools/objinfo.ml b/tools/objinfo.ml index 63b1a77e902..6efdafe9252 100644 --- a/tools/objinfo.ml +++ b/tools/objinfo.ml @@ -168,11 +168,16 @@ let print_cmx_infos (ui, crc) = Format.printf "functions@ %a@.@." Export_info.print_functions export end; - let pr_funs _ fns = - List.iter (fun arity -> printf " %d" arity) fns in - printf "Currying functions:%a\n" pr_funs ui.ui_curry_fun; - printf "Apply functions:%a\n" pr_funs ui.ui_apply_fun; - printf "Send functions:%a\n" pr_funs ui.ui_send_fun; + let pr_afuns _ fns = + let mode = function Lambda.Alloc_heap -> "" | Lambda.Alloc_local -> "L" in + List.iter (fun (arity,m) -> printf " %d%s" arity (mode m)) fns in + let pr_cfuns _ fns = + List.iter (function + | (Lambda.Curried {nlocal},a) -> printf " %dL%d" a nlocal + | (Lambda.Tupled, a) -> printf " -%d" a) fns in + printf "Currying functions:%a\n" pr_cfuns ui.ui_curry_fun; + printf "Apply functions:%a\n" pr_afuns ui.ui_apply_fun; + printf "Send functions:%a\n" pr_afuns ui.ui_send_fun; printf "Force link: %s\n" (if ui.ui_force_link then "YES" else "no") let print_cmxa_infos (lib : Cmx_format.library_infos) = diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index 6fbbc6c13d5..89d3eba4397 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -22,6 +22,7 @@ open Types open Cmo_format open Trace open Toploop +module Alloc_mode = Btype.Alloc_mode (* The standard output formatter *) let std_out = std_formatter @@ -268,7 +269,7 @@ let _ = add_directive "mod_use" (Directive_string (dir_mod_use std_out)) let filter_arrow ty = let ty = Ctype.expand_head !toplevel_env ty in match ty.desc with - | Tarrow (lbl, l, r, _) when not (Btype.is_optional lbl) -> Some (l, r) + | Tarrow ((lbl,_,_), l, r, _) when not (Btype.is_optional lbl) -> Some (l, r) | _ -> None let rec extract_last_arrow desc = @@ -320,8 +321,10 @@ let match_generic_printer_type desc path args printer_type = List.map (fun ty_var -> Ctype.newconstr printer_type [ty_var]) args in let ty_expected = List.fold_right - (fun ty_arg ty -> Ctype.newty (Tarrow (Asttypes.Nolabel, ty_arg, ty, - Cunknown))) + (fun ty_arg ty -> Ctype.newty + (Tarrow ((Asttypes.Nolabel,Alloc_mode.global,Alloc_mode.global), + ty_arg, ty, + Cunknown))) ty_args (Ctype.newconstr printer_type [ty_target]) in Ctype.unify !toplevel_env ty_expected @@ -547,7 +550,7 @@ let reg_show_prim name to_sig doc = let () = reg_show_prim "show_val" (fun env loc id lid -> - let _path, desc = Env.lookup_value ~loc lid env in + let _path, desc, _ = Env.lookup_value ~loc lid env in [ Sig_value (id, desc, Exported) ] ) "Print the signature of the corresponding value." diff --git a/toplevel/trace.ml b/toplevel/trace.ml index 36839909fbd..335d64f2a19 100644 --- a/toplevel/trace.ml +++ b/toplevel/trace.ml @@ -66,7 +66,7 @@ let print_label ppf l = let rec instrument_result env name ppf clos_typ = match (Ctype.repr(Ctype.expand_head env clos_typ)).desc with - | Tarrow(l, t1, t2, _) -> + | Tarrow((l,_,_), t1, t2, _) -> let starred_name = match name with | Lident s -> Lident(s ^ "*") @@ -109,7 +109,7 @@ let _ = Dummy let instrument_closure env name ppf clos_typ = match (Ctype.repr(Ctype.expand_head env clos_typ)).desc with - | Tarrow(l, t1, t2, _) -> + | Tarrow((l,_,_), t1, t2, _) -> let trace_res = instrument_result env name ppf t2 in (fun actual_code closure arg -> if not !may_trace then begin diff --git a/typing/btype.ml b/typing/btype.ml index 98531f15d56..be5e85f305c 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -78,6 +78,9 @@ type change = | Ccommu of commutable ref * commutable | Cuniv of type_expr option ref * type_expr option | Ctypeset of TypeSet.t ref * TypeSet.t + | Cmode_upper of alloc_mode_var * alloc_mode_const + | Cmode_lower of alloc_mode_var * alloc_mode_const + | Cmode_vlower of alloc_mode_var * alloc_mode_var list type changes = Change of change * changes ref @@ -93,6 +96,19 @@ let log_change ch = r := Change (ch, r'); Weak.set !trail 0 (Some r') +let log_changes chead ctail = + if chead = Unchanged then (assert (!ctail = Unchanged)) + else match Weak.get !trail 0 with None -> () + | Some r -> + r := chead; + Weak.set !trail 0 (Some ctail) + +let append_change ctail ch = + assert (!(!ctail) = Unchanged); + let r' = ref Unchanged in + (!ctail) := Change (ch, r'); + ctail := r' + (**** Representative of a type ****) let rec field_kind_repr = @@ -718,6 +734,9 @@ let undo_change = function | Ccommu (r, v) -> r := v | Cuniv (r, v) -> r := v | Ctypeset (r, v) -> r := v + | Cmode_upper (v, u) -> v.upper <- u + | Cmode_lower (v, l) -> v.lower <- l + | Cmode_vlower (v, vs) -> v.vlower <- vs type snapshot = changes ref * int let last_snapshot = s_ref 0 @@ -820,3 +839,375 @@ let undo_compress (changes, _old) = ty.desc <- desc; r := !next | _ -> ()) log + + +module Alloc_mode = struct + type nonrec const = Types.alloc_mode_const = Global | Local + type t = Types.alloc_mode = + | Amode of const + | Amodevar of alloc_mode_var + + let global = Amode Global + let local = Amode Local + let of_const = function + | Global -> global + | Local -> local + + let min_mode = global + + let max_mode = local + + let le_const a b = + match a, b with + | Global, _ | _, Local -> true + | Local, Global -> false + + let join_const a b = + match a, b with + | Local, _ | _, Local -> Local + | Global, Global -> Global + + let meet_const a b = + match a, b with + | Global, _ | _, Global -> Global + | Local, Local -> Local + + exception NotSubmode +(* + let pp_c ppf = function + | Global -> Printf.fprintf ppf "0" + | Local -> Printf.fprintf ppf "1" + let pp_v ppf v = + let i = v.mvid in + (if i < 26 then Printf.fprintf ppf "%c" (Char.chr (Char.code 'a' + i)) + else Printf.fprintf ppf "v%d" i); + Printf.fprintf ppf "[%a%a]" pp_c v.lower pp_c v.upper +*) + + let set_lower ~log v lower = + append_change log (Cmode_lower (v, v.lower)); + v.lower <- lower + + let set_upper ~log v upper = + append_change log (Cmode_upper (v, v.upper)); + v.upper <- upper + + let set_vlower ~log v vlower = + append_change log (Cmode_vlower (v, v.vlower)); + v.vlower <- vlower + + let submode_cv ~log m v = + (* Printf.printf " %a <= %a\n" pp_c m pp_v v; *) + if le_const m v.lower then () + else if not (le_const m v.upper) then raise NotSubmode + else begin + let m = join_const v.lower m in + set_lower ~log v m; + if m = v.upper then set_vlower ~log v [] + end + + let rec submode_vc ~log v m = + (* Printf.printf " %a <= %a\n" pp_v v pp_c m; *) + if le_const v.upper m then () + else if not (le_const v.lower m) then raise NotSubmode + else begin + let m = meet_const v.upper m in + set_upper ~log v m; + v.vlower |> List.iter (fun a -> + (* a <= v <= m *) + submode_vc ~log a m; + set_lower ~log v (join_const v.lower a.lower); + ); + if v.lower = m then set_vlower ~log v [] + end + + let submode_vv ~log a b = + (* Printf.printf " %a <= %a\n" pp_v a pp_v b; *) + if le_const a.upper b.lower then () + else if List.memq a b.vlower then () + else begin + submode_vc ~log a b.upper; + set_vlower ~log b (a :: b.vlower); + submode_cv ~log a.lower b; + end + + let submode a b = + let log_head = ref Unchanged in + let log = ref log_head in + match + match a, b with + | Amode a, Amode b -> + if not (le_const a b) then raise NotSubmode + | Amodevar v, Amode c -> + (* Printf.printf "%a <= %a\n" pp_v v pp_c c; *) + submode_vc ~log v c + | Amode c, Amodevar v -> + (* Printf.printf "%a <= %a\n" pp_c c pp_v v; *) + submode_cv ~log c v + | Amodevar a, Amodevar b -> + (* Printf.printf "%a <= %a\n" pp_v a pp_v b; *) + submode_vv ~log a b + with + | () -> + log_changes !log_head !log; + Ok () + | exception NotSubmode -> + let backlog = rev_log [] !log_head in + List.iter undo_change backlog; + Error () + + let submode_exn t1 t2 = + match submode t1 t2 with + | Ok () -> () + | Error () -> invalid_arg "submode_exn" + + let equate a b = + match submode a b, submode b a with + | Ok (), Ok () -> Ok () + | Error (), _ | _, Error () -> Error () + + let next_id = ref (-1) + let fresh () = + incr next_id; + { upper = Local; lower = Global; vlower = []; mvid = !next_id } + + let rec all_equal v = function + | [] -> true + | v' :: rest -> + if v == v' then all_equal v rest + else false + + let joinvars vars = + match vars with + | [] -> global + | v :: rest -> + let v = + if all_equal v rest then v + else begin + let v = fresh () in + List.iter (fun v' -> submode_exn (Amodevar v') (Amodevar v)) vars; + v + end + in + Amodevar v + + let join ms = + let rec aux vars = function + | [] -> joinvars vars + | Amode Global :: ms -> aux vars ms + | Amode Local :: _ -> local + | Amodevar v :: ms -> aux (v :: vars) ms + in aux [] ms + + let constrain_upper = function + | Amode m -> m + | Amodevar v -> + submode_exn (Amode v.upper) (Amodevar v); + v.upper + + let compress_vlower v = + (* Ensure that each transitive lower bound of v + is a direct lower bound of v *) + let rec trans v' = + if le_const v'.upper v.lower then () + else if List.memq v' v.vlower then () + else begin + v.vlower <- v' :: v.vlower; + trans_low v' + end + and trans_low v' = + submode_exn (Amode v'.lower) (Amodevar v); + List.iter trans v'.vlower + in + List.iter trans_low v.vlower + + let constrain_lower = function + | Amode m -> m + | Amodevar v -> + compress_vlower v; + submode_exn (Amodevar v) (Amode v.lower); + v.lower + + let newvar () = Amodevar (fresh ()) + + let check_const = function + | Amode m -> Some m + | Amodevar v -> + compress_vlower v; + if v.lower = v.upper then Some v.lower else None + + let print_const ppf = function + | Global -> Format.fprintf ppf "Global" + | Local -> Format.fprintf ppf "Local" + + let print_var_id ppf v = + Format.fprintf ppf "?%i" v.mvid + + let print_var ppf v = + compress_vlower v; + if v.lower = v.upper then begin + print_const ppf v.lower + end else if v.vlower = [] then begin + print_var_id ppf v + end else begin + Format.fprintf ppf "%a[> %a]" + print_var_id v + (Format.pp_print_list print_var_id) v.vlower + end + + let print ppf = function + | Amode m -> print_const ppf m + | Amodevar v -> print_var ppf v + +end + +module Value_mode = struct + + type const = + | Global + | Regional + | Local + + let r_as_l : const -> Alloc_mode.const = function + | Global -> Global + | Regional -> Local + | Local -> Local + [@@warning "-unused-value-declaration"] + + let r_as_g : const -> Alloc_mode.const = function + | Global -> Global + | Regional -> Global + | Local -> Local + [@@warning "-unused-value-declaration"] + + let of_alloc_consts + ~(r_as_l : Alloc_mode.const) + ~(r_as_g : Alloc_mode.const) = + match r_as_l, r_as_g with + | Global, Global -> Global + | Global, Local -> assert false + | Local, Global -> Regional + | Local, Local -> Local + + type t = Types.value_mode = + { r_as_l : Alloc_mode.t; + (* [r_as_l] is the image of the mode under the [r_as_l] function *) + r_as_g : Alloc_mode.t; + (* [r_as_g] is the image of the mode under the [r_as_g] function. + Always less than [r_as_l]. *) } + + let global = + let r_as_l = Alloc_mode.global in + let r_as_g = Alloc_mode.global in + { r_as_l; r_as_g } + + let regional = + let r_as_l = Alloc_mode.local in + let r_as_g = Alloc_mode.global in + { r_as_l; r_as_g } + + let local = + let r_as_l = Alloc_mode.local in + let r_as_g = Alloc_mode.local in + { r_as_l; r_as_g } + + let of_const = function + | Global -> global + | Regional -> regional + | Local -> local + + let max_mode = + let r_as_l = Alloc_mode.max_mode in + let r_as_g = Alloc_mode.max_mode in + { r_as_l; r_as_g } + + let min_mode = + let r_as_l = Alloc_mode.min_mode in + let r_as_g = Alloc_mode.min_mode in + { r_as_l; r_as_g } + + let of_alloc mode = + let r_as_l = mode in + let r_as_g = mode in + { r_as_l; r_as_g } + + let local_to_regional t = { t with r_as_g = Alloc_mode.global } + + let regional_to_global t = { t with r_as_l = t.r_as_g } + + let regional_to_local t = { t with r_as_g = t.r_as_l } + + let global_to_regional t = { t with r_as_l = Alloc_mode.local } + + let regional_to_global_alloc t = t.r_as_g + + let regional_to_local_alloc t = t.r_as_l + + type error = [`Regionality | `Locality] + + let submode t1 t2 = + match Alloc_mode.submode t1.r_as_l t2.r_as_l with + | Error () -> Error `Regionality + | Ok () as ok -> begin + match Alloc_mode.submode t1.r_as_g t2.r_as_g with + | Ok () -> ok + | Error () -> Error `Locality + end + + let submode_exn t1 t2 = + match submode t1 t2 with + | Ok () -> () + | Error _ -> invalid_arg "submode_exn" + + let rec submode_meet t = function + | [] -> Ok () + | t' :: rest -> + match submode t t' with + | Ok () -> submode_meet t rest + | Error _ as err -> err + + let join ts = + let r_as_l = Alloc_mode.join (List.map (fun t -> t.r_as_l) ts) in + let r_as_g = Alloc_mode.join (List.map (fun t -> t.r_as_g) ts) in + { r_as_l; r_as_g } + + let constrain_upper t = + let r_as_l = Alloc_mode.constrain_upper t.r_as_l in + let r_as_g = Alloc_mode.constrain_upper t.r_as_g in + of_alloc_consts ~r_as_l ~r_as_g + + let constrain_lower t = + let r_as_l = Alloc_mode.constrain_lower t.r_as_l in + let r_as_g = Alloc_mode.constrain_lower t.r_as_g in + of_alloc_consts ~r_as_l ~r_as_g + + let newvar () = + let r_as_l = Alloc_mode.newvar () in + let r_as_g = Alloc_mode.newvar () in + Alloc_mode.submode_exn r_as_g r_as_l; + { r_as_l; r_as_g } + + let check_const t = + match Alloc_mode.check_const t.r_as_l with + | None -> None + | Some r_as_l -> + match Alloc_mode.check_const t.r_as_g with + | None -> None + | Some r_as_g -> + Some (of_alloc_consts ~r_as_l ~r_as_g) + + let print_const ppf = function + | Global -> Format.fprintf ppf "Global" + | Regional -> Format.fprintf ppf "Regional" + | Local -> Format.fprintf ppf "Local" + + let print ppf t = + match check_const t with + | Some const -> print_const ppf const + | None -> + Format.fprintf ppf + "@[<2>r_as_l: %a@ r_as_g: %a@]" + Alloc_mode.print t.r_as_l + Alloc_mode.print t.r_as_g + +end diff --git a/typing/btype.mli b/typing/btype.mli index 7c215ed9150..68b38280f7d 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -253,3 +253,138 @@ val iter_type_expr_cstr_args: (type_expr -> unit) -> (constructor_arguments -> unit) val map_type_expr_cstr_args: (type_expr -> type_expr) -> (constructor_arguments -> constructor_arguments) + + + +module Alloc_mode : sig + + (* Modes are ordered so that [global] is a submode of [local] *) + type t = Types.alloc_mode + type const = Types.alloc_mode_const = Global | Local + + val global : t + + val local : t + + val of_const : const -> t + + val min_mode : t + + val max_mode : t + + val submode : t -> t -> (unit, unit) result + + val submode_exn : t -> t -> unit + + val equate : t -> t -> (unit, unit) result + + val join_const : const -> const -> const + + val join : t list -> t + + (* Force a mode variable to its upper bound *) + val constrain_upper : t -> const + + (* Force a mode variable to its lower bound *) + val constrain_lower : t -> const + + val newvar : unit -> t + + val check_const : t -> const option + + val print : Format.formatter -> t -> unit + +end + +module Value_mode : sig + + type const = + | Global + | Regional + | Local + + type t = Types.value_mode + + val global : t + + val regional : t + + val local : t + + val of_const : const -> t + + val max_mode : t + + val min_mode : t + + (** Injections from [Alloc_mode.t] into [Value_mode.t] *) + + (** [of_alloc] maps [Global] to [Global] and [Local] to [Local] *) + val of_alloc : Alloc_mode.t -> t + + (** Kernel operators *) + + (** The kernel operator [local_to_regional] maps [Local] to + [Regional] and leaves the others unchanged. *) + val local_to_regional : t -> t + + (** The kernel operator [regional_to_global] maps [Regional] + to [Global] and leaves the others unchanged. *) + val regional_to_global : t -> t + + (** Closure operators *) + + (** The closure operator [regional_to_local] maps [Regional] + to [Local] and leaves the others unchanged. *) + val regional_to_local : t -> t + + (** The closure operator [global_to_regional] maps [Global] to + [Regional] and leaves the others unchanged. *) + val global_to_regional : t -> t + + (** Note that the kernal and closure operators are in the following + adjunction relationship: + {v + local_to_regional + -| regional_to_local + -| regional_to_global + -| global_to_regional + v} + + Equivalently, + {v + local_to_regional a <= b iff a <= regional_to_local b + regional_to_local a <= b iff a <= regional_to_global b + regional_to_global a <= b iff a <= global_to_regional b + v} + *) + + (** Versions of the operators that return [Alloc.t] *) + + (** Maps [Regional] to [Global] and leaves the others unchanged. *) + val regional_to_global_alloc : t -> Alloc_mode.t + + (** Maps [Regional] to [Local] and leaves the others unchanged. *) + val regional_to_local_alloc : t -> Alloc_mode.t + + type error = [`Regionality | `Locality] + + val submode : t -> t -> (unit, error) result + + val submode_exn : t -> t -> unit + + val submode_meet : t -> t list -> (unit, error) result + + val join : t list -> t + + val constrain_upper : t -> const + + val constrain_lower : t -> const + + val newvar : unit -> t + + val check_const : t -> const option + + val print : Format.formatter -> t -> unit + +end diff --git a/typing/cmt2annot.ml b/typing/cmt2annot.ml index 40ee752e809..d9e0fa64b15 100644 --- a/typing/cmt2annot.ml +++ b/typing/cmt2annot.ml @@ -72,7 +72,7 @@ let rec iterator ~scope rebuild_env = and expr sub exp = begin match exp.exp_desc with - | Texp_ident (path, _, _) -> + | Texp_ident (path, _, _, _) -> let full_name = Path.name ~paren:Oprint.parenthesized_ident path in let env = if rebuild_env then diff --git a/typing/ctype.ml b/typing/ctype.ml index 00bce3b70eb..c236432d39a 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -289,12 +289,43 @@ let repr = repr (**** Type maps ****) -module TypePairs = - Hashtbl.Make (struct +module TypePairs = struct + module H = Hashtbl.Make (struct type t = type_expr * type_expr let equal (t1, t1') (t2, t2') = (t1 == t2) && (t1' == t2') let hash (t, t') = t.id + 93 * t'.id - end) + end) + + type t = { + set : unit H.t; + mutable elems : (type_expr * type_expr) list; + (* elems preserves the (reversed) insertion order of elements *) + } + + let create n = + { elems = []; set = H.create n } + + let clear t = + t.elems <- []; + H.clear t.set + + let repr2 (t1, t2) = (repr t1, repr t2) + + let add t p = + let p = repr2 p in + if H.mem t.set p then () else begin + H.add t.set p (); + t.elems <- p :: t.elems + end + + let mem t p = H.mem t.set (repr2 p) + + let iter f t = + (* iterate in insertion order, not Hashtbl.iter order *) + List.rev t.elems + |> List.iter (fun (t1,t2) -> + f (t1, t2)) +end (**** unification mode ****) @@ -305,7 +336,7 @@ type unification_mode = type equations_generation = | Forbidden - | Allowed of { equated_types : unit TypePairs.t } + | Allowed of { equated_types : TypePairs.t } let umode = ref Expression let equations_generation = ref Forbidden @@ -1509,6 +1540,39 @@ let instance_label fixed lbl = (vars, ty_arg, ty_res) ) +let prim_mode mvar = function + | Primitive.Prim_global, _ -> Alloc_mode.global + | Primitive.Prim_local, _ -> Alloc_mode.local + | Primitive.Prim_poly, _ -> mvar + +let rec instance_prim_locals locals mvar macc finalret ty = + match locals, (repr ty).desc with + | l :: locals, Tarrow ((lbl,_,mret),arg,ret,commu) -> + let marg = prim_mode mvar l in + let macc = Alloc_mode.join [marg; mret; macc] in + let mret = + match locals with + | [] -> finalret + | _ :: _ -> macc (* curried arrow *) + in + let ret = instance_prim_locals locals mvar macc finalret ret in + newty2 ty.level (Tarrow ((lbl,marg,mret),arg,ret, commu)) + | _ :: _, _ -> assert false + | [], _ -> + ty + +let instance_prim_mode (desc : Primitive.description) ty = + let is_poly = function Primitive.Prim_poly, _ -> true | _ -> false in + if is_poly desc.prim_native_repr_res || + List.exists is_poly desc.prim_native_repr_args then + let mode = Alloc_mode.newvar () in + let finalret = prim_mode mode desc.prim_native_repr_res in + instance_prim_locals desc.prim_native_repr_args + mode Alloc_mode.global finalret ty, + mode + else + ty, Alloc_mode.global + (**** Instantiation with parameter substitution ****) let unify' = (* Forward declaration *) @@ -2269,14 +2333,13 @@ let rec mcomp type_pairs env t1 t2 = (* Expansion may have changed the representative of the types... *) let t1' = repr t1' and t2' = repr t2' in if t1' == t2' then () else - begin try TypePairs.find type_pairs (t1', t2') - with Not_found -> - TypePairs.add type_pairs (t1', t2') (); + if not (TypePairs.mem type_pairs (t1', t2')) then begin + TypePairs.add type_pairs (t1', t2'); match (t1'.desc, t2'.desc) with | (Tvar _, _) | (_, Tvar _) -> () - | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) + | (Tarrow ((l1,_,_), t1, u1, _), Tarrow ((l2,_,_), t2, u2, _)) when l1 = l2 || not (is_optional l1 || is_optional l2) -> mcomp type_pairs env t1 t2; mcomp type_pairs env u1 u2; @@ -2431,7 +2494,8 @@ and mcomp_record_description type_pairs env = | l1 :: xs, l2 :: ys -> mcomp type_pairs env l1.ld_type l2.ld_type; if Ident.name l1.ld_id = Ident.name l2.ld_id && - l1.ld_mutable = l2.ld_mutable + l1.ld_mutable = l2.ld_mutable && + l1.ld_global = l2.ld_global then iter xs ys else raise (Unify []) | [], [] -> () @@ -2477,7 +2541,7 @@ let order_type_pair t1 t2 = if t1.id <= t2.id then (t1, t2) else (t2, t1) let add_type_equality t1 t2 = - TypePairs.add unify_eq_set (order_type_pair t1 t2) () + TypePairs.add unify_eq_set (order_type_pair t1 t2) let eq_package_path env p1 p2 = Path.same p1 p2 || @@ -2558,6 +2622,10 @@ let unify_package env unify_list lv1 p1 n1 tl1 lv2 p2 n2 tl2 = || !package_subtype env p1 n1 tl1 p2 n2 tl2 && !package_subtype env p2 n2 tl2 p1 n1 tl1 then () else raise Not_found +let unify_alloc_mode a b = + match Btype.Alloc_mode.equate a b with + | Ok () -> () + | Error () -> raise (Unify []) (* force unification in Reither when one side has a non-conjunctive type *) let rigid_variants = ref false @@ -2567,8 +2635,7 @@ let unify_eq t1 t2 = match !umode with | Expression -> false | Pattern -> - try TypePairs.find unify_eq_set (order_type_pair t1 t2); true - with Not_found -> false + TypePairs.mem unify_eq_set (order_type_pair t1 t2) let unify1_var env t1 t2 = assert (is_Tvar t1); @@ -2587,7 +2654,7 @@ let unify1_var env t1 t2 = let record_equation t1 t2 = match !equations_generation with | Forbidden -> assert false - | Allowed { equated_types } -> TypePairs.add equated_types (t1, t2) () + | Allowed { equated_types } -> TypePairs.add equated_types (t1, t2) let rec unify (env:Env.t ref) t1 t2 = (* First step: special cases (optimizations) *) @@ -2706,9 +2773,14 @@ and unify3 env t1 t1' t2 t2' = end; try begin match (d1, d2) with - (Tarrow (l1, t1, u1, c1), Tarrow (l2, t2, u2, c2)) when l1 = l2 || - (!Clflags.classic || !umode = Pattern) && - not (is_optional l1 || is_optional l2) -> + (Tarrow ((l1,a1,r1), t1, u1, c1), + Tarrow ((l2,a2,r2), t2, u2, c2)) + when + (l1 = l2 || + (!Clflags.classic || !umode = Pattern) && + not (is_optional l1 || is_optional l2)) -> + unify_alloc_mode a1 a2; + unify_alloc_mode r1 r2; unify env t1 t2; unify env u1 u2; begin match commu_repr c1, commu_repr c2 with Clink r, c2 -> set_commu r c2 @@ -3192,12 +3264,14 @@ let filter_arrow env t l = Tvar _ -> let lv = t.level in let t1 = newvar2 lv and t2 = newvar2 lv in - let t' = newty2 lv (Tarrow (l, t1, t2, Cok)) in + let marg = Btype.Alloc_mode.newvar () in + let mret = Btype.Alloc_mode.newvar () in + let t' = newty2 lv (Tarrow ((l,marg,mret), t1, t2, Cok)) in link_type t t'; - (t1, t2) - | Tarrow(l', t1, t2, _) - when l = l' || !Clflags.classic && l = Nolabel && not (is_optional l') -> - (t1, t2) + (marg, t1, mret, t2) + | Tarrow((l', arg, ret), t1, t2, _) + when (l = l' || !Clflags.classic && l = Nolabel && not (is_optional l)) -> + (arg, t1, ret, t2) | _ -> raise (Unify []) @@ -3308,19 +3382,22 @@ let rec moregen inst_nongen type_pairs env t1 t2 = (* Expansion may have changed the representative of the types... *) let t1' = repr t1' and t2' = repr t2' in if t1' == t2' then () else - begin try - TypePairs.find type_pairs (t1', t2') - with Not_found -> - TypePairs.add type_pairs (t1', t2') (); + if not (TypePairs.mem type_pairs (t1', t2')) then begin + TypePairs.add type_pairs (t1', t2'); match (t1'.desc, t2'.desc) with (Tvar _, _) when may_instantiate inst_nongen t1' -> moregen_occur env t1'.level t2; update_scope t1'.scope t2; link_type t1' t2 - | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when l1 = l2 - || !Clflags.classic && not (is_optional l1 || is_optional l2) -> + | (Tarrow ((l1,a1,r1), t1, u1, _), + Tarrow ((l2,a2,r2), t2, u2, _)) when + (l1 = l2 + || !Clflags.classic && not (is_optional l1 || is_optional l2)) -> moregen inst_nongen type_pairs env t1 t2; - moregen inst_nongen type_pairs env u1 u2 + moregen inst_nongen type_pairs env u1 u2; + (* FIXME *) + unify_alloc_mode a1 a2; + unify_alloc_mode r1 r2 | (Ttuple tl1, Ttuple tl2) -> moregen_list inst_nongen type_pairs env tl1 tl2 | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) @@ -3575,10 +3652,8 @@ let rec eqtype rename type_pairs subst env t1 t2 = (* Expansion may have changed the representative of the types... *) let t1' = repr t1' and t2' = repr t2' in if t1' == t2' then () else - begin try - TypePairs.find type_pairs (t1', t2') - with Not_found -> - TypePairs.add type_pairs (t1', t2') (); + if not (TypePairs.mem type_pairs (t1', t2')) then begin + TypePairs.add type_pairs (t1', t2'); match (t1'.desc, t2'.desc) with (Tvar _, Tvar _) when rename -> begin try @@ -3589,10 +3664,14 @@ let rec eqtype rename type_pairs subst env t1 t2 = then raise (Unify []); subst := (t1', t2') :: !subst end - | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when l1 = l2 - || !Clflags.classic && not (is_optional l1 || is_optional l2) -> + | (Tarrow ((l1,a1,r1), t1, u1, _), + Tarrow ((l2,a2,r2), t2, u2, _)) when + (l1 = l2 + || !Clflags.classic && not (is_optional l1 || is_optional l2)) -> eqtype rename type_pairs subst env t1 t2; eqtype rename type_pairs subst env u1 u2; + eqtype_alloc_mode a1 a2; + eqtype_alloc_mode r1 r2 | (Ttuple tl1, Ttuple tl2) -> eqtype_list rename type_pairs subst env tl1 tl2 | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) @@ -3699,6 +3778,10 @@ and eqtype_row rename type_pairs subst env row1 row2 = | _ -> raise (Unify [])) pairs +and eqtype_alloc_mode m1 m2 = + (* FIXME implement properly *) + unify_alloc_mode m1 m2 + (* Must empty univar_pairs first *) let eqtype_list rename type_pairs subst env tl1 tl2 = univar_pairs := []; @@ -3801,7 +3884,7 @@ let match_class_types ?(trace=true) env pat_sch subj_sch = let sign2 = signature_of_class_type subj in let t1 = repr sign1.csig_self in let t2 = repr sign2.csig_self in - TypePairs.add type_pairs (t1, t2) (); + TypePairs.add type_pairs (t1, t2); let (fields1, rest1) = flatten_fields (object_fields t1) and (fields2, rest2) = flatten_fields (object_fields t2) in let (pairs, miss1, miss2) = associate_fields fields1 fields2 in @@ -3926,7 +4009,7 @@ let match_class_declarations env patt_params patt_type subj_params subj_type = let sign2 = signature_of_class_type subj_type in let t1 = repr sign1.csig_self in let t2 = repr sign2.csig_self in - TypePairs.add type_pairs (t1, t2) (); + TypePairs.add type_pairs (t1, t2); let (fields1, rest1) = flatten_fields (object_fields t1) and (fields2, rest2) = flatten_fields (object_fields t2) in let (pairs, miss1, miss2) = associate_fields fields1 fields2 in @@ -4083,6 +4166,7 @@ let rec build_subtype env visited loops posi level t = let (t1', c1) = build_subtype env visited loops (not posi) level t1 in let (t2', c2) = build_subtype env visited loops posi level t2 in let c = max c1 c2 in + (* FIXME update arrow modes *) if c > Unchanged then (newty (Tarrow(l, t1', t2', Cok)), c) else (t, Unchanged) | Ttuple tlist -> @@ -4257,18 +4341,21 @@ let rec subtype_rec env trace t1 t2 cstrs = let t2 = repr t2 in if t1 == t2 then cstrs else - begin try - TypePairs.find subtypes (t1, t2); + if TypePairs.mem subtypes (t1, t2) then cstrs - with Not_found -> - TypePairs.add subtypes (t1, t2) (); + else begin + TypePairs.add subtypes (t1, t2); match (t1.desc, t2.desc) with (Tvar _, _) | (_, Tvar _) -> (trace, t1, t2, !univar_pairs)::cstrs - | (Tarrow(l1, t1, u1, _), Tarrow(l2, t2, u2, _)) when l1 = l2 - || !Clflags.classic && not (is_optional l1 || is_optional l2) -> + | (Tarrow((l1,a1,r1), t1, u1, _), + Tarrow((l2,a2,r2), t2, u2, _)) when + (l1 = l2 + || !Clflags.classic && not (is_optional l1 || is_optional l2)) -> let cstrs = subtype_rec env (Trace.diff t2 t1::trace) t2 t1 cstrs in - subtype_rec env (Trace.diff u1 u2::trace) u1 u2 cstrs + unify_alloc_mode a1 a2; (* FIXME *) + unify_alloc_mode r1 r2; + subtype_rec env (Trace.diff u1 u2::trace) u1 u2 cstrs; | (Ttuple tl1, Ttuple tl2) -> subtype_list env trace tl1 tl2 cstrs | (Tconstr(p1, [], _), Tconstr(p2, [], _)) when Path.same p1 p2 -> @@ -4501,6 +4588,22 @@ let cyclic_abbrev env id ty = false in check_cycle [] ty +(* Ensure all mode variables are fully determined *) +let remove_mode_variables ty = + let visited = ref TypeSet.empty in + let rec go ty = + let ty = repr ty in + if TypeSet.mem ty !visited then () else begin + visited := TypeSet.add ty !visited; + match ty.desc with + | Tarrow ((_,marg,mret),targ,tret,_) -> + let _ = Btype.Alloc_mode.constrain_lower marg in + let _ = Btype.Alloc_mode.constrain_lower mret in + go targ; go tret + | _ -> iter_type_expr go ty + end + in go ty + (* Check for non-generalizable type variables *) exception Non_closed0 let visited = ref TypeSet.empty diff --git a/typing/ctype.mli b/typing/ctype.mli index 4215e14fcbf..c4f44e21954 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -18,7 +18,14 @@ open Asttypes open Types -module TypePairs : Hashtbl.S with type key = type_expr * type_expr +module TypePairs : sig + type t + val create: int -> t + val clear: t -> unit + val add: t -> type_expr * type_expr -> unit + val mem: t -> type_expr * type_expr -> bool + val iter: (type_expr * type_expr -> unit) -> t -> unit +end module Unification_trace: sig (** Unification traces are used to explain unification errors @@ -231,6 +238,11 @@ val polyfy: Env.t -> type_expr -> type_expr list -> type_expr * bool val instance_label: bool -> label_description -> type_expr list * type_expr * type_expr (* Same, for a label *) +val prim_mode : + alloc_mode -> (Primitive.mode * Primitive.native_repr) -> alloc_mode +val instance_prim_mode: + Primitive.description -> type_expr -> type_expr * alloc_mode + val apply: Env.t -> type_expr list -> type_expr -> type_expr list -> type_expr (* [apply [p1...pN] t [a1...aN]] match the arguments [ai] to @@ -257,14 +269,16 @@ val unify: Env.t -> type_expr -> type_expr -> unit (* Unify the two types given. Raise [Unify] if not possible. *) val unify_gadt: equations_level:int -> allow_recursive:bool -> - Env.t ref -> type_expr -> type_expr -> unit TypePairs.t + Env.t ref -> type_expr -> type_expr -> TypePairs.t (* Unify the two types given and update the environment with the local constraints. Raise [Unify] if not possible. Returns the pairs of types that have been equated. *) val unify_var: Env.t -> type_expr -> type_expr -> unit (* Same as [unify], but allow free univars when first type is a variable. *) -val filter_arrow: Env.t -> type_expr -> arg_label -> type_expr * type_expr +val unify_alloc_mode: alloc_mode -> alloc_mode -> unit +val filter_arrow: Env.t -> type_expr -> arg_label -> + alloc_mode * type_expr * alloc_mode * type_expr (* A special case of unification (with l:'a -> 'b). *) val filter_method: Env.t -> string -> private_flag -> type_expr -> type_expr (* A special case of unification (with {m : 'a; 'b}). *) @@ -351,6 +365,9 @@ val cyclic_abbrev: Env.t -> Ident.t -> type_expr -> bool val is_contractive: Env.t -> Path.t -> bool val normalize_type: type_expr -> unit +val remove_mode_variables: type_expr -> unit + (* Ensure mode variables are fully determined *) + val closed_schema: Env.t -> type_expr -> bool (* Check whether the given type scheme contains no non-generic type variables *) diff --git a/typing/datarepr.ml b/typing/datarepr.ml index 989395c0ffb..d88304072f3 100644 --- a/typing/datarepr.ml +++ b/typing/datarepr.ml @@ -185,7 +185,8 @@ let extension_descr ~current_unit path_ext ext = let none = {desc = Ttuple []; level = -1; scope = Btype.generic_level; id = -1} (* Clearly ill-formed type *) let dummy_label = - { lbl_name = ""; lbl_res = none; lbl_arg = none; lbl_mut = Immutable; + { lbl_name = ""; lbl_res = none; lbl_arg = none; + lbl_mut = Immutable; lbl_global = Unrestricted; lbl_pos = (-1); lbl_all = [||]; lbl_repres = Record_regular; lbl_private = Public; lbl_loc = Location.none; @@ -203,6 +204,7 @@ let label_descrs ty_res lbls repres priv = lbl_res = ty_res; lbl_arg = l.ld_type; lbl_mut = l.ld_mutable; + lbl_global = l.ld_global; lbl_pos = num; lbl_all = all_labels; lbl_repres = repres; diff --git a/typing/env.ml b/typing/env.ml index 96d600418ca..bcbb1af4d71 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -212,6 +212,12 @@ module TycompTbl = end +type empty = | + +type value_lock = + | Lock of { mode : Value_mode.t; } + | Region_lock + module IdTbl = struct (** This module is used to store all kinds of components except @@ -220,15 +226,15 @@ module IdTbl = bindings between each of them. *) - type ('a, 'b) t = { + type ('lock, 'a, 'b) t = { current: 'a Ident.tbl; - (** Local bindings since the last open *) + (** Local bindings since the last open or lock *) - layer: ('a, 'b) layer; + layer: ('lock, 'a, 'b) layer; (** Symbolic representation of the last (innermost) open, if any. *) } - and ('a, 'b) layer = + and ('lock, 'a, 'b) layer = | Open of { root: Path.t; (** The path of the opened module, to be prefixed in front of @@ -243,13 +249,18 @@ module IdTbl = "open". This is used to detect unused "opens". The arguments are used to detect shadowing. *) - next: ('a, 'b) t; + next: ('lock, 'a, 'b) t; (** The table before opening the module. *) } | Map of { f: ('a -> 'a); - next: ('a, 'b) t; + next: ('lock, 'a, 'b) t; + } + + | Lock of { + mode: 'lock; + next: ('lock, 'a, 'b) t; } | Nothing @@ -273,6 +284,9 @@ module IdTbl = layer = Open {using; root; components; next}; } + let add_lock mode next = + { current = Ident.empty; layer = Lock {mode; next} } + let map f next = { current = Ident.empty; @@ -285,38 +299,50 @@ module IdTbl = begin match tbl.layer with | Open {next; _} -> find_same id next | Map {f; next} -> f (find_same id next) + | Lock {mode=_; next} -> find_same id next | Nothing -> raise exn end - let rec find_name wrap ~mark name tbl = + let rec find_name_and_locks wrap ~mark name tbl macc = try let (id, desc) = Ident.find_name name tbl.current in - Pident id, desc + Pident id, macc, desc with Not_found as exn -> begin match tbl.layer with | Open {using; root; next; components} -> begin try let descr = wrap (NameMap.find name components) in - let res = Pdot (root, name), descr in + let res = Pdot (root, name), macc, descr in if mark then begin match using with | None -> () | Some f -> begin - match find_name wrap ~mark:false name next with + match find_name_and_locks wrap ~mark:false name next macc with | exception Not_found -> f name None - | _, descr' -> f name (Some (descr', descr)) + | _, _, descr' -> f name (Some (descr', descr)) end end; res with Not_found -> - find_name wrap ~mark name next + find_name_and_locks wrap ~mark name next macc end | Map {f; next} -> - let (p, desc) = find_name wrap ~mark name next in - p, f desc + let (p, macc, desc) = + find_name_and_locks wrap ~mark name next macc in + p, macc, f desc + | Lock {mode; next} -> + find_name_and_locks wrap ~mark name next (mode :: macc) | Nothing -> raise exn end + let find_name_and_modes wrap ~mark name tbl = + find_name_and_locks wrap ~mark name tbl [] + + let find_name wrap ~mark name tbl = + let (id, ([] : empty list), desc) = + find_name_and_modes wrap ~mark name tbl in + id, desc + let rec find_all wrap name tbl = List.map (fun (id, desc) -> Pident id, desc) @@ -333,6 +359,8 @@ module IdTbl = | Map {f; next} -> List.map (fun (p, desc) -> (p, f desc)) (find_all wrap name next) + | Lock {mode=_;next} -> + find_all wrap name next let rec fold_name wrap f tbl acc = let acc = @@ -354,11 +382,13 @@ module IdTbl = |> fold_name wrap (fun name (path, desc) -> f name (path, g desc)) next + | Lock {mode=_; next} -> + fold_name wrap f next acc let rec local_keys tbl acc = let acc = Ident.fold_all (fun k _ accu -> k::accu) tbl.current acc in match tbl.layer with - | Open {next; _ } | Map {next; _} -> local_keys next acc + | Open {next; _ } | Map {next; _} | Lock {next; _} -> local_keys next acc | Nothing -> acc @@ -375,6 +405,8 @@ module IdTbl = iter wrap f next | Map {f=g; next} -> iter wrap (fun id (path, desc) -> f id (path, g desc)) next + | Lock {mode=_; next} -> + iter wrap f next | Nothing -> () let diff_keys tbl1 tbl2 = @@ -394,14 +426,14 @@ type type_descriptions = let in_signature_flag = 0x01 type t = { - values: (value_entry, value_data) IdTbl.t; + values: (value_lock, value_entry, value_data) IdTbl.t; constrs: constructor_data TycompTbl.t; labels: label_data TycompTbl.t; - types: (type_data, type_data) IdTbl.t; - modules: (module_entry, module_data) IdTbl.t; - modtypes: (modtype_data, modtype_data) IdTbl.t; - classes: (class_data, class_data) IdTbl.t; - cltypes: (cltype_data, cltype_data) IdTbl.t; + types: (empty, type_data, type_data) IdTbl.t; + modules: (empty, module_entry, module_data) IdTbl.t; + modtypes: (empty, modtype_data, modtype_data) IdTbl.t; + classes: (empty, class_data, class_data) IdTbl.t; + cltypes: (empty, cltype_data, cltype_data) IdTbl.t; functor_args: unit Ident.tbl; summary: summary; local_constraints: type_declaration Path.Map.t; @@ -461,7 +493,8 @@ and address_lazy = (address_unforced, address) EnvLazy.t and value_data = { vda_description : value_description; - vda_address : address_lazy } + vda_address : address_lazy; + vda_mode : Value_mode.t } and value_entry = | Val_bound of value_data @@ -530,6 +563,8 @@ type lookup_error = | Generative_used_as_applicative of Longident.t | Illegal_reference_to_recursive_module | Cannot_scrape_alias of Longident.t * Path.t + | Local_value_escapes of Longident.t * [`Regionality | `Locality] + | Local_value_used_in_closure of Longident.t type error = | Missing_module of Location.t * Path.t * Path.t @@ -1548,7 +1583,9 @@ let rec components_of_module_maker | Val_prim _ -> EnvLazy.create_failed Not_found | _ -> next_address () in - let vda = { vda_description = decl'; vda_address = addr } in + let vda = { vda_description = decl'; + vda_address = addr; + vda_mode = Value_mode.global } in c.comp_values <- NameMap.add (Ident.name id) vda c.comp_values; | SigL_type(id, decl, _, _) -> let final_decl = Subst.type_declaration sub decl in @@ -1687,12 +1724,12 @@ and check_value_name name loc = error (Illegal_value_name(loc, name)) done -and store_value ?check id addr decl env = +and store_value ?check mode id addr decl env = check_value_name (Ident.name id) decl.val_loc; Option.iter (fun f -> check_usage decl.val_loc id decl.val_uid f !value_declarations) check; - let vda = { vda_description = decl; vda_address = addr } in + let vda = { vda_description = decl; vda_address = addr; vda_mode = mode } in { env with values = IdTbl.add id (Val_bound vda) env.values; summary = Env_value(env.summary, id, decl) } @@ -1876,9 +1913,9 @@ let add_functor_arg id env = functor_args = Ident.add id () env.functor_args; summary = Env_functor_arg (env.summary, id)} -let add_value ?check id desc env = +let add_value ?check ?(mode = Value_mode.global) id desc env = let addr = value_declaration_address env id desc in - store_value ?check id addr desc env + store_value ?check mode id addr desc env let add_type ~check id info env = store_type ~check id info env @@ -1935,7 +1972,7 @@ let scrape_alias t mty = let enter_value ?check name desc env = let id = Ident.create_local name in let addr = value_declaration_address env id desc in - let env = store_value ?check id addr desc env in + let env = store_value ?check Value_mode.global id addr desc env in (id, env) let enter_type ~scope name info env = @@ -1972,6 +2009,12 @@ let enter_cltype ~scope name desc env = let enter_module ~scope ?arg s presence mty env = enter_module_declaration ~scope ?arg s presence (md mty) env +let add_lock mode env = + { env with values = IdTbl.add_lock (Lock {mode}) env.values } + +let add_region_lock env = + { env with values = IdTbl.add_lock Region_lock env.values } + (* Insertion of all components of a signature *) let add_item comp env = @@ -2388,12 +2431,26 @@ let lookup_ident_module (type a) (load : a load) ~errors ~use ~loc s env = end end +let lock_mode ~errors ~loc env id vmode locks = + List.fold_left + (fun vmode lock -> + match lock with + | Region_lock -> Value_mode.local_to_regional vmode + | Lock {mode} -> + match Value_mode.submode vmode mode with + | Ok () -> vmode + | Error _ -> + may_lookup_error errors loc env + (Local_value_used_in_closure id)) + vmode locks + let lookup_ident_value ~errors ~use ~loc name env = - match IdTbl.find_name wrap_value ~mark:use name env.values with - | (path, Val_bound vda) -> + match IdTbl.find_name_and_modes wrap_value ~mark:use name env.values with + | (path, locks, Val_bound vda) -> + let mode = lock_mode ~errors ~loc env (Lident name) vda.vda_mode locks in use_value ~use ~loc path vda; - path, vda.vda_description - | (_, Val_unbound reason) -> + path, vda.vda_description, mode + | (_, _, Val_unbound reason) -> report_value_unbound ~errors ~loc env reason (Lident name) | exception Not_found -> may_lookup_error errors loc env (Unbound_value (Lident name, No_hint)) @@ -2627,7 +2684,10 @@ let lookup_module_path ~errors ~use ~loc ~load lid env : Path.t = let lookup_value ~errors ~use ~loc lid env = match lid with | Lident s -> lookup_ident_value ~errors ~use ~loc s env - | Ldot(l, s) -> lookup_dot_value ~errors ~use ~loc l s env + | Ldot(l, s) -> + let path, desc = lookup_dot_value ~errors ~use ~loc l s env in + let mode = Value_mode.global in + path, desc, mode | Lapply _ -> assert false let lookup_type_full ~errors ~use ~loc lid env = @@ -2716,7 +2776,8 @@ let find_module_by_name lid env = let find_value_by_name lid env = let loc = Location.(in_file !input_name) in - lookup_value ~errors:false ~use:false ~loc lid env + let path, desc, _ = lookup_value ~errors:false ~use:false ~loc lid env in + path, desc let find_type_by_name lid env = let loc = Location.(in_file !input_name) in @@ -2794,8 +2855,8 @@ let lookup_all_labels_from_type ?(use=true) ~loc ty_path env = lookup_all_labels_from_type ~use ~loc ty_path env let lookup_instance_variable ?(use=true) ~loc name env = - match IdTbl.find_name wrap_value ~mark:use name env.values with - | (path, Val_bound vda) -> begin + match IdTbl.find_name_and_modes wrap_value ~mark:use name env.values with + | (path, _, Val_bound vda) -> begin let desc = vda.vda_description in match desc.val_kind with | Val_ivar(mut, cl_num) -> @@ -2804,13 +2865,13 @@ let lookup_instance_variable ?(use=true) ~loc name env = | _ -> lookup_error loc env (Not_an_instance_variable name) end - | (_, Val_unbound Val_unbound_instance_variable) -> + | (_, _, Val_unbound Val_unbound_instance_variable) -> lookup_error loc env (Masked_instance_variable (Lident name)) - | (_, Val_unbound Val_unbound_self) -> + | (_, _, Val_unbound Val_unbound_self) -> lookup_error loc env (Not_an_instance_variable name) - | (_, Val_unbound Val_unbound_ancestor) -> + | (_, _, Val_unbound Val_unbound_ancestor) -> lookup_error loc env (Not_an_instance_variable name) - | (_, Val_unbound Val_unbound_ghost_recursive _) -> + | (_, _, Val_unbound Val_unbound_ghost_recursive _) -> lookup_error loc env (Unbound_instance_variable name) | exception Not_found -> lookup_error loc env (Unbound_instance_variable name) @@ -2829,7 +2890,7 @@ let bound_module name env = end let bound wrap proj name env = - match IdTbl.find_name wrap ~mark:false name (proj env) with + match IdTbl.find_name_and_modes wrap ~mark:false name (proj env) with | _ -> true | exception Not_found -> false @@ -3215,6 +3276,22 @@ let report_lookup_error _loc env ppf = function fprintf ppf "The module %a is an alias for module %a, which %s" !print_longident lid !print_path p cause + | Local_value_escapes(lid, reason) -> + let mode = + match reason with + | `Regionality -> "" + | `Locality -> "local " + in + fprintf ppf + "@[The %svalue %a cannot be used here@ \ + as it escapes its region@]" + mode !print_longident lid + | Local_value_used_in_closure lid -> + fprintf ppf + "@[The value %a is local, so cannot be used \ + inside a closure that might escape@]" + !print_longident lid + let report_error ppf = function | Missing_module(_, path1, path2) -> diff --git a/typing/env.mli b/typing/env.mli index f97067b7a7d..9c50f5c1bd2 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -176,6 +176,8 @@ type lookup_error = | Generative_used_as_applicative of Longident.t | Illegal_reference_to_recursive_module | Cannot_scrape_alias of Longident.t * Path.t + | Local_value_escapes of Longident.t * [`Regionality | `Locality] + | Local_value_used_in_closure of Longident.t val lookup_error: Location.t -> t -> lookup_error -> 'a @@ -193,7 +195,7 @@ val lookup_error: Location.t -> t -> lookup_error -> 'a val lookup_value: ?use:bool -> loc:Location.t -> Longident.t -> t -> - Path.t * value_description + Path.t * value_description * Types.value_mode val lookup_type: ?use:bool -> loc:Location.t -> Longident.t -> t -> Path.t * type_declaration @@ -273,7 +275,8 @@ val make_copy_of_types: t -> (t -> t) (* Insertion by identifier *) val add_value: - ?check:(string -> Warnings.t) -> Ident.t -> value_description -> t -> t + ?check:(string -> Warnings.t) -> ?mode:(Types.value_mode) -> + Ident.t -> value_description -> t -> t val add_type: check:bool -> Ident.t -> type_declaration -> t -> t val add_extension: check:bool -> rebind:bool -> Ident.t -> extension_constructor -> t -> t @@ -354,6 +357,10 @@ val enter_unbound_value : string -> value_unbound_reason -> t -> t val enter_unbound_module : string -> module_unbound_reason -> t -> t +(* Lock the environment *) +val add_lock : Types.value_mode -> t -> t +val add_region_lock : t -> t + (* Initialize the cache of in-core module interfaces. *) val reset_cache: unit -> unit diff --git a/typing/includecore.ml b/typing/includecore.ml index 5325d97d212..9f75d6eb1a7 100644 --- a/typing/includecore.ml +++ b/typing/includecore.ml @@ -33,18 +33,37 @@ let value_descriptions ~loc env name loc vd1.val_attributes vd2.val_attributes name; - if Ctype.moregeneral env true vd1.val_type vd2.val_type then begin - match (vd1.val_kind, vd2.val_kind) with - (Val_prim p1, Val_prim p2) -> - if p1 = p2 then Tcoerce_none else raise Dont_match - | (Val_prim p, _) -> - let pc = {pc_desc = p; pc_type = vd2.Types.val_type; - pc_env = env; pc_loc = vd1.Types.val_loc; } in - Tcoerce_primitive pc - | (_, Val_prim _) -> raise Dont_match - | (_, _) -> Tcoerce_none - end else - raise Dont_match + match vd1.val_kind with + | Val_prim p1 -> + let ty1, mode1 = Ctype.instance_prim_mode p1 vd1.val_type in + begin match vd2.val_kind with + | Val_prim p2 -> + let ty2, _mode2 = Ctype.instance_prim_mode p2 vd2.val_type in + if not (Ctype.moregeneral env true ty1 ty2) then + raise Dont_match; + let mode1 : Primitive.mode = + match Btype.Alloc_mode.check_const mode1 with + | Some Global -> Prim_global + | Some Local -> Prim_local + | None -> Prim_poly + in + let p1 = Primitive.inst_mode mode1 p1 in + if p1 = p2 then Tcoerce_none else raise Dont_match + | _ -> + if not (Ctype.moregeneral env true ty1 vd2.val_type) then + raise Dont_match; + let pc = + {pc_desc = p1; pc_type = vd2.Types.val_type; pc_poly_mode = mode1; + pc_env = env; pc_loc = vd1.Types.val_loc; } in + Tcoerce_primitive pc + end + | _ -> + if Ctype.moregeneral env true vd1.val_type vd2.val_type then begin + match vd2.val_kind with + | Val_prim _ -> raise Dont_match + | _ -> Tcoerce_none + end else + raise Dont_match (* Inclusion between "private" annotations *) @@ -137,6 +156,7 @@ let choose_other ord first second = type label_mismatch = | Type | Mutability of position + | Nonlocality of position * bool type record_mismatch = | Label_mismatch of Types.label_declaration @@ -187,6 +207,15 @@ let report_label_mismatch first second ppf err = pr "%s is mutable and %s is not." (String.capitalize_ascii (choose ord first second)) (choose_other ord first second) + | Nonlocality(ord, nonlocal) -> + let sort = + if nonlocal then "nonlocal" + else "global" + in + pr "%s is %s and %s is not." + (String.capitalize_ascii (choose ord first second)) + sort + (choose_other ord first second) let report_record_mismatch first second decl ppf err = let pr fmt = Format.fprintf ppf fmt in @@ -337,11 +366,24 @@ and compare_labels env params1 params2 if ld1.ld_mutable <> ld2.ld_mutable then let ord = if ld1.ld_mutable = Asttypes.Mutable then First else Second in - Some (Mutability ord) - else - if Ctype.equal env true (ld1.ld_type::params1) (ld2.ld_type::params2) - then None - else Some (Type : label_mismatch) + Some (Mutability ord) + else begin + match ld1.ld_global, ld2.ld_global with + | Global, (Nonlocal | Unrestricted) -> + Some (Nonlocality(First, false)) + | (Nonlocal | Unrestricted), Global -> + Some (Nonlocality(Second, false)) + | Nonlocal, Unrestricted -> + Some (Nonlocality(First, true)) + | Unrestricted, Nonlocal -> + Some (Nonlocality(Second, true)) + | Global, Global + | Nonlocal, Nonlocal + | Unrestricted, Unrestricted -> + if Ctype.equal env true (ld1.ld_type::params1) (ld2.ld_type::params2) + then None + else Some (Type : label_mismatch) + end and compare_records ~loc env params1 params2 n (labels1 : Types.label_declaration list) diff --git a/typing/includecore.mli b/typing/includecore.mli index 560d0ac1935..01199f6a8e8 100644 --- a/typing/includecore.mli +++ b/typing/includecore.mli @@ -25,6 +25,7 @@ type position = Ctype.Unification_trace.position = First | Second type label_mismatch = | Type | Mutability of position + | Nonlocality of position * bool type record_mismatch = | Label_mismatch of label_declaration * label_declaration * label_mismatch diff --git a/typing/oprint.ml b/typing/oprint.ml index b28641c46d3..227a05bb8d7 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -258,34 +258,72 @@ let pr_var = Pprintast.tyvar let pr_vars = print_list pr_var (fun ppf -> fprintf ppf "@ ") -let rec print_out_type ppf = +let join_modes rm1 am2 = + match rm1, am2 with + | Oam_local, _ -> Oam_local + | _, Oam_local -> Oam_local + | Oam_unknown, _ -> Oam_unknown + | _, Oam_unknown -> Oam_unknown + | Oam_global, Oam_global -> Oam_global + +let rec print_out_type_0 mode ppf = function | Otyp_alias (ty, s) -> - fprintf ppf "@[%a@ as %a@]" print_out_type ty pr_var s + fprintf ppf "@[%a@ as %a@]" (print_out_type_0 mode) ty pr_var s | Otyp_poly (sl, ty) -> fprintf ppf "@[%a.@ %a@]" pr_vars sl - print_out_type ty + (print_out_type_0 mode) ty | ty -> - print_out_type_1 ppf ty + print_out_type_1 mode ppf ty -and print_out_type_1 ppf = +and print_out_type_1 mode ppf = function - Otyp_arrow (lab, ty1, ty2) -> + | Otyp_arrow (lab, am, ty1, rm, ty2) -> pp_open_box ppf 0; if lab <> "" then (pp_print_string ppf lab; pp_print_char ppf ':'); - print_out_type_2 ppf ty1; + print_out_arg am ppf ty1; pp_print_string ppf " ->"; pp_print_space ppf (); - print_out_type_1 ppf ty2; + let mode = join_modes mode am in + print_out_ret mode rm ppf ty2; pp_close_box ppf () - | ty -> print_out_type_2 ppf ty -and print_out_type_2 ppf = + | ty -> + match mode with + | Oam_local -> + pp_print_string ppf "local_"; + pp_print_space ppf (); + print_out_type_2 mode ppf ty + | Oam_unknown -> print_out_type_2 mode ppf ty + | Oam_global -> print_out_type_2 mode ppf ty + +and print_out_arg am ppf ty = + match am with + | Oam_local -> + pp_print_string ppf "local_"; + pp_print_space ppf (); + print_out_type_2 am ppf ty + | Oam_global -> print_out_type_2 am ppf ty + | Oam_unknown -> print_out_type_2 am ppf ty + +and print_out_ret mode rm ppf ty = + match mode, rm with + | Oam_local, Oam_local + | Oam_global, Oam_global + | Oam_unknown, _ + | _, Oam_unknown -> print_out_type_1 rm ppf ty + | _, Oam_local -> + pp_print_string ppf "local_"; + pp_print_space ppf (); + print_out_type_2 rm ppf ty + | _, Oam_global -> print_out_type_2 rm ppf ty + +and print_out_type_2 mode ppf = function Otyp_tuple tyl -> fprintf ppf "@[<0>%a@]" (print_typlist print_simple_out_type " *") tyl - | ty -> print_simple_out_type ppf ty -and print_simple_out_type ppf = + | ty -> print_out_type_3 mode ppf ty +and print_out_type_3 mode ppf = function Otyp_class (ng, id, tyl) -> fprintf ppf "@[%a%s#%a@]" print_typargs tyl (if ng then "_" else "") @@ -322,7 +360,7 @@ and print_simple_out_type ppf = | Otyp_alias _ | Otyp_poly _ | Otyp_arrow _ | Otyp_tuple _ as ty -> pp_open_box ppf 1; pp_print_char ppf '('; - print_out_type ppf ty; + print_out_type_0 mode ppf ty; pp_print_char ppf ')'; pp_close_box ppf () | Otyp_abstract | Otyp_open @@ -339,7 +377,12 @@ and print_simple_out_type ppf = n tyl; fprintf ppf ")@]" | Otyp_attribute (t, attr) -> - fprintf ppf "@[<1>(%a [@@%s])@]" print_out_type t attr.oattr_name + fprintf ppf "@[<1>(%a [@@%s])@]" + (print_out_type_0 mode) t attr.oattr_name +and print_out_type ppf typ = + print_out_type_0 Oam_global ppf typ +and print_simple_out_type ppf typ = + print_out_type_3 Oam_global ppf typ and print_record_decl ppf lbls = fprintf ppf "{%a@;<1 -2>}" (print_list_init print_out_label (fun ppf -> fprintf ppf "@ ")) lbls @@ -387,9 +430,15 @@ and print_typargs ppf = pp_print_char ppf ')'; pp_close_box ppf (); pp_print_space ppf () -and print_out_label ppf (name, mut, arg) = - fprintf ppf "@[<2>%s%s :@ %a@];" (if mut then "mutable " else "") name - print_out_type arg +and print_out_label ppf (name, mut_or_gbl, arg) = + let flag = + match mut_or_gbl with + | Ogom_mutable -> "mutable " + | Ogom_global -> "global_ " + | Ogom_nonlocal -> "nonlocal_ " + | Ogom_immutable -> "" + in + fprintf ppf "@[<2>%s%s :@ %a@];" flag name print_out_type arg let out_label = ref print_out_label @@ -427,7 +476,7 @@ let rec print_out_class_type ppf = fprintf ppf "@[%a%a@]" pr_tyl tyl print_ident id | Octy_arrow (lab, ty, cty) -> fprintf ppf "@[%s%a ->@ %a@]" (if lab <> "" then lab ^ ":" else "") - print_out_type_2 ty print_out_class_type cty + (print_out_type_2 Oam_global) ty print_out_class_type cty | Octy_signature (self_ty, csil) -> let pr_param ppf = function diff --git a/typing/oprint.mli b/typing/oprint.mli index 2eaaa264611..d42d0d12b5f 100644 --- a/typing/oprint.mli +++ b/typing/oprint.mli @@ -18,7 +18,7 @@ open Outcometree val out_ident : (formatter -> out_ident -> unit) ref val out_value : (formatter -> out_value -> unit) ref -val out_label : (formatter -> string * bool * out_type -> unit) ref +val out_label : (formatter -> string * out_mutable_or_global * out_type -> unit) ref val out_type : (formatter -> out_type -> unit) ref val out_constr : (formatter -> string * out_type list * out_type option -> unit) ref diff --git a/typing/outcometree.mli b/typing/outcometree.mli index 2ab89f464d4..26292a8ae5f 100644 --- a/typing/outcometree.mli +++ b/typing/outcometree.mli @@ -58,16 +58,22 @@ type out_value = type out_type_param = string * (Asttypes.variance * Asttypes.injectivity) +type out_mutable_or_global = + | Ogom_mutable + | Ogom_global + | Ogom_nonlocal + | Ogom_immutable + type out_type = | Otyp_abstract | Otyp_open | Otyp_alias of out_type * string - | Otyp_arrow of string * out_type * out_type + | Otyp_arrow of string * out_alloc_mode * out_type * out_alloc_mode * 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_record of (string * out_mutable_or_global * out_type) list | Otyp_stuff of string | Otyp_sum of (string * out_type list * out_type option) list | Otyp_tuple of out_type list @@ -82,6 +88,11 @@ and out_variant = | Ovar_fields of (string * bool * out_type list) list | Ovar_typ of out_type +and out_alloc_mode = + | Oam_local + | Oam_global + | Oam_unknown + type out_class_type = | Octy_constr of out_ident * out_type list | Octy_arrow of string * out_type * out_class_type diff --git a/typing/parmatch.ml b/typing/parmatch.ml index 57834d3db3a..5be766c9725 100644 --- a/typing/parmatch.ml +++ b/typing/parmatch.ml @@ -19,15 +19,15 @@ open Misc open Asttypes open Types open Typedtree - +module Value_mode = Btype.Value_mode (*************************************) (* Utilities for building patterns *) (*************************************) -let make_pat desc ty tenv = +let make_pat desc ty mode tenv = {pat_desc = desc; pat_loc = Location.none; pat_extra = []; - pat_type = ty ; pat_env = tenv; + pat_type = ty ; pat_mode = mode; pat_env = tenv; pat_attributes = []; } @@ -38,7 +38,7 @@ let omega_list = Patterns.omega_list let extra_pat = make_pat (Tpat_var (Ident.create_local "+", mknoloc "+")) - Ctype.none Env.empty + Ctype.none Value_mode.max_mode Env.empty (*******************) @@ -489,7 +489,7 @@ let rec read_args xs r = match xs,r with let do_set_args ~erase_mutable q r = match q with | {pat_desc = Tpat_tuple omegas} -> let args,rest = read_args omegas r in - make_pat (Tpat_tuple args) q.pat_type q.pat_env::rest + make_pat (Tpat_tuple args) q.pat_type q.pat_mode q.pat_env::rest | {pat_desc = Tpat_record (omegas,closed)} -> let args,rest = read_args omegas r in make_pat @@ -504,13 +504,13 @@ let do_set_args ~erase_mutable q r = match q with else lid, lbl, arg) omegas args, closed)) - q.pat_type q.pat_env:: + q.pat_type q.pat_mode q.pat_env:: rest | {pat_desc = Tpat_construct (lid, c,omegas)} -> let args,rest = read_args omegas r in make_pat (Tpat_construct (lid, c,args)) - q.pat_type q.pat_env:: + q.pat_type q.pat_mode q.pat_env:: rest | {pat_desc = Tpat_variant (l, omega, row)} -> let arg, rest = @@ -520,18 +520,18 @@ let do_set_args ~erase_mutable q r = match q with | _ -> assert false in make_pat - (Tpat_variant (l, arg, row)) q.pat_type q.pat_env:: + (Tpat_variant (l, arg, row)) q.pat_type q.pat_mode q.pat_env:: rest | {pat_desc = Tpat_lazy _omega} -> begin match r with arg::rest -> - make_pat (Tpat_lazy arg) q.pat_type q.pat_env::rest + make_pat (Tpat_lazy arg) q.pat_type q.pat_mode q.pat_env::rest | _ -> fatal_error "Parmatch.do_set_args (lazy)" end | {pat_desc = Tpat_array omegas} -> let args,rest = read_args omegas r in make_pat - (Tpat_array args) q.pat_type q.pat_env:: + (Tpat_array args) q.pat_type q.pat_mode q.pat_env:: rest | {pat_desc=Tpat_constant _|Tpat_any} -> q::r (* case any is used in matching.ml *) @@ -709,7 +709,9 @@ let set_last a = (* mark constructor lines for failure when they are incomplete *) let mark_partial = - let zero = make_pat (`Constant (Const_int 0)) Ctype.none Env.empty in + let zero = + make_pat (`Constant (Const_int 0)) Ctype.none Value_mode.max_mode Env.empty + in List.map (fun ((hp, _), _ as ps) -> match hp.pat_desc with | Patterns.Head.Any -> ps @@ -836,7 +838,8 @@ let pat_of_constr ex_pat cstr = Tpat_construct (mknoloc (Longident.Lident cstr.cstr_name), cstr, omegas cstr.cstr_arity)} -let orify x y = make_pat (Tpat_or (x, y, None)) x.pat_type x.pat_env +let orify x y = + make_pat (Tpat_or (x, y, None)) x.pat_type x.pat_mode x.pat_env let rec orify_many = function | [] -> assert false @@ -849,7 +852,7 @@ let pat_of_constrs ex_pat cstrs = if cstrs = [] then raise Empty else orify_many (List.map (pat_of_constr ex_pat) cstrs) -let pats_of_type ?(always=false) env ty = +let pats_of_type ?(always=false) env ty mode = let ty' = Ctype.expand_head env ty in match ty'.desc with | Tconstr (path, _, _) -> @@ -858,7 +861,7 @@ let pats_of_type ?(always=false) env ty = (* Only explode when all constructors are GADTs *) List.for_all (fun cd -> cd.Types.cd_res <> None) cl -> let cstrs = fst (Env.find_type_descrs path env) in - List.map (pat_of_constr (make_pat Tpat_any ty env)) cstrs + List.map (pat_of_constr (make_pat Tpat_any ty mode env)) cstrs | Type_record _ -> let labels = snd (Env.find_type_descrs path env) in let fields = @@ -866,12 +869,12 @@ let pats_of_type ?(always=false) env ty = mknoloc (Longident.Lident ld.lbl_name), ld, omega) labels in - [make_pat (Tpat_record (fields, Closed)) ty env] + [make_pat (Tpat_record (fields, Closed)) ty mode env] | _ -> [omega] with Not_found -> [omega] end | Ttuple tl -> - [make_pat (Tpat_tuple (omegas (List.length tl))) ty env] + [make_pat (Tpat_tuple (omegas (List.length tl))) ty mode env] | _ -> [omega] let rec get_variant_constructors env ty = @@ -922,7 +925,7 @@ let build_other_constant proj make first next p env = let rec try_const i = if List.mem i all then try_const (next i) - else make_pat (make i) p.pat_type p.pat_env + else make_pat (make i) p.pat_type p.pat_mode p.pat_env in try_const first (* @@ -943,7 +946,7 @@ let build_other ext env = make_pat (Tpat_var (Ident.create_local "*extension*", {txt="*extension*"; loc = d.pat_loc})) - Ctype.none Env.empty + Ctype.none Value_mode.max_mode Env.empty | Construct _ -> begin match ext with | Some ext -> @@ -966,7 +969,8 @@ let build_other ext env = in let make_other_pat tag const = let arg = if const then None else Some Patterns.omega in - make_pat (Tpat_variant(tag, arg, cstr_row)) d.pat_type d.pat_env + make_pat (Tpat_variant(tag, arg, cstr_row)) + d.pat_type d.pat_mode d.pat_env in let row = type_row () in begin match @@ -990,7 +994,8 @@ let build_other ext env = | pat::other_pats -> List.fold_left (fun p_res pat -> - make_pat (Tpat_or (pat, p_res, None)) d.pat_type d.pat_env) + make_pat (Tpat_or (pat, p_res, None)) + d.pat_type d.pat_mode d.pat_env) pat other_pats end | Constant Const_char _ -> @@ -1008,7 +1013,8 @@ let build_other ext env = if List.mem ci all_chars then find_other (i+1) imax else - make_pat (Tpat_constant (Const_char ci)) d.pat_type d.pat_env + make_pat (Tpat_constant (Const_char ci)) + d.pat_type d.pat_mode d.pat_env in let rec try_chars = function | [] -> Patterns.omega @@ -1065,7 +1071,8 @@ let build_other ext env = let rec try_arrays l = if List.mem l all_lengths then try_arrays (l+1) else - make_pat (Tpat_array (omegas l)) d.pat_type d.pat_env in + make_pat (Tpat_array (omegas l)) + d.pat_type d.pat_mode d.pat_env in try_arrays 0 | _ -> Patterns.omega @@ -1755,28 +1762,31 @@ let rec lub p q = match p.pat_desc,q.pat_desc with | Tpat_constant c1, Tpat_constant c2 when const_compare c1 c2 = 0 -> p | Tpat_tuple ps, Tpat_tuple qs -> let rs = lubs ps qs in - make_pat (Tpat_tuple rs) p.pat_type p.pat_env + make_pat (Tpat_tuple rs) p.pat_type p.pat_mode p.pat_env | Tpat_lazy p, Tpat_lazy q -> let r = lub p q in - make_pat (Tpat_lazy r) p.pat_type p.pat_env + make_pat (Tpat_lazy r) p.pat_type p.pat_mode p.pat_env | Tpat_construct (lid, c1,ps1), Tpat_construct (_,c2,ps2) when Types.equal_tag c1.cstr_tag c2.cstr_tag -> let rs = lubs ps1 ps2 in make_pat (Tpat_construct (lid, c1,rs)) - p.pat_type p.pat_env + p.pat_type p.pat_mode p.pat_env | Tpat_variant(l1,Some p1,row), Tpat_variant(l2,Some p2,_) when l1=l2 -> let r=lub p1 p2 in - make_pat (Tpat_variant (l1,Some r,row)) p.pat_type p.pat_env + make_pat (Tpat_variant (l1,Some r,row)) + p.pat_type p.pat_mode p.pat_env | Tpat_variant (l1,None,_row), Tpat_variant(l2,None,_) when l1 = l2 -> p | Tpat_record (l1,closed),Tpat_record (l2,_) -> let rs = record_lubs l1 l2 in - make_pat (Tpat_record (rs, closed)) p.pat_type p.pat_env + make_pat (Tpat_record (rs, closed)) + p.pat_type p.pat_mode p.pat_env | Tpat_array ps, Tpat_array qs when List.length ps = List.length qs -> let rs = lubs ps qs in - make_pat (Tpat_array rs) p.pat_type p.pat_env + make_pat (Tpat_array rs) + p.pat_type p.pat_mode p.pat_env | _,_ -> raise Empty @@ -1946,7 +1956,7 @@ type ppat_of_type = (string, label_description) Hashtbl.t let ppat_of_type env ty = - match pats_of_type env ty with + match pats_of_type env ty Value_mode.max_mode with | [] -> PT_empty | [{pat_desc = Tpat_any}] -> PT_any | [pat] -> @@ -2452,7 +2462,7 @@ let all_rhs_idents exp = let open Tast_iterator in let expr_iter iter exp = (match exp.exp_desc with - | Texp_ident (path, _lid, _descr) -> + | Texp_ident (path, _lid, _descr, _kind) -> List.iter (fun id -> ids := Ident.Set.add id !ids) (Path.heads path) (* Use default iterator methods for rest of match.*) | _ -> Tast_iterator.default_iterator.expr iter exp); @@ -2461,7 +2471,7 @@ let all_rhs_idents exp = | Texp_letmodule (id_mod,_,_, {mod_desc= - Tmod_unpack ({exp_desc=Texp_ident (Path.Pident id_exp,_,_)},_)}, + Tmod_unpack ({exp_desc=Texp_ident (Path.Pident id_exp,_,_,_)},_)}, _) -> assert (Ident.Set.mem id_exp !ids) ; begin match id_mod with diff --git a/typing/patterns.ml b/typing/patterns.ml index a67ac9d6e2c..990d2abf7b7 100644 --- a/typing/patterns.ml +++ b/typing/patterns.ml @@ -17,6 +17,7 @@ open Asttypes open Types open Typedtree +module Value_mode = Btype.Value_mode (* useful pattern auxiliary functions *) @@ -25,6 +26,7 @@ let omega = { pat_loc = Location.none; pat_extra = []; pat_type = Ctype.none; + pat_mode = Value_mode.min_mode; pat_env = Env.empty; pat_attributes = []; } diff --git a/typing/primitive.ml b/typing/primitive.ml index 10c5d45e33c..4ce418e9ae1 100644 --- a/typing/primitive.ml +++ b/typing/primitive.ml @@ -196,14 +196,14 @@ open Outcometree let rec add_native_repr_attributes ty attrs = match ty, attrs with - | Otyp_arrow (label, a, b), attr_opt :: rest -> - let b = add_native_repr_attributes b rest in + | Otyp_arrow (label, am, a, rm, r), attr_opt :: rest -> + let r = add_native_repr_attributes r rest in let a = match attr_opt with | None -> a | Some attr -> Otyp_attribute (a, attr) in - Otyp_arrow (label, a, b) + Otyp_arrow (label, am, a, rm, r) | _, [Some attr] -> Otyp_attribute (ty, attr) | _ -> assert (List.for_all (fun x -> x = None) attrs); diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 9e32969af30..96550fd3b4c 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -496,9 +496,10 @@ let rec raw_type ppf ty = and raw_type_list tl = raw_list raw_type tl and raw_type_desc ppf = function Tvar name -> fprintf ppf "Tvar %a" print_name name - | Tarrow(l,t1,t2,c) -> - fprintf ppf "@[Tarrow(\"%s\",@,%a,@,%a,@,%s)@]" - (string_of_label l) raw_type t1 raw_type t2 + | Tarrow((l,arg,ret),t1,t2,c) -> + fprintf ppf "@[Tarrow((\"%s\",%a,%a),@,%a,@,%a,@,%s)@]" + (string_of_label l) Alloc_mode.print arg Alloc_mode.print ret + raw_type t1 raw_type t2 (safe_commu_repr [] c) | Ttuple tl -> fprintf ppf "@[<1>Ttuple@,%a@]" raw_type_list tl @@ -961,7 +962,7 @@ let rec tree_of_typexp sch ty = let non_gen = is_non_gen sch ty in let name_gen = if non_gen then new_weak_name ty else new_name in Otyp_var (non_gen, name_of_type name_gen ty) - | Tarrow(l, ty1, ty2, _) -> + | Tarrow ((l, marg, mret), ty1, ty2, _) -> let lab = if !print_labels || is_optional l then string_of_label l else "" in @@ -973,7 +974,20 @@ let rec tree_of_typexp sch ty = tree_of_typexp sch ty | _ -> Otyp_stuff "" else tree_of_typexp sch ty1 in - Otyp_arrow (lab, t1, tree_of_typexp sch ty2) + let am = + match Alloc_mode.check_const marg with + | Some Global -> Oam_global + | Some Local -> Oam_local + | None -> Oam_unknown + in + let t2 = tree_of_typexp sch ty2 in + let rm = + match Alloc_mode.check_const mret with + | Some Global -> Oam_global + | Some Local -> Oam_local + | None -> Oam_unknown + in + Otyp_arrow (lab, am, t1, rm, t2) | Ttuple tyl -> Otyp_tuple (tree_of_typlist sch tyl) | Tconstr(p, tyl, _abbrev) -> @@ -1314,7 +1328,14 @@ and tree_of_constructor cd = (name, args, Some ret) and tree_of_label l = - (Ident.name l.ld_id, l.ld_mutable = Mutable, tree_of_typexp false l.ld_type) + let gom = + match l.ld_mutable, l.ld_global with + | Mutable, _ -> Ogom_mutable + | Immutable, Global -> Ogom_global + | Immutable, Nonlocal -> Ogom_nonlocal + | Immutable, Unrestricted -> Ogom_immutable + in + (Ident.name l.ld_id, gom, tree_of_typexp false l.ld_type) let constructor ppf c = reset_except_context (); diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 30867b60916..45b61bc9a7b 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -330,22 +330,30 @@ and expression i ppf x = expression_extra i ppf extra attrs; i+1) (i+1) x.exp_extra in + (match Btype.Value_mode.check_const x.exp_mode with + | Some Global -> line i ppf "value_mode global\n" + | Some Regional -> line i ppf "value_mode regional\n" + | Some Local -> line i ppf "value_mode local\n" + | None -> line i ppf "value_mode \n"); match x.exp_desc with - | Texp_ident (li,_,_) -> line i ppf "Texp_ident %a\n" fmt_path li; + | Texp_ident (li,_,_,_) -> line i ppf "Texp_ident %a\n" fmt_path li; | Texp_instvar (_, li,_) -> line i ppf "Texp_instvar %a\n" fmt_path li; | Texp_constant (c) -> line i ppf "Texp_constant %a\n" fmt_constant c; | Texp_let (rf, l, e) -> line i ppf "Texp_let %a\n" fmt_rec_flag rf; list i value_binding ppf l; expression i ppf e; - | Texp_function { arg_label = p; param = _; cases; partial = _; } -> + | Texp_function { arg_label = p; param = _; cases; partial = _; region } -> line i ppf "Texp_function\n"; + line i ppf "region %b\n" region; arg_label i ppf p; list i case ppf cases; - | Texp_apply (e, l) -> + | Texp_apply (e, l, m) -> line i ppf "Texp_apply\n"; + line i ppf "apply_mode %s\n" + (match m with Tail -> "Tail" | Nontail -> "Nontail"); expression i ppf e; - list i label_x_expression ppf l; + list i label_x_apply_arg ppf l; | Texp_match (e, l, _partial) -> line i ppf "Texp_match\n"; expression i ppf e; @@ -410,15 +418,15 @@ and expression i ppf x = expression i ppf e1; expression i ppf e2; expression i ppf e3; - | Texp_send (e, Tmeth_name s, eo) -> + | Texp_send (e, Tmeth_name s, eo, _) -> line i ppf "Texp_send \"%s\"\n" s; expression i ppf e; option i expression ppf eo - | Texp_send (e, Tmeth_val s, eo) -> + | Texp_send (e, Tmeth_val s, eo, _) -> line i ppf "Texp_send \"%a\"\n" fmt_ident s; expression i ppf e; option i expression ppf eo - | Texp_new (li, _, _) -> line i ppf "Texp_new %a\n" fmt_path li; + | Texp_new (li, _, _, _) -> line i ppf "Texp_new %a\n" fmt_path li; | Texp_setinstvar (_, s, _, e) -> line i ppf "Texp_setinstvar \"%a\"\n" fmt_path s; expression i ppf e; @@ -635,7 +643,7 @@ and class_expr i ppf x = | Tcl_apply (ce, l) -> line i ppf "Tcl_apply\n"; class_expr i ppf ce; - list i label_x_expression ppf l; + list i label_x_apply_arg ppf l; | Tcl_let (rf, l1, l2, ce) -> line i ppf "Tcl_let %a\n" fmt_rec_flag rf; list i value_binding ppf l1; @@ -947,10 +955,10 @@ and record_field i ppf = function | _, Kept _ -> line i ppf "" -and label_x_expression i ppf (l, e) = +and label_x_apply_arg i ppf (l, e) = line i ppf "\n"; arg_label (i+1) ppf l; - (match e with None -> () | Some e -> expression (i+1) ppf e) + (match e with Omitted _ -> () | Arg e -> expression (i+1) ppf e) and ident_x_expression_def i ppf (l, e) = line i ppf " \"%a\"\n" fmt_ident l; diff --git a/typing/rec_check.ml b/typing/rec_check.ml index 13f157aceb2..2cfffad2431 100644 --- a/typing/rec_check.ml +++ b/typing/rec_check.ml @@ -117,9 +117,9 @@ let is_ref : Types.value_description -> bool = function (* See the note on abstracted arguments in the documentation for Typedtree.Texp_apply *) -let is_abstracted_arg : arg_label * expression option -> bool = function - | (_, None) -> true - | (_, Some _) -> false +let is_abstracted_arg : arg_label * apply_arg -> bool = function + | (_, Omitted _) -> true + | (_, Arg _) -> false let classify_expression : Typedtree.expression -> sd = (* We need to keep track of the size of expressions @@ -147,7 +147,7 @@ let classify_expression : Typedtree.expression -> sd = | Texp_let (rec_flag, vb, e) -> let env = classify_value_bindings rec_flag env vb in classify_expression env e - | Texp_ident (path, _, _) -> + | Texp_ident (path, _, _, _) -> classify_path env path (* non-binding cases *) @@ -168,10 +168,10 @@ let classify_expression : Typedtree.expression -> sd = | Texp_record _ -> Static - | Texp_apply ({exp_desc = Texp_ident (_, _, vd)}, _) + | Texp_apply ({exp_desc = Texp_ident (_, _, vd, Id_prim _)}, _, _) when is_ref vd -> Static - | Texp_apply (_,args) + | Texp_apply (_, args, _) when List.exists is_abstracted_arg args -> Static | Texp_apply _ -> @@ -522,7 +522,7 @@ let (>>) : bind_judg -> term_judg -> term_judg = *) let rec expression : Typedtree.expression -> term_judg = fun exp -> match exp.exp_desc with - | Texp_ident (pth, _, _) -> + | Texp_ident (pth, _, _, _) -> path pth | Texp_let (rec_flag, bindings, body) -> (* @@ -577,7 +577,7 @@ let rec expression : Typedtree.expression -> term_judg = ] | Texp_constant _ -> empty - | Texp_new (pth, _, _) -> + | Texp_new (pth, _, _, _) -> (* G |- c: m[Dereference] ----------------------- @@ -586,7 +586,8 @@ let rec expression : Typedtree.expression -> term_judg = path pth << Dereference | Texp_instvar (self_path, pth, _inst_var) -> join [path self_path << Dereference; path pth] - | Texp_apply ({exp_desc = Texp_ident (_, _, vd)}, [_, Some arg]) + | Texp_apply + ({exp_desc = Texp_ident (_, _, vd, Id_prim _)}, [_, Arg arg], _) when is_ref vd -> (* G |- e: m[Guard] @@ -594,8 +595,12 @@ let rec expression : Typedtree.expression -> term_judg = G |- ref e: m *) expression arg << Guard - | Texp_apply (e, args) -> - let arg (_, eo) = option expression eo in + | Texp_apply (e, args, _) -> + let arg (_, arg) = + match arg with + | Omitted _ -> empty + | Arg e -> expression e + in let app_mode = if List.exists is_abstracted_arg args then (* see the comment on Texp_apply in typedtree.mli; the non-abstracted arguments are bound to local @@ -715,7 +720,7 @@ let rec expression : Typedtree.expression -> term_judg = expression cond << Dereference; expression body << Guard; ] - | Texp_send (e1, _, eo) -> + | Texp_send (e1, _, eo, _) -> (* G |- e: m[Dereference] ---------------------- (plus weird 'eo' option) @@ -1079,7 +1084,11 @@ and class_expr : Typedtree.class_expr -> term_judg = let ids = List.map fst args in remove_ids ids (class_expr ce << Delay) | Tcl_apply (ce, args) -> - let arg (_label, eo) = option expression eo in + let arg (_, arg) = + match arg with + | Omitted _ -> empty + | Arg e -> expression e + in join [ class_expr ce << Dereference; list arg args << Dereference; diff --git a/typing/stypes.ml b/typing/stypes.ml index dfbcc9918db..d467c0b6af8 100644 --- a/typing/stypes.ml +++ b/typing/stypes.ml @@ -117,7 +117,7 @@ let rec printtyp_reset_maybe loc = | _ -> () ;; -let call_kind_string k = +let call_kind_string (k : call) = match k with | Tail -> "tail" | Stack -> "stack" diff --git a/typing/subst.ml b/typing/subst.ml index f9f1bdc1199..5c759151529 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -262,6 +262,7 @@ let label_declaration copy_scope s l = { ld_id = l.ld_id; ld_mutable = l.ld_mutable; + ld_global = l.ld_global; ld_type = typexp copy_scope s l.ld_type; ld_loc = loc s l.ld_loc; ld_attributes = attrs s l.ld_attributes; diff --git a/typing/tast_iterator.ml b/typing/tast_iterator.ml index 8f8624267ef..4b6762871bc 100644 --- a/typing/tast_iterator.ml +++ b/typing/tast_iterator.ml @@ -195,9 +195,12 @@ let expr sub {exp_extra; exp_desc; exp_env; _} = sub.expr sub exp | Texp_function {cases; _} -> List.iter (sub.case sub) cases - | Texp_apply (exp, list) -> + | Texp_apply (exp, list, _) -> sub.expr sub exp; - List.iter (fun (_, o) -> Option.iter (sub.expr sub) o) list + List.iter (function + | (_, Arg exp) -> sub.expr sub exp + | (_, Omitted _) -> ()) + list | Texp_match (exp, cases, _) -> sub.expr sub exp; List.iter (sub.case sub) cases @@ -243,7 +246,7 @@ let expr sub {exp_extra; exp_desc; exp_env; _} = sub.expr sub exp1; sub.expr sub exp2; sub.expr sub exp3 - | Texp_send (exp, _, expo) -> + | Texp_send (exp, _, expo, _) -> sub.expr sub exp; Option.iter (sub.expr sub) expo | Texp_new _ -> () @@ -383,7 +386,10 @@ let class_expr sub {cl_desc; cl_env; _} = sub.class_expr sub cl | Tcl_apply (cl, args) -> sub.class_expr sub cl; - List.iter (fun (_, e) -> Option.iter (sub.expr sub) e) args + List.iter (function + | (_, Arg exp) -> sub.expr sub exp + | (_, Omitted _) -> ()) + args | Tcl_let (rec_flag, value_bindings, ivars, cl) -> sub.value_bindings sub (rec_flag, value_bindings); List.iter (fun (_, e) -> sub.expr sub e) ivars; diff --git a/typing/tast_mapper.ml b/typing/tast_mapper.ml index e7886e2438c..605869b64ec 100644 --- a/typing/tast_mapper.ml +++ b/typing/tast_mapper.ml @@ -260,13 +260,17 @@ let expr sub x = | Texp_let (rec_flag, list, exp) -> let (rec_flag, list) = sub.value_bindings sub (rec_flag, list) in Texp_let (rec_flag, list, sub.expr sub exp) - | Texp_function { arg_label; param; cases; partial; } -> + | Texp_function { arg_label; param; cases; partial; region; } -> let cases = List.map (sub.case sub) cases in - Texp_function { arg_label; param; cases; partial; } - | Texp_apply (exp, list) -> + Texp_function { arg_label; param; cases; partial; region; } + | Texp_apply (exp, list, pos) -> Texp_apply ( sub.expr sub exp, - List.map (tuple2 id (Option.map (sub.expr sub))) list + List.map (function + | (lbl, Arg exp) -> (lbl, Arg (sub.expr sub exp)) + | (lbl, Omitted o) -> (lbl, Omitted o)) + list, + pos ) | Texp_match (exp, cases, p) -> Texp_match ( @@ -342,12 +346,13 @@ let expr sub x = dir, sub.expr sub exp3 ) - | Texp_send (exp, meth, expo) -> + | Texp_send (exp, meth, expo, pos) -> Texp_send ( sub.expr sub exp, meth, - Option.map (sub.expr sub) expo + Option.map (sub.expr sub) expo, + pos ) | Texp_new _ | Texp_instvar _ as d -> d @@ -569,7 +574,10 @@ let class_expr sub x = | Tcl_apply (cl, args) -> Tcl_apply ( sub.class_expr sub cl, - List.map (tuple2 id (Option.map (sub.expr sub))) args + List.map (function + | (lbl, Arg exp) -> (lbl, Arg (sub.expr sub exp)) + | (lbl, Omitted o) -> (lbl, Omitted o)) + args ) | Tcl_let (rec_flag, value_bindings, ivars, cl) -> let (rec_flag, value_bindings) = diff --git a/typing/typeclass.ml b/typing/typeclass.ml index 12dec437afa..83002dd7f01 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -20,6 +20,8 @@ open Types open Typecore open Typetexp open Format +module Value_mode = Btype.Value_mode +module Alloc_mode = Btype.Alloc_mode type 'a class_info = { cls_id : Ident.t; @@ -177,7 +179,8 @@ let rec constructor_type constr cty = | Cty_signature _ -> constr | Cty_arrow (l, ty, cty) -> - Ctype.newty (Tarrow (l, ty, constructor_type constr cty, Cok)) + Ctype.newty (Tarrow ((l, Alloc_mode.global, Alloc_mode.global), + ty, constructor_type constr cty, Cok)) let rec class_body cty = match cty with @@ -211,23 +214,26 @@ let rec abbreviate_class_type path params cty = (* Check that all type variables are generalizable *) (* Use Env.empty to prevent expansion of recursively defined object types; cf. typing-poly/poly.ml *) +let closed_type ty = + Ctype.remove_mode_variables ty; Ctype.closed_schema Env.empty ty + let rec closed_class_type = function Cty_constr (_, params, _) -> - List.for_all (Ctype.closed_schema Env.empty) params + List.for_all closed_type params | Cty_signature sign -> - Ctype.closed_schema Env.empty sign.csig_self + closed_type sign.csig_self && - Vars.fold (fun _ (_, _, ty) cc -> Ctype.closed_schema Env.empty ty && cc) + Vars.fold (fun _ (_, _, ty) cc -> closed_type ty && cc) sign.csig_vars true | Cty_arrow (_, ty, cty) -> - Ctype.closed_schema Env.empty ty + closed_type ty && closed_class_type cty let closed_class cty = - List.for_all (Ctype.closed_schema Env.empty) cty.cty_params + List.for_all closed_type cty.cty_params && closed_class_type cty.cty_type @@ -354,7 +360,7 @@ let virtual_method val_env meths self_type lab priv sty loc = Ctype.filter_self_method val_env lab priv meths self_type in let sty = Ast_helper.Typ.force_poly sty in - let cty = transl_simple_type val_env false sty in + let cty = transl_simple_type val_env false Global sty in let ty = cty.ctyp_type in begin try Ctype.unify val_env ty ty' with Ctype.Unify trace -> @@ -389,15 +395,15 @@ so that we can get an immediate value. Is that correct ? Ask Jacques. *) !delayed_meth_specs; returned_cty | _ -> - let cty = transl_simple_type val_env false sty in + let cty = transl_simple_type val_env false Global sty in let ty = cty.ctyp_type in unif ty; cty let type_constraint val_env sty sty' loc = - let cty = transl_simple_type val_env false sty in + let cty = transl_simple_type val_env false Global sty in let ty = cty.ctyp_type in - let cty' = transl_simple_type val_env false sty' in + let cty' = transl_simple_type val_env false Global sty' in let ty' = cty'.ctyp_type in begin try Ctype.unify val_env ty ty' with Ctype.Unify trace -> @@ -452,7 +458,7 @@ and class_type_field_aux env self_type meths val_sig, concr_meths, inher) | Pctf_val ({txt=lab}, mut, virt, sty) -> - let cty = transl_simple_type env false sty in + let cty = transl_simple_type env false Global sty in let ty = cty.ctyp_type in (mkctf (Tctf_val (lab, mut, virt, cty)) :: fields, add_val lab (mut, virt, ty) val_sig, concr_meths, inher) @@ -483,7 +489,7 @@ and class_type_field_aux env self_type meths and class_signature env {pcsig_self=sty; pcsig_fields=sign} = let meths = ref Meths.empty in - let self_cty = transl_simple_type env false sty in + let self_cty = transl_simple_type env false Global sty in let self_cty = { self_cty with ctyp_type = Ctype.expand_head env self_cty.ctyp_type } in let self_type = self_cty.ctyp_type in @@ -546,7 +552,7 @@ and class_type_aux env scty = List.length styl))); let ctys = List.map2 (fun sty ty -> - let cty' = transl_simple_type env false sty in + let cty' = transl_simple_type env false Global sty in let ty' = cty'.ctyp_type in begin try Ctype.unify env ty' ty with Ctype.Unify trace -> @@ -564,7 +570,7 @@ and class_type_aux env scty = cltyp (Tcty_signature clsig) typ | Pcty_arrow (l, sty, scty) -> - let cty = transl_simple_type env false sty in + let cty = transl_simple_type env false Global sty in let ty = cty.ctyp_type in let ty = if Btype.is_optional l @@ -652,7 +658,7 @@ and class_field_aux self_loc cl_num self_type meths vars | Pcf_val (lab, mut, Cfk_virtual styp) -> if !Clflags.principal then Ctype.begin_def (); - let cty = Typetexp.transl_simple_type val_env false styp in + let cty = Typetexp.transl_simple_type val_env false Global styp in let ty = cty.ctyp_type in if !Clflags.principal then begin Ctype.end_def (); @@ -727,7 +733,9 @@ and class_field_aux self_loc cl_num self_type meths vars begin match sty with None -> () | Some sty -> let sty = Ast_helper.Typ.force_poly sty in - let cty' = Typetexp.transl_simple_type val_env false sty in + let cty' = + Typetexp.transl_simple_type val_env false Global sty + in let ty' = cty'.ctyp_type in Ctype.unify val_env ty' ty end; @@ -757,7 +765,8 @@ and class_field_aux self_loc cl_num self_type meths vars (* Read the generalized type *) let (_, ty) = Meths.find lab.txt !meths in let meth_type = mk_expected ( - Btype.newgenty (Tarrow(Nolabel, self_type, ty, Cok)) + Btype.newgenty (Tarrow((Nolabel, Alloc_mode.global, Alloc_mode.global), + self_type, ty, Cok)) ) in Ctype.raise_nongen_level (); vars := vars_local; @@ -784,7 +793,7 @@ and class_field_aux self_loc cl_num self_type meths vars Ctype.raise_nongen_level (); let meth_type = mk_expected ( Ctype.newty - (Tarrow (Nolabel, self_type, + (Tarrow ((Nolabel, Alloc_mode.global, Alloc_mode.global), self_type, Ctype.instance Predef.type_unit, Cok)) ) in vars := vars_local; @@ -814,6 +823,8 @@ and class_field_aux self_loc cl_num self_type meths vars and class_structure cl_num final val_env met_env loc { pcstr_self = spat; pcstr_fields = str } = (* Environment for substructures *) + let val_env = Env.add_lock Value_mode.global val_env in + let met_env = Env.add_lock Value_mode.global met_env in let par_env = met_env in (* Location of self. Used for locations of self arguments *) @@ -952,7 +963,7 @@ and class_expr_aux cl_num val_env met_env scl = if Path.same decl.cty_path unbound_class then raise(Error(scl.pcl_loc, val_env, Unbound_class_2 lid.txt)); let tyl = List.map - (fun sty -> transl_simple_type val_env false sty) + (fun sty -> transl_simple_type val_env false Global sty) styl in let (params, clty) = @@ -1041,9 +1052,11 @@ and class_expr_aux cl_num val_env met_env scl = let vd = Env.find_value path val_env' in (id, {exp_desc = - Texp_ident(path, mknoloc (Longident.Lident (Ident.name id)), vd); + Texp_ident(path, mknoloc (Longident.Lident (Ident.name id)), vd, + Id_value); exp_loc = Location.none; exp_extra = []; exp_type = Ctype.instance vd.val_type; + exp_mode = Value_mode.global; exp_attributes = []; (* check *) exp_env = val_env'}) end @@ -1059,6 +1072,7 @@ and class_expr_aux cl_num val_env met_env scl = Typecore.check_partial val_env pat.pat_type pat.pat_loc [{c_lhs = pat; c_guard = None; c_rhs = dummy}] in + let val_env' = Env.add_lock Value_mode.global val_env' in Ctype.raise_nongen_level (); let cl = class_expr cl_num val_env' met_env scl' in Ctype.end_def (); @@ -1109,18 +1123,18 @@ and class_expr_aux cl_num val_env met_env scl = let name = Btype.label_name l and optional = Btype.is_optional l in let use_arg sarg l' = - Some ( + Arg ( if not optional || Btype.is_optional l' then type_argument val_env sarg ty ty0 else let ty' = extract_option_type val_env ty and ty0' = extract_option_type val_env ty0 in let arg = type_argument val_env sarg ty' ty0' in - option_some val_env arg + option_some val_env arg Value_mode.global ) in let eliminate_optional_arg () = - Some (option_none val_env ty0 Location.none) + Arg (option_none val_env ty0 Value_mode.global Location.none) in let remaining_sargs, arg = if ignore_labels then begin @@ -1151,10 +1165,18 @@ and class_expr_aux cl_num val_env met_env scl = sargs, if Btype.is_optional l && List.mem_assoc Nolabel sargs then eliminate_optional_arg () - else - None + else begin + let mode_closure = Alloc_mode.global in + let mode_arg = Alloc_mode.global in + let mode_ret = Alloc_mode.global in + Omitted { mode_closure; mode_arg; mode_ret } + end + in + let omitted = + match arg with + | Omitted _ -> (l,ty0) :: omitted + | Arg _ -> omitted in - let omitted = if arg = None then (l,ty0) :: omitted else omitted in type_args ((l,arg)::args) omitted ty_fun ty_fun0 remaining_sargs | _ -> match sargs with @@ -1184,16 +1206,21 @@ and class_expr_aux cl_num val_env met_env scl = Typecore.type_let In_class_def val_env rec_flag sdefs in let (vals, met_env) = List.fold_right - (fun (id, _id_loc, _typ) (vals, met_env) -> + (fun (id, modes) (vals, met_env) -> + List.iter + (fun (loc, mode) -> Typecore.escape ~loc ~env:val_env mode) + modes; let path = Pident id in (* do not mark the value as used *) let vd = Env.find_value path val_env in Ctype.begin_def (); let expr = {exp_desc = - Texp_ident(path, mknoloc(Longident.Lident (Ident.name id)),vd); + Texp_ident(path, mknoloc(Longident.Lident (Ident.name id)),vd, + Id_value); exp_loc = Location.none; exp_extra = []; exp_type = Ctype.instance vd.val_type; + exp_mode = Value_mode.global; exp_attributes = []; exp_env = val_env; } @@ -1212,7 +1239,7 @@ and class_expr_aux cl_num val_env met_env scl = ((id', expr) :: vals, Env.add_value id' desc met_env)) - (let_bound_idents_full defs) + (let_bound_idents_with_modes defs) ([], met_env) in let cl = class_expr cl_num val_env met_env scl' in @@ -1280,7 +1307,8 @@ let rec approx_declaration cl = let arg = if Btype.is_optional l then Ctype.instance var_option else Ctype.newvar () in - Ctype.newty (Tarrow (l, arg, approx_declaration cl, Cok)) + Ctype.newty (Tarrow ((l, Alloc_mode.global, Alloc_mode.global), + arg, approx_declaration cl, Cok)) | Pcl_let (_, _, cl) -> approx_declaration cl | Pcl_constraint (cl, _) -> @@ -1293,7 +1321,8 @@ let rec approx_description ct = let arg = if Btype.is_optional l then Ctype.instance var_option else Ctype.newvar () in - Ctype.newty (Tarrow (l, arg, approx_description ct, Cok)) + Ctype.newty (Tarrow ((l, Alloc_mode.global, Alloc_mode.global), + arg, approx_description ct, Cok)) | _ -> Ctype.newvar () (*******************************) diff --git a/typing/typecore.ml b/typing/typecore.ml index cb2400cc735..dabb39dd48a 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -22,6 +22,7 @@ open Types open Typedtree open Btype open Ctype +module Value_mode = Btype.Value_mode type type_forcing_context = | If_conditional @@ -69,6 +70,12 @@ type existential_restriction = | In_class_def (** or in [class c = let ... in ...] *) | In_self_pattern (** or in self pattern *) +type escaping_context = + | Return + | Tailcall_argument + | Tailcall_function + | Partial_application + type error = | Constructor_arity_mismatch of Longident.t * int * int | Label_mismatch of Longident.t * Ctype.Unification_trace.t @@ -136,6 +143,10 @@ type error = | Letop_type_clash of string * Ctype.Unification_trace.t | Andop_type_clash of string * Ctype.Unification_trace.t | Bindings_type_clash of Ctype.Unification_trace.t + | Local_value_escapes of Value_mode.error * escaping_context option + | Param_mode_mismatch of type_expr + | Uncurried_function_escapes + | Local_return_annotation_mismatch of Location.t exception Error of Location.t * Env.t * error exception Error_forward of Location.error @@ -211,6 +222,158 @@ let mk_expected ?explanation ty = { ty; explanation; } let case lhs rhs = {c_lhs = lhs; c_guard = None; c_rhs = rhs} +type expected_mode = + { position : apply_position; + escaping_context : escaping_context option; + mode : Value_mode.t; + tuple_modes : Value_mode.t list; + (* for t in tuple_modes, t <= regional_to_global mode *) + } + + +let mode_return mode = + let position = Tail in + let escaping_context = Some Return in + let tuple_modes = [] in + { position; escaping_context; mode; tuple_modes } + +let mode_var () = + let position = Nontail in + let escaping_context = None in + let mode = Value_mode.newvar () in + let tuple_modes = [] in + { position; escaping_context; mode; tuple_modes } + +let mode_local = + let position = Nontail in + let escaping_context = None in + let mode = Value_mode.local in + let tuple_modes = [] in + { position; escaping_context; mode; tuple_modes } + +let mode_global = + let position = Nontail in + let escaping_context = None in + let mode = Value_mode.global in + let tuple_modes = [] in + { position; escaping_context; mode; tuple_modes } + +let mode_subcomponent expected_mode = + let position = Nontail in + let escaping_context = None in + let mode = Value_mode.regional_to_global expected_mode.mode in + let tuple_modes = [] in + { position; escaping_context; mode; tuple_modes } + +let mode_tailcall_function mode = + let position = Nontail in + let escaping_context = Some Tailcall_function in + let tuple_modes = [] in + { position; escaping_context; mode; tuple_modes } + +let mode_tailcall_argument mode = + let position = Nontail in + let escaping_context = Some Tailcall_argument in + let tuple_modes = [] in + { position; escaping_context; mode; tuple_modes } + +let mode_partial_application expected_mode = + let position = Nontail in + let escaping_context = Some Partial_application in + let mode = Value_mode.regional_to_global expected_mode.mode in + let tuple_modes = [] in + { position; escaping_context; mode; tuple_modes } + +let mode_trywith expected_mode = + { expected_mode with position = Nontail } + +let mode_nontail mode = + let position = Nontail in + let escaping_context = None in + let tuple_modes = [] in + { position; escaping_context; mode; tuple_modes } + +let mode_tuple mode tuple_modes = + let position = Nontail in + let escaping_context = None in + { position; escaping_context; mode; tuple_modes } + +let mode_argument ~funct ~index ~position ~partial_app alloc_mode = + let vmode = Value_mode.of_alloc alloc_mode in + if partial_app then mode_nontail vmode + else match funct.exp_desc, index, position with + | Texp_ident (_, _, {val_kind = + Val_prim {Primitive.prim_name = ("%sequor"|"%sequand")}}, + Id_prim _), 1, Tail -> + (* The second argument to (&&) and (||) is in + tail position if the call is *) + mode_return (Value_mode.local_to_regional vmode) + | Texp_ident (_, _, _, Id_prim _), _, _ -> + (* Other primitives cannot be tail-called *) + mode_nontail vmode + | _, _, Nontail -> + mode_nontail vmode + | _, _, Tail -> + mode_tailcall_argument (Value_mode.local_to_regional vmode) + +let mode_lazy = + let position = Tail in + let escaping_context = None in + let mode = Value_mode.global in + let tuple_modes = [] in + { position; escaping_context; mode; tuple_modes } + +let submode ~loc ~env mode expected_mode = + let res = + match expected_mode.tuple_modes with + | [] -> Btype.Value_mode.submode mode expected_mode.mode + | ts -> Btype.Value_mode.submode_meet mode ts + in + match res with + | Ok () -> () + | Error reason -> + let context = expected_mode.escaping_context in + raise (Error(loc, env, Local_value_escapes(reason, context))) + +let escape ~loc ~env m = + submode ~loc ~env m mode_global + +let eqmode ~loc ~env m1 m2 err = + match Btype.Alloc_mode.equate m1 m2 with + | Ok () -> () + | Error () -> raise (Error(loc, env, err)) + +type expected_pat_mode = + { mode : Value_mode.t; + tuple_modes : Value_mode.t list; } + +let simple_pat_mode mode = + { mode; tuple_modes = [] } + +let tuple_pat_mode mode tuple_modes = + { mode; tuple_modes } + +let allocations : Alloc_mode.t list ref = Local_store.s_ref [] + +let reset_allocations () = allocations := [] + +let register_allocation_mode alloc_mode = + match Alloc_mode.check_const alloc_mode with + | Some _ -> () + | None -> allocations := alloc_mode :: !allocations + +let register_allocation (expected_mode : expected_mode) = + register_allocation_mode + (Value_mode.regional_to_global_alloc expected_mode.mode) + +let optimise_allocations () = + if Clflags.Extension.is_enabled Local then begin + List.iter + (fun mode -> ignore (Alloc_mode.constrain_upper mode)) + !allocations + end; + reset_allocations () + (* Typing of constants *) let type_constant = function @@ -260,19 +423,20 @@ let constant_or_raise env loc cst = let type_option ty = newty (Tconstr(Predef.path_option,[ty], ref Mnil)) -let mkexp exp_desc exp_type exp_loc exp_env = - { exp_desc; exp_type; exp_loc; exp_env; exp_extra = []; exp_attributes = [] } +let mkexp exp_desc exp_type exp_mode exp_loc exp_env = + { exp_desc; exp_type; exp_mode; + exp_loc; exp_env; exp_extra = []; exp_attributes = [] } -let option_none env ty loc = +let option_none env ty mode loc = let lid = Longident.Lident "None" in let cnone = Env.find_ident_constructor Predef.ident_none env in - mkexp (Texp_construct(mknoloc lid, cnone, [])) ty loc env + mkexp (Texp_construct(mknoloc lid, cnone, [])) ty mode loc env -let option_some env texp = +let option_some env texp mode = let lid = Longident.Lident "Some" in let csome = Env.find_ident_constructor Predef.ident_some env in mkexp ( Texp_construct(mknoloc lid , csome, [texp]) ) - (type_option texp.exp_type) texp.exp_loc texp.exp_env + (type_option texp.exp_type) mode texp.exp_loc texp.exp_env let extract_option_type env ty = match expand_head env ty with {desc = Tconstr(path, [ty], _)} @@ -297,6 +461,10 @@ let extract_label_names env ty = with Not_found -> assert false +let has_local_attr_pat ppat = Builtin_attributes.has_local ppat.ppat_attributes + +let has_local_attr_exp pexp = Builtin_attributes.has_local pexp.pexp_attributes + (* Typing of patterns *) (* unification inside type_exp and type_expect *) @@ -388,6 +556,7 @@ let finalize_variants p = type pattern_variable = { pv_id: Ident.t; + pv_mode: Value_mode.t; pv_type: type_expr; pv_loc: Location.t; pv_as_var: bool; @@ -419,7 +588,7 @@ let maybe_add_pattern_variables_ghost loc_let env pv = end ) pv env -let enter_variable ?(is_module=false) ?(is_as_variable=false) loc name ty +let enter_variable ?(is_module=false) ?(is_as_variable=false) loc name mode ty attrs = if List.exists (fun {pv_id; _} -> Ident.name pv_id = name.txt) !pattern_variables @@ -427,6 +596,7 @@ let enter_variable ?(is_module=false) ?(is_as_variable=false) loc name ty let id = Ident.create_local name.txt in pattern_variables := {pv_id = id; + pv_mode = mode; pv_type = ty; pv_loc = loc; pv_as_var = is_as_variable; @@ -435,6 +605,7 @@ let enter_variable ?(is_module=false) ?(is_as_variable=false) loc name ty (* Note: unpack patterns enter a variable of the same name *) if not !allow_modules then raise (Error (loc, Env.empty, Modules_not_allowed)); + escape ~loc ~env:Env.empty mode; module_variables := (name, loc) :: !module_variables end; id @@ -454,10 +625,12 @@ let enter_orpat_variables loc env p1_vs p2_vs = let rec unify_vars p1_vs p2_vs = let vars vs = List.map (fun {pv_id; _} -> pv_id) vs in match p1_vs, p2_vs with - | {pv_id = x1; pv_type = t1; _}::rem1, {pv_id = x2; pv_type = t2; _}::rem2 + | ({pv_id = x1; pv_type = t1; pv_mode = m1; _} as pv1)::rem1, + {pv_id = x2; pv_type = t2; pv_mode = m2; _}::rem2 when Ident.equal x1 x2 -> if x1==x2 then - unify_vars rem1 rem2 + let vars, alist = unify_vars rem1 rem2 in + pv1 :: vars, alist else begin begin try unify_var env (newvar ()) t1; @@ -466,9 +639,12 @@ let enter_orpat_variables loc env p1_vs p2_vs = | Unify trace -> raise(Error(loc, env, Or_pattern_type_clash(x1, trace))) end; - (x2,x1)::unify_vars rem1 rem2 + let m = Value_mode.join [m1; m2] in + let var = { pv1 with pv_mode = m } in + let vars, alist = unify_vars rem1 rem2 in + var :: vars, (x2, x1) :: alist end - | [],[] -> [] + | [],[] -> [], [] | {pv_id; _}::_, [] | [],{pv_id; _}::_ -> raise (Error (loc, env, Orpat_vars (pv_id, []))) | {pv_id = x; _}::_, {pv_id = y; _}::_ -> @@ -479,44 +655,65 @@ let enter_orpat_variables loc env p1_vs p2_vs = raise (Error (loc, env, err)) in unify_vars p1_vs p2_vs -let rec build_as_type env p = - let as_ty = build_as_type_aux env p in - (* Cf. #1655 *) - List.fold_left (fun as_ty (extra, _loc, _attrs) -> - match extra with - | Tpat_type _ | Tpat_open _ | Tpat_unpack -> as_ty - | Tpat_constraint cty -> - begin_def (); - let ty = instance cty.ctyp_type in - end_def (); - generalize_structure ty; - (* This call to unify can't fail since the pattern is well typed. *) - unify !env (instance as_ty) (instance ty); - ty - ) as_ty p.pat_extra +let rec build_as_type_and_mode env p = + let as_ty, as_mode = build_as_type_aux env p in + let as_ty = + (* Cf. #1655 *) + List.fold_left (fun as_ty (extra, _loc, _attrs) -> + match extra with + | Tpat_type _ | Tpat_open _ | Tpat_unpack -> as_ty + | Tpat_constraint cty -> + begin_def (); + let ty = instance cty.ctyp_type in + end_def (); + generalize_structure ty; + (* This call to unify can't fail since the pattern is well typed. *) + unify !env (instance as_ty) (instance ty); + ty + ) as_ty p.pat_extra + in + as_ty, as_mode + +and build_as_type env p = + fst (build_as_type_and_mode env p) and build_as_type_aux env p = match p.pat_desc with - Tpat_alias(p1,_, _) -> build_as_type env p1 + Tpat_alias(p1,_, _) -> build_as_type_and_mode env p1 | Tpat_tuple pl -> let tyl = List.map (build_as_type env) pl in - newty (Ttuple tyl) + newty (Ttuple tyl), p.pat_mode | Tpat_construct(_, cstr, pl) -> - let keep = cstr.cstr_private = Private || cstr.cstr_existentials <> [] in - if keep then p.pat_type else - let tyl = List.map (build_as_type env) pl in - let ty_args, ty_res = instance_constructor cstr in - List.iter2 (fun (p,ty) -> unify_pat env {p with pat_type = ty}) - (List.combine pl tyl) ty_args; - ty_res + let priv = (cstr.cstr_private = Private) in + let mode = + if priv || pl <> [] then p.pat_mode + else Value_mode.newvar () + in + let keep = priv || cstr.cstr_existentials <> [] in + let ty = + if keep then p.pat_type else + let tyl = List.map (build_as_type env) pl in + let ty_args, ty_res = instance_constructor cstr in + List.iter2 (fun (p,ty) -> unify_pat env {p with pat_type = ty}) + (List.combine pl tyl) ty_args; + ty_res + in + ty, mode | Tpat_variant(l, p', _) -> let ty = Option.map (build_as_type env) p' in - newty (Tvariant{row_fields=[l, Rpresent ty]; row_more=newvar(); - row_bound=(); row_name=None; - row_fixed=None; row_closed=false}) + let mode = + if p' = None then Value_mode.newvar () + else p.pat_mode + in + let ty = + newty (Tvariant{row_fields=[l, Rpresent ty]; row_more=newvar(); + row_bound=(); row_name=None; + row_fixed=None; row_closed=false}) + in + ty, mode | Tpat_record (lpl,_) -> let lbl = snd3 (List.hd lpl) in - if lbl.lbl_private = Private then p.pat_type else + if lbl.lbl_private = Private then p.pat_type, p.pat_mode else let ty = newvar () in let ppl = List.map (fun (_, l, p) -> l.lbl_pos, p) lpl in let do_label lbl = @@ -534,21 +731,42 @@ and build_as_type_aux env p = unify_pat env p ty_res' end in Array.iter do_label lbl.lbl_all; - ty + ty, p.pat_mode | Tpat_or(p1, p2, row) -> begin match row with None -> - let ty1 = build_as_type env p1 and ty2 = build_as_type env p2 in + let ty1, mode1 = build_as_type_and_mode env p1 in + let ty2, mode2 = build_as_type_and_mode env p2 in unify_pat env {p2 with pat_type = ty2} ty1; - ty1 + ty1, Value_mode.join [mode1; mode2] | Some row -> let row = row_repr row in - newty (Tvariant{row with row_closed=false; row_more=newvar()}) + let all_constant = + List.for_all + (function + | _, (Rpresent (Some _) | Reither (false, _, _, _)) -> false + | _ -> true) + row.row_fields + in + let mode = + if all_constant then Value_mode.newvar () + else p.pat_mode + in + let ty = + newty (Tvariant{row with row_closed=false; row_more=newvar()}) + in + ty, mode end - | Tpat_any | Tpat_var _ | Tpat_constant _ - | Tpat_array _ | Tpat_lazy _ -> p.pat_type + | Tpat_constant _ -> + let mode = + if Ctype.maybe_pointer_type !env p.pat_type then p.pat_mode + else Value_mode.newvar () + in + p.pat_type, mode + | Tpat_any | Tpat_var _ + | Tpat_array _ | Tpat_lazy _ -> p.pat_type, p.pat_mode -let build_or_pat env loc lid = +let build_or_pat env loc mode lid = let path, decl = Env.lookup_type ~loc:lid.loc lid.txt env in let tyl = List.map (fun _ -> newvar()) decl.type_params in let row0 = @@ -566,7 +784,8 @@ let build_or_pat env loc lid = (l, Reither(true,[], true, ref None)) :: fields | Rpresent (Some ty) -> (l, Some {pat_desc=Tpat_any; pat_loc=Location.none; pat_env=env; - pat_type=ty; pat_extra=[]; pat_attributes=[]}) + pat_type=ty; pat_mode=mode; pat_extra=[]; + pat_attributes=[]}) :: pats, (l, Reither(false, [ty], true, ref None)) :: fields | _ -> pats, fields) @@ -582,7 +801,8 @@ let build_or_pat env loc lid = List.map (fun (l,p) -> {pat_desc=Tpat_variant(l,p,row'); pat_loc=gloc; - pat_env=env; pat_type=ty; pat_extra=[]; pat_attributes=[]}) + pat_env=env; pat_type=ty; pat_mode=mode; + pat_extra=[]; pat_attributes=[]}) pats in match pats with @@ -595,7 +815,8 @@ let build_or_pat env loc lid = List.fold_left (fun pat pat0 -> {pat_desc=Tpat_or(pat0,pat,Some row0); pat_extra=[]; - pat_loc=gloc; pat_env=env; pat_type=ty; pat_attributes=[]}) + pat_loc=gloc; pat_env=env; pat_type=ty; pat_mode=mode; + pat_attributes=[]}) pat pats in (path, rp { r with pat_loc = loc },ty) @@ -1352,22 +1573,23 @@ let as_comp_pattern does not match any value. *) let rec type_pat : type k r . k pattern_category -> no_existentials:_ -> mode:_ -> - env:_ -> _ -> _ -> (k general_pattern -> r) -> r - = fun category ~no_existentials ~mode + alloc_mode:_ -> env:_ -> _ -> _ -> (k general_pattern -> r) -> r + = fun category ~no_existentials ~mode ~alloc_mode ~env sp expected_ty k -> Builtin_attributes.warning_scope sp.ppat_attributes (fun () -> type_pat_aux category ~no_existentials ~mode - ~env sp expected_ty k + ~alloc_mode ~env sp expected_ty k ) and type_pat_aux - : type k r . k pattern_category -> no_existentials:_ -> mode:_ -> - env:_ -> _ -> _ -> (k general_pattern -> r) -> r + : type k r . k pattern_category -> no_existentials:_ -> mode:_ + -> alloc_mode:expected_pat_mode -> env:_ -> _ -> _ + -> (k general_pattern -> r) -> r = fun category ~no_existentials ~mode - ~env sp expected_ty k -> - let type_pat category ?(mode=mode) ?(env=env) = - type_pat category ~no_existentials ~mode ~env + ~alloc_mode ~env sp expected_ty k -> + let type_pat category ?(mode=mode) ?(alloc_mode=alloc_mode) ?(env=env) = + type_pat category ~no_existentials ~mode ~alloc_mode ~env in let loc = sp.ppat_loc in let refine = @@ -1397,6 +1619,7 @@ and type_pat_aux pat_desc = d; pat_loc = loc; pat_extra=[]; pat_type = instance expected_ty; + pat_mode = alloc_mode.mode; pat_attributes = sp.ppat_attributes; pat_env = !env } in @@ -1425,16 +1648,18 @@ and type_pat_aux end | Ppat_var name -> let ty = instance expected_ty in + let alloc_mode = alloc_mode in let id = (* PR#7330 *) if name.txt = "*extension*" then Ident.create_local name.txt else - enter_variable loc name ty sp.ppat_attributes + enter_variable loc name alloc_mode.mode ty sp.ppat_attributes in rvp k { pat_desc = Tpat_var (id, name); pat_loc = loc; pat_extra=[]; pat_type = ty; + pat_mode = alloc_mode.mode; pat_attributes = sp.ppat_attributes; pat_env = !env } | Ppat_unpack name -> @@ -1447,15 +1672,18 @@ and type_pat_aux pat_loc = sp.ppat_loc; pat_extra=[Tpat_unpack, name.loc, sp.ppat_attributes]; pat_type = t; + pat_mode = alloc_mode.mode; pat_attributes = []; pat_env = !env } | Some s -> let v = { name with txt = s } in - let id = enter_variable loc v t ~is_module:true sp.ppat_attributes in + let id = enter_variable loc v alloc_mode.mode + t ~is_module:true sp.ppat_attributes in rvp k { pat_desc = Tpat_var (id, v); pat_loc = sp.ppat_loc; pat_extra=[Tpat_unpack, loc, sp.ppat_attributes]; + pat_mode = alloc_mode.mode; pat_type = t; pat_attributes = []; pat_env = !env } @@ -1465,7 +1693,13 @@ and type_pat_aux ({ptyp_desc=Ptyp_poly _} as sty)) -> (* explicitly polymorphic type *) assert construction_not_used_in_counterexamples; - let cty, ty, force = Typetexp.transl_simple_type_delayed !env sty in + let type_mode = + if has_local_attr_pat sp then Alloc_mode.Local + else Alloc_mode.Global + in + let cty, ty, force = + Typetexp.transl_simple_type_delayed !env type_mode sty + in unify_pat_types ~refine lloc env ty (instance expected_ty); pattern_force := force :: !pattern_force; begin match ty.desc with @@ -1474,12 +1708,13 @@ and type_pat_aux init_def generic_level; let _, ty' = instance_poly ~keep_names:true false tyl body in end_def (); - let id = enter_variable lloc name ty' attrs in + let id = enter_variable lloc name alloc_mode.mode ty' attrs in rvp k { pat_desc = Tpat_var (id, name); pat_loc = lloc; pat_extra = [Tpat_constraint cty, loc, sp.ppat_attributes]; pat_type = ty; + pat_mode = alloc_mode.mode; pat_attributes = []; pat_env = !env } @@ -1489,16 +1724,18 @@ and type_pat_aux assert construction_not_used_in_counterexamples; type_pat Value sq expected_ty (fun q -> begin_def (); - let ty_var = build_as_type env q in + let ty_var, mode = build_as_type_and_mode env q in end_def (); generalize ty_var; let id = - enter_variable ~is_as_variable:true loc name ty_var sp.ppat_attributes + enter_variable ~is_as_variable:true loc name mode + ty_var sp.ppat_attributes in rvp k { pat_desc = Tpat_alias(q, id, name); pat_loc = loc; pat_extra=[]; pat_type = q.pat_type; + pat_mode = q.pat_mode; pat_attributes = sp.ppat_attributes; pat_env = !env }) | Ppat_constant cst -> @@ -1507,6 +1744,7 @@ and type_pat_aux pat_desc = Tpat_constant cst; pat_loc = loc; pat_extra=[]; pat_type = type_constant cst; + pat_mode = alloc_mode.mode; pat_attributes = sp.ppat_attributes; pat_env = !env } | Ppat_interval (Pconst_char c1, Pconst_char c2) -> @@ -1526,16 +1764,30 @@ and type_pat_aux | Ppat_interval _ -> raise (Error (loc, !env, Invalid_interval)) | Ppat_tuple spl -> - assert (List.length spl >= 2); - let spl_ann = List.map (fun p -> (p,newgenvar ())) spl in - let ty = newgenty (Ttuple(List.map snd spl_ann)) in + let arity = List.length spl in + assert (arity >= 2); + let arg_modes = + if List.compare_length_with alloc_mode.tuple_modes arity = 0 then + alloc_mode.tuple_modes + else + List.init arity (fun _ -> alloc_mode.mode) + in + let spl_ann = + List.map2 + (fun p mode -> (p, newgenvar (), simple_pat_mode mode)) + spl arg_modes + in + let ty = newgenty (Ttuple(List.map snd3 spl_ann)) in let expected_ty = generic_instance expected_ty in unify_pat_types ~refine loc env ty expected_ty; - map_fold_cont (fun (p,t) -> type_pat Value p t) spl_ann (fun pl -> + map_fold_cont + (fun (p,t,alloc_mode) -> type_pat Value ~alloc_mode p t) spl_ann + (fun pl -> rvp k { pat_desc = Tpat_tuple pl; pat_loc = loc; pat_extra=[]; pat_type = newty (Ttuple(List.map (fun p -> p.pat_type) pl)); + pat_mode = alloc_mode.mode; pat_attributes = sp.ppat_attributes; pat_env = !env }) | Ppat_construct(lid, sarg) -> @@ -1619,7 +1871,7 @@ and type_pat_aux if !Clflags.principal then ( let exception Warn_only_once in try - TypePairs.iter (fun (t1, t2) () -> + TypePairs.iter (fun (t1, t2) -> generalize_structure t1; generalize_structure t2; if not (fully_generic t1 && fully_generic t2) then @@ -1659,6 +1911,7 @@ and type_pat_aux pat_desc=Tpat_construct(lid, constr, args); pat_loc = loc; pat_extra=[]; pat_type = instance expected_ty; + pat_mode = alloc_mode.mode; pat_attributes = sp.ppat_attributes; pat_env = !env }) | Ppat_variant(l, sarg) -> @@ -1681,6 +1934,7 @@ and type_pat_aux pat_desc = Tpat_variant(l, arg, ref {row with row_more = newvar()}); pat_loc = loc; pat_extra=[]; pat_type = instance expected_ty; + pat_mode = alloc_mode.mode; pat_attributes = sp.ppat_attributes; pat_env = !env } in begin @@ -1713,7 +1967,14 @@ and type_pat_aux end_def (); generalize_structure ty_res; generalize_structure ty_arg; - type_pat Value sarg ty_arg (fun arg -> + let alloc_mode = + match label.lbl_global with + | Global -> Value_mode.global + | Nonlocal -> Value_mode.local_to_regional alloc_mode.mode + | Unrestricted -> alloc_mode.mode + in + let alloc_mode = simple_pat_mode alloc_mode in + type_pat Value ~alloc_mode sarg ty_arg (fun arg -> k (label_lid, label, arg)) in let make_record_pat lbl_pat_list = @@ -1722,6 +1983,7 @@ and type_pat_aux pat_desc = Tpat_record (lbl_pat_list, closed); pat_loc = loc; pat_extra=[]; pat_type = instance record_ty; + pat_mode = alloc_mode.mode; pat_attributes = sp.ppat_attributes; pat_env = !env; } @@ -1748,6 +2010,7 @@ and type_pat_aux pat_desc = Tpat_array pl; pat_loc = loc; pat_extra=[]; pat_type = instance expected_ty; + pat_mode = alloc_mode.mode; pat_attributes = sp.ppat_attributes; pat_env = !env }) | Ppat_or(sp1, sp2) -> @@ -1814,15 +2077,17 @@ and type_pat_aux | Error _, Ok p -> rp k p | Ok p1, Ok p2 -> - let alpha_env = - enter_orpat_variables loc !env p1_variables p2_variables in + let vars, alpha_env = + enter_orpat_variables loc !env p1_variables p2_variables + in let p2 = alpha_pat alpha_env p2 in - pattern_variables := p1_variables; + pattern_variables := vars; module_variables := p1_module_variables; let make_pat desc = { pat_desc = desc; pat_loc = loc; pat_extra=[]; pat_type = instance expected_ty; + pat_mode = alloc_mode.mode; pat_attributes = sp.ppat_attributes; pat_env = !env } in rp k (make_pat (Tpat_or(p1, p2, None))) @@ -1838,22 +2103,29 @@ and type_pat_aux pat_desc = Tpat_lazy p1; pat_loc = loc; pat_extra=[]; pat_type = instance expected_ty; + pat_mode = alloc_mode.mode; pat_attributes = sp.ppat_attributes; pat_env = !env }) - | Ppat_constraint(sp, sty) -> + | Ppat_constraint(sp', sty) -> (* Pretend separate = true *) begin_def(); - let cty, ty, force = Typetexp.transl_simple_type_delayed !env sty in + let type_mode = + if has_local_attr_pat sp then Alloc_mode.Local + else Alloc_mode.Global + in + let cty, ty, force = + Typetexp.transl_simple_type_delayed !env type_mode sty + in end_def(); generalize_structure ty; let ty, expected_ty' = instance ty, ty in unify_pat_types ~refine loc env ty (instance expected_ty); - type_pat category sp expected_ty' (fun p -> + type_pat category sp' expected_ty' (fun p -> (*Format.printf "%a@.%a@." Printtyp.raw_type_expr ty Printtyp.raw_type_expr p.pat_type;*) pattern_force := force :: !pattern_force; - let extra = (Tpat_constraint cty, loc, sp.ppat_attributes) in + let extra = (Tpat_constraint cty, loc, sp'.ppat_attributes) in let p : k general_pattern = match category, (p : k general_pattern) with | Value, {pat_desc = Tpat_var (id,s); _} -> @@ -1868,7 +2140,9 @@ and type_pat_aux { p with pat_type = ty; pat_extra = extra::p.pat_extra } in k p) | Ppat_type lid -> - let (path, p,ty) = build_or_pat !env loc lid in + let (path, p,ty) = + build_or_pat !env loc alloc_mode.mode lid + in unify_pat_types ~refine loc env ty (instance expected_ty); k @@ pure category @@ { p with pat_extra = (Tpat_type (path, lid), loc, sp.ppat_attributes) @@ -1883,12 +2157,14 @@ and type_pat_aux loc, sp.ppat_attributes) :: p.pat_extra } ) | Ppat_exception p -> - type_pat Value p Predef.type_exn (fun p_exn -> + let alloc_mode = simple_pat_mode Value_mode.global in + type_pat Value ~alloc_mode p Predef.type_exn (fun p_exn -> rcp k { pat_desc = Tpat_exception p_exn; pat_loc = sp.ppat_loc; pat_extra = []; pat_type = expected_ty; + pat_mode = alloc_mode.mode; pat_env = !env; pat_attributes = sp.ppat_attributes; }) @@ -1896,10 +2172,10 @@ and type_pat_aux raise (Error_forward (Builtin_attributes.error_of_extension ext)) let type_pat category ?no_existentials ?(mode=Normal) - ?(lev=get_current_level()) env sp expected_ty = + ?(lev=get_current_level()) ~alloc_mode env sp expected_ty = Misc.protect_refs [Misc.R (gadt_equations_level, Some lev)] (fun () -> type_pat category ~no_existentials ~mode - ~env sp expected_ty (fun x -> x) + ~alloc_mode ~env sp expected_ty (fun x -> x) ) (* this function is passed to Partial.parmatch @@ -1916,7 +2192,8 @@ let partial_pred ~lev ~splitting_mode ?(explode=0) } in try reset_pattern true; - let typed_p = type_pat Value ~lev ~mode env p expected_ty in + let alloc_mode = simple_pat_mode Value_mode.global in + let typed_p = type_pat Value ~lev ~mode ~alloc_mode env p expected_ty in set_state state env; (* types are invalidated but we don't need them here *) Some typed_p @@ -1947,9 +2224,9 @@ let iter_pattern_variables_type f : pattern_variable list -> unit = let add_pattern_variables ?check ?check_as env pv = List.fold_right - (fun {pv_id; pv_type; pv_loc; pv_as_var; pv_attributes} env -> + (fun {pv_id; pv_mode; pv_type; pv_loc; pv_as_var; pv_attributes} env -> let check = if pv_as_var then check_as else check in - Env.add_value ?check pv_id + Env.add_value ?check ~mode:pv_mode pv_id {val_type = pv_type; val_kind = Val_reg; Types.val_loc = pv_loc; val_attributes = pv_attributes; val_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); @@ -1957,10 +2234,10 @@ let add_pattern_variables ?check ?check_as env pv = ) pv env -let type_pattern category ~lev env spat expected_ty = +let type_pattern category ~lev ~alloc_mode env spat expected_ty = reset_pattern true; let new_env = ref env in - let pat = type_pat category ~lev new_env spat expected_ty in + let pat = type_pat category ~lev ~alloc_mode new_env spat expected_ty in let pvs = get_ref pattern_variables in let unpacks = get_ref module_variables in (pat, !new_env, get_ref pattern_force, pvs, unpacks) @@ -1970,10 +2247,11 @@ let type_pattern_list = reset_pattern allow; let new_env = ref env in - let type_pat (attrs, pat) ty = + let type_pat (attrs, pat_mode, exp_mode, pat) ty = Builtin_attributes.warning_scope ~ppwarning:false attrs (fun () -> - type_pat category ~no_existentials new_env pat ty + exp_mode, + type_pat category ~no_existentials ~alloc_mode:pat_mode new_env pat ty ) in let patl = List.map2 type_pat spatl expected_tys in @@ -1989,8 +2267,10 @@ let type_pattern_list let type_class_arg_pattern cl_num val_env met_env l spat = reset_pattern false; let nv = newvar () in + let alloc_mode = simple_pat_mode Value_mode.global in let pat = - type_pat Value ~no_existentials:In_class_args (ref val_env) spat nv in + type_pat Value ~no_existentials:In_class_args ~alloc_mode + (ref val_env) spat nv in if has_variants pat then begin Parmatch.pressure_variants val_env [pat]; finalize_variants pat; @@ -2039,8 +2319,11 @@ let type_self_pattern cl_num privty val_env met_env par_env spat = in reset_pattern false; let nv = newvar() in + let alloc_mode = simple_pat_mode Value_mode.global in let pat = - type_pat Value ~no_existentials:In_self_pattern (ref val_env) spat nv in + type_pat Value ~no_existentials:In_self_pattern + ~alloc_mode (ref val_env) spat nv + in List.iter (fun f -> f()) (get_ref pattern_force); let meths = ref Meths.empty in let vars = ref Vars.empty in @@ -2067,6 +2350,42 @@ let type_self_pattern cl_num privty val_env met_env par_env spat = in (pat, meths, vars, val_env, met_env, par_env) +type pat_tuple_arity = + | Not_local_tuple + | Maybe_local_tuple + | Local_tuple of int + +let combine_pat_tuple_arity a b = + match a, b with + | Not_local_tuple, _ -> Not_local_tuple + | _, Not_local_tuple -> Not_local_tuple + | Maybe_local_tuple, Maybe_local_tuple -> Maybe_local_tuple + | Maybe_local_tuple, Local_tuple _ -> b + | Local_tuple _, Maybe_local_tuple -> a + | Local_tuple ai, Local_tuple bi -> + if ai = bi then a + else Not_local_tuple + +let rec pat_tuple_arity spat = + match spat.ppat_desc with + | Ppat_tuple args -> Local_tuple (List.length args) + | Ppat_any | Ppat_exception _ | Ppat_var _ -> Maybe_local_tuple + | Ppat_constant _ + | Ppat_interval _ | Ppat_construct _ | Ppat_variant _ + | Ppat_record _ | Ppat_array _ | Ppat_type _ | Ppat_lazy _ + | Ppat_unpack _ | Ppat_extension _ -> Not_local_tuple + | Ppat_or(sp1, sp2) -> + combine_pat_tuple_arity (pat_tuple_arity sp1) (pat_tuple_arity sp2) + | Ppat_constraint(p, _) | Ppat_open(_, p) | Ppat_alias(p, _) -> pat_tuple_arity p + +let rec cases_tuple_arity cases = + match cases with + | [] -> Maybe_local_tuple + | { pc_lhs; _ } :: rest -> + match pat_tuple_arity pc_lhs with + | Not_local_tuple -> Not_local_tuple + | arity -> combine_pat_tuple_arity arity (cases_tuple_arity rest) + let delayed_checks = ref [] let reset_delayed_checks () = delayed_checks := [] let add_delayed_check f = @@ -2096,6 +2415,249 @@ let rec final_subexpression exp = -> final_subexpression e | _ -> exp +let is_prim ~name funct = + match funct.exp_desc with + | Texp_ident (_, _, {val_kind=Val_prim{Primitive.prim_name; _}}, Id_prim _) -> + prim_name = name + | _ -> false + +(* List labels in a function type, and whether return type is a variable *) +let rec list_labels_aux env visited ls ty_fun = + let ty = expand_head env ty_fun in + if List.memq ty visited then + List.rev ls, false + else match ty.desc with + Tarrow ((l,_,_), _, ty_res, _) -> + list_labels_aux env (ty::visited) (l::ls) ty_res + | _ -> + List.rev ls, is_Tvar ty + +let list_labels env ty = + wrap_trace_gadt_instances env (list_labels_aux env [] []) ty + +(* Collecting arguments for function applications *) + +type untyped_apply_arg = + | Known_arg of + { sarg : Parsetree.expression; + ty_arg : type_expr; + ty_arg0 : type_expr; + mode_arg : Alloc_mode.t; + wrapped_in_some : bool; } + | Unknown_arg of + { sarg : Parsetree.expression; + ty_arg : type_expr; + mode_arg : Alloc_mode.t; } + | Eliminated_optional_arg of + { mode_fun: Alloc_mode.t; + ty_arg : type_expr; + mode_arg : Alloc_mode.t; + level: int;} + +type untyped_omitted_param = + { mode_fun: Alloc_mode.t; + ty_arg : type_expr; + mode_arg : Alloc_mode.t; + level: int; } + +let is_partial_apply args = + List.exists + (fun (_, arg) -> + match arg with + | Omitted _ -> true + | Arg _ -> false) + args + +let remaining_function_type ty_ret mode_ret rev_args = + let ty_ret, _, _ = + List.fold_left + (fun (ty_ret, mode_ret, closed_args) (lbl, arg) -> + match arg with + | Arg (Unknown_arg { mode_arg; _ } | Known_arg { mode_arg; _ }) -> + let closed_args = mode_arg :: closed_args in + (ty_ret, mode_ret, closed_args) + | Arg (Eliminated_optional_arg { mode_fun; ty_arg; mode_arg; level }) + | Omitted { mode_fun; ty_arg; mode_arg; level } -> + let ty_ret = + newty2 level + (Tarrow ((lbl, mode_arg, mode_ret), ty_arg, ty_ret, Cok)) + in + let mode_ret = + Alloc_mode.join (mode_fun :: closed_args) + in + (ty_ret, mode_ret, closed_args)) + (ty_ret, mode_ret, []) rev_args + in + ty_ret + +let collect_unknown_apply_args env funct ty_fun mode_fun rev_args sargs = + let labels_match ~param ~arg = + param = arg + || !Clflags.classic && arg = Nolabel && not (is_optional param) + in + let has_label l ty_fun = + let ls, tvar = list_labels env ty_fun in + tvar || List.mem l ls + in + let rec loop ty_fun mode_fun rev_args sargs = + match sargs with + | [] -> ty_fun, mode_fun, List.rev rev_args + | (lbl, sarg) :: rest -> + let (mode_arg, ty_arg, mode_res, ty_res) = + let ty_fun = expand_head env ty_fun in + match ty_fun.desc with + | Tvar _ -> + let ty_arg = newvar () in + let ty_res = newvar () in + if ty_fun.level >= ty_arg.level && + not (is_prim ~name:"%identity" funct) + then + Location.prerr_warning sarg.pexp_loc + Warnings.Ignored_extra_argument; + let mode_arg = Alloc_mode.newvar () in + let mode_res = Alloc_mode.newvar () in + let kind = (lbl, mode_arg, mode_res) in + unify env ty_fun + (newty (Tarrow(kind,ty_arg,ty_res,Clink(ref Cunknown)))); + (mode_arg, ty_arg, mode_res, ty_res) + | Tarrow ((l, mode_arg, mode_res), ty_arg, ty_res, _) + when labels_match ~param:l ~arg:lbl -> + (mode_arg, ty_arg, mode_res, ty_res) + | td -> + let ty_fun = match td with Tarrow _ -> newty td | _ -> ty_fun in + let ty_res = remaining_function_type ty_fun mode_fun rev_args in + match ty_res.desc with + | Tarrow _ -> + if !Clflags.classic || not (has_label lbl ty_fun) then + raise (Error(sarg.pexp_loc, env, + Apply_wrong_label(lbl, ty_res, false))) + else + raise (Error(funct.exp_loc, env, Incoherent_label_order)) + | _ -> + raise(Error(funct.exp_loc, env, Apply_non_function + (expand_head env funct.exp_type))) + in + let arg = Unknown_arg { sarg; ty_arg; mode_arg } in + loop ty_res mode_res ((lbl, Arg arg) :: rev_args) rest + in + loop ty_fun mode_fun rev_args sargs + +let collect_apply_args env funct ignore_labels ty_fun ty_fun0 mode_fun sargs = + let warned = ref false in + let rec loop ty_fun ty_fun0 mode_fun rev_args sargs = + match expand_head env ty_fun, expand_head env ty_fun0 with + | {desc=Tarrow (ad, ty_arg, ty_ret, com); level=lv} as ty_fun', + {desc=Tarrow (_, ty_arg0, ty_ret0, _)} + when sargs <> [] && commu_repr com = Cok -> + let (l, mode_arg, mode_ret) = ad in + let may_warn loc w = + if not !warned && !Clflags.principal && lv <> generic_level + then begin + warned := true; + Location.prerr_warning loc w + end + in + let name = label_name l + and optional = is_optional l in + let use_arg sarg l' = + let wrapped_in_some = optional && not (is_optional l') in + if wrapped_in_some then + may_warn sarg.pexp_loc + (Warnings.Not_principal "using an optional argument here"); + Arg (Known_arg { sarg; ty_arg; ty_arg0; mode_arg; wrapped_in_some }) + in + let eliminate_optional_arg () = + may_warn funct.exp_loc + (Warnings.Non_principal_labels "eliminated optional argument"); + Arg + (Eliminated_optional_arg + { mode_fun; ty_arg; mode_arg; level = lv }) + in + let remaining_sargs, arg = + if ignore_labels then begin + (* No reordering is allowed, process arguments in order *) + match sargs with + | [] -> assert false + | (l', sarg) :: remaining_sargs -> + if name = label_name l' || (not optional && l' = Nolabel) then + (remaining_sargs, use_arg sarg l') + else if + optional && + not (List.exists (fun (l, _) -> name = label_name l) + remaining_sargs) && + List.exists (function (Nolabel, _) -> true | _ -> false) + sargs + then + (sargs, eliminate_optional_arg ()) + else + raise(Error(sarg.pexp_loc, env, + Apply_wrong_label(l', ty_fun', optional))) + end else + (* Arguments can be commuted, try to fetch the argument + corresponding to the first parameter. *) + match extract_label name sargs with + | Some (l', sarg, commuted, remaining_sargs) -> + if commuted then begin + may_warn sarg.pexp_loc + (Warnings.Not_principal "commuting this argument") + end; + if not optional && is_optional l' then + Location.prerr_warning sarg.pexp_loc + (Warnings.Nonoptional_label (Printtyp.string_of_label l)); + remaining_sargs, use_arg sarg l' + | None -> + sargs, + if optional && List.mem_assoc Nolabel sargs then + eliminate_optional_arg () + else begin + (* No argument was given for this parameter, we abstract over + it. *) + may_warn funct.exp_loc + (Warnings.Non_principal_labels "commuted an argument"); + Omitted { mode_fun; ty_arg; mode_arg; level = lv } + end + in + loop ty_ret ty_ret0 mode_ret ((l, arg) :: rev_args) remaining_sargs + | _ -> + (* We're not looking at a *known* function type anymore, or there are no + arguments left. *) + collect_unknown_apply_args env funct ty_fun0 mode_fun rev_args sargs + in + loop ty_fun ty_fun0 mode_fun [] sargs + +let type_omitted_parameters expected_mode env ty_ret mode_ret args = + let ty_ret, mode_ret, _, _, args = + List.fold_left + (fun (ty_ret, mode_ret, open_args, closed_args, args) (lbl, arg) -> + match arg with + | Arg exp as arg -> + let open_args = (exp.exp_mode, exp) :: open_args in + let args = (lbl, arg) :: args in + (ty_ret, mode_ret, open_args, closed_args, args) + | Omitted { mode_fun; ty_arg; mode_arg; level } -> + let ty_ret = + newty2 level + (Tarrow ((lbl, mode_arg, mode_ret), ty_arg, ty_ret, Cok)) + in + let new_closed_args = + List.map + (fun (marg, exp) -> + submode ~loc:exp.exp_loc ~env + marg (mode_partial_application expected_mode); + Value_mode.regional_to_local_alloc marg) + open_args + in + let closed_args = new_closed_args @ closed_args in + let open_args = [] in + let mode_closure = Alloc_mode.join (mode_fun :: closed_args) in + register_allocation_mode mode_closure; + let arg = Omitted { mode_closure; mode_arg; mode_ret } in + let args = (lbl, arg) :: args in + (ty_ret, mode_closure, open_args, closed_args, args)) + (ty_ret, mode_ret, [], [], []) (List.rev args) + in + ty_ret, mode_ret, args + (* Generalization criterion for expressions *) let rec is_nonexpansive exp = @@ -2109,8 +2671,8 @@ let rec is_nonexpansive exp = | Texp_let(_rec_flag, pat_exp_list, body) -> List.for_all (fun vb -> is_nonexpansive vb.vb_expr) pat_exp_list && is_nonexpansive body - | Texp_apply(e, (_,None)::el) -> - is_nonexpansive e && List.for_all is_nonexpansive_opt (List.map snd el) + | Texp_apply(e, (_,Omitted _)::el, _) -> + is_nonexpansive e && List.for_all is_nonexpansive_arg (List.map snd el) | Texp_match(e, cases, _) -> (* Not sure this is necessary, if [e] is nonexpansive then we shouldn't care if there are exception patterns. But the previous version enforced @@ -2146,7 +2708,7 @@ let rec is_nonexpansive exp = | Texp_ifthenelse(_cond, ifso, ifnot) -> is_nonexpansive ifso && is_nonexpansive_opt ifnot | Texp_sequence (_e1, e2) -> is_nonexpansive e2 (* PR#4354 *) - | Texp_new (_, _, cl_decl) -> Ctype.class_type_arity cl_decl.cty_type > 0 + | Texp_new (_, _, cl_decl, _) -> Ctype.class_type_arity cl_decl.cty_type > 0 (* Note: nonexpansive only means no _observable_ side effects *) | Texp_lazy e -> is_nonexpansive e | Texp_object ({cstr_fields=fields; cstr_type = { csig_vars=vars}}, _) -> @@ -2180,8 +2742,9 @@ let rec is_nonexpansive exp = | Texp_apply ( { exp_desc = Texp_ident (_, _, {val_kind = Val_prim {Primitive.prim_name = - ("%raise" | "%reraise" | "%raise_notrace")}}) }, - [Nolabel, Some e]) -> + ("%raise" | "%reraise" | "%raise_notrace")}}, + Id_prim _) }, + [Nolabel, Arg e], _) -> is_nonexpansive e | Texp_array (_ :: _) | Texp_apply _ @@ -2238,6 +2801,10 @@ and is_nonexpansive_opt = function | None -> true | Some e -> is_nonexpansive e +and is_nonexpansive_arg = function + | Omitted _ -> true + | Arg e -> is_nonexpansive e + let maybe_expansive e = not (is_nonexpansive e) let check_recursive_bindings env valbinds = @@ -2256,18 +2823,95 @@ let check_recursive_class_bindings env ids exprs = raise(Error(expr.cl_loc, env, Illegal_class_expr))) exprs -let is_prim ~name funct = - match funct.exp_desc with - | Texp_ident (_, _, {val_kind=Val_prim{Primitive.prim_name; _}}) -> - prim_name = name - | _ -> false +(* Is the return value annotated with "local_" *) +let is_local_returning_expr e = + let combine (local1, loc1) (local2, loc2) = + match local1, local2 with + | true, true -> true, loc1 + | false, false -> false, loc1 + | false, true -> + raise(Error(loc1, Env.empty, Local_return_annotation_mismatch loc2)) + | true, false -> + raise(Error(loc2, Env.empty, Local_return_annotation_mismatch loc1)) + in + let rec loop e = + match e.pexp_desc with + | Pexp_apply + ({ pexp_desc = Pexp_extension({txt = "extension.local"}, PStr []) }, + [Nolabel, _]) -> + true, e.pexp_loc + | Pexp_ident _ | Pexp_constant _ | Pexp_apply _ | Pexp_tuple _ + | Pexp_construct _ | Pexp_variant _ | Pexp_record _ | Pexp_field _ + | Pexp_setfield _ | Pexp_array _ | Pexp_while _ | Pexp_for _ | Pexp_send _ + | Pexp_new _ | Pexp_setinstvar _ | Pexp_override _ | Pexp_assert _ + | Pexp_lazy _ | Pexp_object _ | Pexp_pack _ | Pexp_function _ | Pexp_fun _ + | Pexp_letop _ | Pexp_extension _ | Pexp_unreachable -> + false, e.pexp_loc + | Pexp_let(_, _, e) | Pexp_sequence(_, e) | Pexp_constraint(e, _) + | Pexp_coerce(e, _, _) | Pexp_letmodule(_, _, e) | Pexp_letexception(_, e) + | Pexp_poly(e, _) | Pexp_newtype(_, e) | Pexp_open(_, e) + | Pexp_ifthenelse(_, e, None)-> + loop e + | Pexp_ifthenelse(_, e1, Some e2)-> combine (loop e1) (loop e2) + | Pexp_match(_, cases) -> begin + match cases with + | [] -> false, e.pexp_loc + | first :: rest -> + List.fold_left + (fun acc pc -> combine acc (loop pc.pc_rhs)) + (loop first.pc_rhs) rest + end + | Pexp_try(e, cases) -> + List.fold_left + (fun acc pc -> combine acc (loop pc.pc_rhs)) + (loop e) cases + in + let local, _ = loop e in + local + +let rec is_an_uncurried_function e = + if Builtin_attributes.has_curry e.pexp_attributes then false + else begin + match e.pexp_desc, e.pexp_attributes with + | (Pexp_fun _ | Pexp_function _), _ -> true + | Pexp_constraint (e, _), _ -> is_an_uncurried_function e + | Pexp_let (Nonrecursive, _, e), + [{Parsetree.attr_name = {txt="#default"};_}] -> + is_an_uncurried_function e + | _ -> false + end + +let is_local_returning_function cases = + let rec loop_cases cases = + match cases with + | [{pc_lhs = _; pc_guard = None; pc_rhs = e}] -> + loop_body e + | cases -> + List.for_all (fun case -> is_local_returning_expr case.pc_rhs) cases + and loop_body e = + if Builtin_attributes.has_curry e.pexp_attributes then + is_local_returning_expr e + else begin + match e.pexp_desc, e.pexp_attributes with + | Pexp_fun(_, _, _, e), _ -> loop_body e + | Pexp_function cases, _ -> loop_cases cases + | Pexp_constraint (e, _), _ -> loop_body e + | Pexp_let (Nonrecursive, _, e), + [{Parsetree.attr_name = {txt="#default"};_}] -> loop_body e + | _ -> is_local_returning_expr e + end + in + loop_cases cases + (* Approximate the type of an expression, for better recursion *) let rec approx_type env sty = match sty.ptyp_desc with Ptyp_arrow (p, _, sty) -> let ty1 = if is_optional p then type_option (newvar ()) else newvar () in - newty (Tarrow (p, ty1, approx_type env sty, Cok)) + let ret = approx_type env sty in + let marg = Alloc_mode.newvar () and mret = Alloc_mode.newvar () in + newty (Tarrow ((p,marg,mret), ty1, ret, Cok)) | Ptyp_tuple args -> newty (Ttuple (List.map (approx_type env) args)) | Ptyp_constr (lid, ctl) -> @@ -2284,11 +2928,19 @@ let rec approx_type env sty = let rec type_approx env sexp = match sexp.pexp_desc with Pexp_let (_, _, e) -> type_approx env e - | Pexp_fun (p, _, _, e) -> + | Pexp_fun (p, _, spat, e) -> + let marg = + if has_local_attr_pat spat then Alloc_mode.local + else Alloc_mode.newvar () + in + let mret = Alloc_mode.newvar () in let ty = if is_optional p then type_option (newvar ()) else newvar () in - newty (Tarrow(p, ty, type_approx env e, Cok)) + let ret = type_approx env e in + newty (Tarrow((p,marg,mret), ty, ret, Cok)) | Pexp_function ({pc_rhs=e}::_) -> - newty (Tarrow(Nolabel, newvar (), type_approx env e, Cok)) + let ret = type_approx env e in + let marg = Alloc_mode.newvar () and mret = Alloc_mode.newvar () in + newty (Tarrow((Nolabel,marg,mret), newvar (), ret, Cok)) | Pexp_match (_, {pc_rhs=e}::_) -> type_approx env e | Pexp_try (e, _) -> type_approx env e | Pexp_tuple l -> newty (Ttuple(List.map (type_approx env) l)) @@ -2313,22 +2965,16 @@ let rec type_approx env sexp = raise(Error(sexp.pexp_loc, env, Expr_type_clash (trace, None, None))) end; ty2 + | Pexp_apply + ({ pexp_desc = Pexp_extension({txt = "extension.local"}, PStr []) }, + [Nolabel, e]) -> + type_approx env e + | Pexp_apply + ({ pexp_desc = Pexp_extension({txt = "extension.escape"}, PStr []) }, + [Nolabel, e]) -> + type_approx env e | _ -> newvar () -(* List labels in a function type, and whether return type is a variable *) -let rec list_labels_aux env visited ls ty_fun = - let ty = expand_head env ty_fun in - if List.memq ty visited then - List.rev ls, false - else match ty.desc with - Tarrow (l, _, ty_res, _) -> - list_labels_aux env (ty::visited) (l::ls) ty_res - | _ -> - List.rev ls, is_Tvar ty - -let list_labels env ty = - wrap_trace_gadt_instances env (list_labels_aux env [] []) ty - (* Check that all univars are safe in a type. Both exp.exp_type and ty_expected should already be generalized. *) let check_univars env kind exp ty_expected vars = @@ -2448,8 +3094,12 @@ let self_coercion = ref ([] : (Path.t * Location.t list ref) list) (* Helpers for packaged modules. *) let create_package_type loc env (p, l) = let s = !Typetexp.transl_modtype_longident loc env p in - let fields = List.map (fun (name, ct) -> - name, Typetexp.transl_simple_type env false ct) l in + let fields = + List.map + (fun (name, ct) -> + name, Typetexp.transl_simple_type env false Global ct) + l + in let ty = newty (Tpackage (s, List.map fst l, List.map (fun (_, cty) -> cty.ctyp_type) fields)) @@ -2589,9 +3239,20 @@ let unify_exp env exp expected_ty = with Error(loc, env, Expr_type_clash(trace, tfc, None)) -> raise (Error(loc, env, Expr_type_clash(trace, tfc, Some exp.exp_desc))) -let rec type_exp ?recarg env sexp = +(* If [is_inferred e] is true, [e] will be typechecked without using + the "expected type" provided by the context. *) + +let rec is_inferred sexp = + match sexp.pexp_desc with + | Pexp_ident _ | Pexp_apply _ | Pexp_field _ | Pexp_constraint _ + | Pexp_coerce _ | Pexp_send _ | Pexp_new _ -> true + | Pexp_sequence (_, e) | Pexp_open (_, e) -> is_inferred e + | Pexp_ifthenelse (_, e1, Some e2) -> is_inferred e1 && is_inferred e2 + | _ -> false + +let rec type_exp ?recarg env expected_mode sexp = (* We now delegate everything to type_expect *) - type_expect ?recarg env sexp (mk_expected (newvar ())) + type_expect ?recarg env expected_mode sexp (mk_expected (newvar ())) (* Typing of an expression with an expected type. This provide better error messages, and allows controlled @@ -2599,12 +3260,14 @@ let rec type_exp ?recarg env sexp = In the principal case, [type_expected'] may be at generic_level. *) -and type_expect ?in_function ?recarg env sexp ty_expected_explained = +and type_expect ?in_function ?recarg env + (expected_mode : expected_mode) sexp ty_expected_explained = let previous_saved_types = Cmt_format.get_saved_types () in let exp = Builtin_attributes.warning_scope sexp.pexp_attributes (fun () -> - type_expect_ ?in_function ?recarg env sexp ty_expected_explained + type_expect_ ?in_function ?recarg env + expected_mode sexp ty_expected_explained ) in Cmt_format.set_saved_types @@ -2623,7 +3286,7 @@ and with_explanation explanation f = and type_expect_ ?in_function ?(recarg=Rejected) - env sexp ty_expected_explained = + env (expected_mode : expected_mode) sexp ty_expected_explained = let { ty = ty_expected; explanation } = ty_expected_explained in let loc = sexp.pexp_loc in (* Record the expression type before unifying it with the expected type *) @@ -2635,7 +3298,7 @@ and type_expect_ in match sexp.pexp_desc with | Pexp_ident lid -> - let path, desc = type_ident env ~recarg lid in + let path, desc, kind = type_ident env expected_mode ~recarg lid in let exp_desc = match desc.val_kind with | Val_ivar (_, cl_num) -> @@ -2651,16 +3314,18 @@ and type_expect_ let (path, _) = Env.find_value_by_name (Longident.Lident ("self-" ^ cl_num)) env in - Texp_ident(path, lid, desc) + Texp_ident(path, lid, desc, kind) | _ -> - Texp_ident(path, lid, desc) + Texp_ident(path, lid, desc, kind) in rue { exp_desc; exp_loc = loc; exp_extra = []; - exp_type = instance desc.val_type; + exp_type = desc.val_type; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } - | Pexp_constant(Pconst_string (str, _, _) as cst) -> ( + | Pexp_constant(Pconst_string (str, _, _) as cst) -> + register_allocation expected_mode; let cst = constant_or_raise env loc cst in (* Terrible hack for format strings *) let ty_exp = expand_head env ty_expected in @@ -2676,31 +3341,34 @@ and type_expect_ true | _ -> false in - if is_format then + if is_format then begin let format_parsetree = { (type_format loc str env) with pexp_loc = sexp.pexp_loc } in - type_expect ?in_function env format_parsetree ty_expected_explained - else + type_expect ?in_function env expected_mode + format_parsetree ty_expected_explained + end else begin rue { exp_desc = Texp_constant cst; exp_loc = loc; exp_extra = []; exp_type = instance Predef.type_string; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } - ) + end | Pexp_constant cst -> let cst = constant_or_raise env loc cst in rue { exp_desc = Texp_constant cst; exp_loc = loc; exp_extra = []; exp_type = type_constant cst; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_let(Nonrecursive, [{pvb_pat=spat; pvb_expr=sval; pvb_attributes=[]}], sbody) when may_contain_gadts spat -> (* TODO: allow non-empty attributes? *) - type_expect ?in_function env + type_expect ?in_function env expected_mode {sexp with pexp_desc = Pexp_match (sval, [Ast_helper.Exp.case spat sbody])} ty_expected_explained @@ -2711,7 +3379,14 @@ and type_expect_ else With_attributes in let (pat_exp_list, new_env, unpacks) = type_let existential_context env rec_flag spat_sexp_list true in - let body = type_unpacks new_env unpacks sbody ty_expected_explained in + let in_function = + match sexp.pexp_attributes with + | [{Parsetree.attr_name = {txt="#default"};_}] -> in_function + | _ -> None + in + let body = + type_unpacks ?in_function + new_env expected_mode unpacks sbody ty_expected_explained in let () = if rec_flag = Recursive then check_recursive_bindings env pat_exp_list @@ -2720,12 +3395,16 @@ and type_expect_ exp_desc = Texp_let(rec_flag, pat_exp_list, body); exp_loc = loc; exp_extra = []; exp_type = body.exp_type; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_fun (l, Some default, spat, sbody) -> assert(is_optional l); (* default allowed only with optional argument *) let open Ast_helper in let default_loc = default.pexp_loc in + (* Defaults are always global. They can be moved out of the function's + region by Simplf.split_default_wrapper, or they could be evaluated + later than expected by Translcore.push_defaults *) let scases = [ Exp.case (Pat.construct ~loc:default_loc @@ -2737,7 +3416,8 @@ and type_expect_ (Pat.construct ~loc:default_loc (mknoloc (Longident.(Ldot (Lident "*predef*", "None")))) None) - default; + (Exp.apply (Exp.extension (mknoloc "extension.escape", PStr [])) + [Nolabel, default]); ] in let sloc = @@ -2756,43 +3436,103 @@ and type_expect_ ~attrs:[Attr.mk (mknoloc "#default") (PStr [])] [Vb.mk spat smatch] sbody in + let has_local = has_local_attr_pat spat in type_function ?in_function loc sexp.pexp_attributes env - ty_expected_explained l [Exp.case pat body] + expected_mode ty_expected_explained + l has_local [Exp.case pat body] | Pexp_fun (l, None, spat, sbody) -> + let has_local = has_local_attr_pat spat in type_function ?in_function loc sexp.pexp_attributes env - ty_expected_explained l [Ast_helper.Exp.case spat sbody] + expected_mode ty_expected_explained l has_local + [Ast_helper.Exp.case spat sbody] | Pexp_function caselist -> type_function ?in_function - loc sexp.pexp_attributes env ty_expected_explained Nolabel caselist + loc sexp.pexp_attributes env expected_mode + ty_expected_explained Nolabel false caselist + | Pexp_apply + ({ pexp_desc = Pexp_extension({txt = "extension.local"}, PStr []) }, + [Nolabel, sbody]) -> + submode ~loc ~env Value_mode.local expected_mode; + let exp = + type_expect ?in_function ~recarg env mode_local sbody + ty_expected_explained + in + { exp with exp_loc = loc } + | Pexp_apply + ({ pexp_desc = Pexp_extension({txt = "extension.escape"}, PStr []) }, + [Nolabel, sbody]) -> + let exp = + type_expect ?in_function ~recarg env mode_global sbody + ty_expected_explained + in + { exp with exp_loc = loc } | Pexp_apply(sfunct, sargs) -> assert (sargs <> []); - begin_def (); (* one more level for non-returning functions *) - if !Clflags.principal then begin_def (); - let funct = type_exp env sfunct in - if !Clflags.principal then begin - end_def (); - generalize_structure funct.exp_type - end; + let funct_mode, funct_expected_mode = + match expected_mode.position with + | Tail -> + let mode = Value_mode.local_to_regional (Value_mode.newvar ()) in + mode, mode_tailcall_function mode + | Nontail -> + let mode = Value_mode.newvar () in + mode, mode_nontail mode + in let rec lower_args seen ty_fun = let ty = expand_head env ty_fun in if List.memq ty seen then () else - match ty.desc with - Tarrow (_l, ty_arg, ty_fun, _com) -> - (try unify_var env (newvar()) ty_arg with Unify _ -> assert false); - lower_args (ty::seen) ty_fun - | _ -> () + match ty.desc with + Tarrow (_l, ty_arg, ty_fun, _com) -> + (try unify_var env (newvar()) ty_arg + with Unify _ -> assert false); + lower_args (ty::seen) ty_fun + | _ -> () + in + let type_sfunct sfunct = + begin_def (); (* one more level for non-returning functions *) + if !Clflags.principal then begin_def (); + let funct = type_exp env funct_expected_mode sfunct in + if !Clflags.principal then begin + end_def (); + generalize_structure funct.exp_type + end; + let ty = instance funct.exp_type in + end_def (); + wrap_trace_gadt_instances env (lower_args []) ty; + funct + in + let type_sfunct_args sfunct extra_args = + match sfunct.pexp_desc with + | Pexp_apply (sfunct, args) -> + type_sfunct sfunct, args @ extra_args + | _ -> + type_sfunct sfunct, extra_args + in + let funct, sargs = + let funct = type_sfunct sfunct in + match funct.exp_desc, sargs with + | Texp_ident (_, _, {val_kind = Val_prim {prim_name = "%revapply"}}, + Id_prim _), + [Nolabel, sarg; Nolabel, actual_sfunct] + when is_inferred actual_sfunct -> + type_sfunct_args actual_sfunct [Nolabel, sarg] + | Texp_ident (_, _, {val_kind = Val_prim {prim_name = "%apply"}}, + Id_prim _), + [Nolabel, actual_sfunct; Nolabel, sarg] -> + type_sfunct_args actual_sfunct [Nolabel, sarg] + | _ -> + funct, sargs in - let ty = instance funct.exp_type in - end_def (); - wrap_trace_gadt_instances env (lower_args []) ty; begin_def (); - let (args, ty_res) = type_application env funct sargs in + let (args, ty_res, position) = + type_application env loc expected_mode funct funct_mode sargs + in end_def (); unify_var env (newvar()) funct.exp_type; let exp = - { exp_desc = Texp_apply(funct, args); + { exp_desc = Texp_apply(funct, args, position); exp_loc = loc; exp_extra = []; exp_type = ty_res; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } in begin @@ -2802,53 +3542,88 @@ and type_expect_ check_partial_application false exp) end | Pexp_match(sarg, caselist) -> + let arg_pat_mode, arg_expected_mode = + match cases_tuple_arity caselist with + | Not_local_tuple | Maybe_local_tuple -> + let mode = Value_mode.newvar () in + simple_pat_mode mode, mode_nontail mode + | Local_tuple arity -> + let modes = List.init arity (fun _ -> Value_mode.newvar ()) in + let mode = Value_mode.regional_to_local (Value_mode.join modes) in + tuple_pat_mode mode modes, mode_tuple mode modes + in begin_def (); - let arg = type_exp env sarg in + let arg = type_exp env arg_expected_mode sarg in end_def (); if maybe_expansive arg then lower_contravariant env arg.exp_type; generalize arg.exp_type; let cases, partial = - type_cases Computation env + type_cases Computation env arg_pat_mode expected_mode arg.exp_type ty_expected_explained true loc caselist in re { exp_desc = Texp_match(arg, cases, partial); exp_loc = loc; exp_extra = []; exp_type = instance ty_expected; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_try(sbody, caselist) -> - let body = type_expect env sbody ty_expected_explained in + let body = + type_expect env (mode_trywith expected_mode) + sbody ty_expected_explained + in + let arg_mode = simple_pat_mode Value_mode.global in let cases, _ = - type_cases Value env + type_cases Value env arg_mode expected_mode Predef.type_exn ty_expected_explained false loc caselist in re { exp_desc = Texp_try(body, cases); exp_loc = loc; exp_extra = []; exp_type = body.exp_type; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_tuple sexpl -> - assert (List.length sexpl >= 2); + let arity = List.length sexpl in + assert (arity >= 2); + register_allocation expected_mode; let subtypes = List.map (fun _ -> newgenvar ()) sexpl in let to_unify = newgenty (Ttuple subtypes) in with_explanation (fun () -> unify_exp_types loc env to_unify (generic_instance ty_expected)); + let argument_modes = + if List.compare_length_with expected_mode.tuple_modes arity = 0 then + expected_mode.tuple_modes + else begin + let arg_mode = Value_mode.regional_to_global expected_mode.mode in + List.init arity (fun _ -> arg_mode) + end + in + let types_and_modes = List.combine subtypes argument_modes in let expl = - List.map2 (fun body ty -> type_expect env body (mk_expected ty)) - sexpl subtypes + List.map2 + (fun body (ty, argument_mode) -> + type_expect env (mode_nontail argument_mode) + body (mk_expected ty)) + sexpl types_and_modes in re { exp_desc = Texp_tuple expl; exp_loc = loc; exp_extra = []; (* Keep sharing *) exp_type = newty (Ttuple (List.map (fun e -> e.exp_type) expl)); + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_construct(lid, sarg) -> - type_construct env loc lid sarg ty_expected_explained sexp.pexp_attributes + type_construct env expected_mode loc lid + sarg ty_expected_explained sexp.pexp_attributes | Pexp_variant(l, sarg) -> (* Keep sharing *) + if sarg <> None then + register_allocation expected_mode; let ty_expected0 = instance ty_expected in + let argument_mode = mode_subcomponent expected_mode in begin try match sarg, expand_head env ty_expected, expand_head env ty_expected0 with | Some sarg, {desc = Tvariant row}, {desc = Tvariant row0} -> @@ -2856,17 +3631,18 @@ and type_expect_ begin match row_field_repr (List.assoc l row.row_fields), row_field_repr (List.assoc l row0.row_fields) with Rpresent (Some ty), Rpresent (Some ty0) -> - let arg = type_argument env sarg ty ty0 in + let arg = type_argument env argument_mode sarg ty ty0 in re { exp_desc = Texp_variant(l, Some arg); exp_loc = loc; exp_extra = []; exp_type = ty_expected0; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | _ -> raise Not_found end | _ -> raise Not_found with Not_found -> - let arg = Option.map (type_exp env) sarg in + let arg = Option.map (type_exp env argument_mode) sarg in let arg_type = Option.map (fun arg -> arg.exp_type) arg in rue { exp_desc = Texp_variant(l, arg); @@ -2877,17 +3653,20 @@ and type_expect_ row_closed = false; row_fixed = None; row_name = None}); + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } end | Pexp_record(lid_sexp_list, opt_sexp) -> assert (lid_sexp_list <> []); + register_allocation expected_mode; let opt_exp = match opt_sexp with None -> None | Some sexp -> if !Clflags.principal then begin_def (); - let exp = type_exp ~recarg env sexp in + (* TODO: mode can be more relaxed than this if fields are nonlocal *) + let exp = type_exp ~recarg env (mode_subcomponent expected_mode) sexp in if !Clflags.principal then begin end_def (); generalize_structure exp.exp_type @@ -2926,11 +3705,13 @@ and type_expect_ | _ -> ty_expected, opath in let closed = (opt_sexp = None) in + let rmode = Value_mode.regional_to_global expected_mode.mode in let lbl_exp_list = wrap_disambiguate "This record expression is expected to have" (mk_expected ty_record) (type_label_a_list loc closed env - (fun e k -> k (type_label_exp true env loc ty_record e)) + (fun e k -> + k (type_label_exp true env rmode loc ty_record e)) expected_type lid_sexp_list) (fun x -> x) in @@ -3019,25 +3800,34 @@ and type_expect_ }; exp_loc = loc; exp_extra = []; exp_type = instance ty_expected; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_field(srecord, lid) -> - let (record, label, _) = type_label_access env srecord lid in + let (record, rmode, label, _) = type_label_access env srecord lid in + let mode = + match label.lbl_global with + | Global -> Value_mode.global + | Nonlocal -> Value_mode.local_to_regional rmode + | Unrestricted -> rmode + in + submode ~loc ~env mode expected_mode; let (_, ty_arg, ty_res) = instance_label false label in unify_exp env record ty_res; rue { exp_desc = Texp_field(record, lid, label); exp_loc = loc; exp_extra = []; exp_type = ty_arg; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_setfield(srecord, lid, snewval) -> - let (record, label, expected_type) = + let (record, rmode, label, expected_type) = type_label_access env srecord lid in let ty_record = if expected_type = None then newvar () else record.exp_type in let (label_loc, label, newval) = - type_label_exp false env loc ty_record (lid, label, snewval) in + type_label_exp false env rmode loc ty_record (lid, label, snewval) in unify_exp env record ty_record; if label.lbl_mut = Immutable then raise(Error(loc, env, Label_not_mutable lid.txt)); @@ -3045,93 +3835,129 @@ and type_expect_ exp_desc = Texp_setfield(record, label_loc, label, newval); exp_loc = loc; exp_extra = []; exp_type = instance Predef.type_unit; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_array(sargl) -> + register_allocation expected_mode; let ty = newgenvar() in let to_unify = Predef.type_array ty in with_explanation (fun () -> unify_exp_types loc env to_unify (generic_instance ty_expected)); + let argument_mode = mode_subcomponent expected_mode in let argl = - List.map (fun sarg -> type_expect env sarg (mk_expected ty)) sargl in + List.map + (fun sarg -> type_expect env argument_mode sarg (mk_expected ty)) + sargl + in re { exp_desc = Texp_array argl; exp_loc = loc; exp_extra = []; exp_type = instance ty_expected; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_ifthenelse(scond, sifso, sifnot) -> - let cond = type_expect env scond - (mk_expected ~explanation:If_conditional Predef.type_bool) in + let cond = + type_expect env (mode_var ()) scond + (mk_expected ~explanation:If_conditional Predef.type_bool) + in begin match sifnot with None -> - let ifso = type_expect env sifso + let ifso = + type_expect env (mode_var ()) sifso (mk_expected ~explanation:If_no_else_branch Predef.type_unit) in rue { exp_desc = Texp_ifthenelse(cond, ifso, None); exp_loc = loc; exp_extra = []; exp_type = ifso.exp_type; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Some sifnot -> - let ifso = type_expect env sifso ty_expected_explained in - let ifnot = type_expect env sifnot ty_expected_explained in + let ifso = + type_expect env expected_mode sifso ty_expected_explained + in + let ifnot = + type_expect env expected_mode sifnot ty_expected_explained + in (* Keep sharing *) unify_exp env ifnot ifso.exp_type; re { exp_desc = Texp_ifthenelse(cond, ifso, Some ifnot); exp_loc = loc; exp_extra = []; exp_type = ifso.exp_type; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } end | Pexp_sequence(sexp1, sexp2) -> let exp1 = type_statement ~explanation:Sequence_left_hand_side env sexp1 in - let exp2 = type_expect env sexp2 ty_expected_explained in + let exp2 = type_expect env expected_mode sexp2 ty_expected_explained in re { exp_desc = Texp_sequence(exp1, exp2); exp_loc = loc; exp_extra = []; exp_type = exp2.exp_type; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_while(scond, sbody) -> - let cond = type_expect env scond - (mk_expected ~explanation:While_loop_conditional Predef.type_bool) in - let body = type_statement ~explanation:While_loop_body env sbody in + let cond = + type_expect (Env.add_region_lock env) (mode_var ()) scond + (mk_expected ~explanation:While_loop_conditional Predef.type_bool) + in + let body = + type_statement ~explanation:While_loop_body (Env.add_region_lock env) sbody + in rue { exp_desc = Texp_while(cond, body); exp_loc = loc; exp_extra = []; exp_type = instance Predef.type_unit; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_for(param, slow, shigh, dir, sbody) -> - let low = type_expect env slow - (mk_expected ~explanation:For_loop_start_index Predef.type_int) in - let high = type_expect env shigh - (mk_expected ~explanation:For_loop_stop_index Predef.type_int) in + let low = + type_expect env (mode_var ()) slow + (mk_expected ~explanation:For_loop_start_index Predef.type_int) + in + let high = + type_expect env (mode_var ()) shigh + (mk_expected ~explanation:For_loop_stop_index Predef.type_int) + in let id, new_env = type_for_loop_index ~loc ~env ~param Predef.type_int in - let body = type_statement ~explanation:For_loop_body new_env sbody in + let body = + type_statement ~explanation:For_loop_body + (Env.add_region_lock new_env) sbody + in rue { exp_desc = Texp_for(id, param, low, high, dir, body); exp_loc = loc; exp_extra = []; exp_type = instance Predef.type_unit; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_constraint (sarg, sty) -> (* Pretend separate = true, 1% slowdown for lablgtk *) begin_def (); - let cty = Typetexp.transl_simple_type env false sty in + let type_mode = + if has_local_attr_exp sexp then Alloc_mode.Local + else Alloc_mode.Global + in + let cty = Typetexp.transl_simple_type env false type_mode sty in let ty = cty.ctyp_type in end_def (); generalize_structure ty; - let (arg, ty') = (type_argument env sarg ty (instance ty), instance ty) in + let arg = type_argument env expected_mode sarg ty (instance ty) in + let ty' = instance ty in rue { exp_desc = arg.exp_desc; exp_loc = arg.exp_loc; exp_type = ty'; + exp_mode = expected_mode.mode; exp_attributes = arg.exp_attributes; exp_env = env; exp_extra = @@ -3141,20 +3967,24 @@ and type_expect_ (* Pretend separate = true, 1% slowdown for lablgtk *) (* Also see PR#7199 for a problem with the following: let separate = !Clflags.principal || Env.has_local_constraints env in*) + let type_mode = + if has_local_attr_exp sexp then Alloc_mode.Local + else Alloc_mode.Global + in let (arg, ty',cty,cty') = match sty with | None -> let (cty', ty', force) = - Typetexp.transl_simple_type_delayed env sty' + Typetexp.transl_simple_type_delayed env type_mode sty' in begin_def (); - let arg = type_exp env sarg in + let arg = type_exp env expected_mode sarg in end_def (); let tv = newvar () in let gen = generalizable tv.level arg.exp_type in unify_var env tv arg.exp_type; begin match arg.exp_desc, !self_coercion, (repr ty').desc with - Texp_ident(_, _, {val_kind=Val_self _}), (path,r) :: _, + Texp_ident(_, _, {val_kind=Val_self _}, _), (path,r) :: _, Tconstr(path',_,_) when Path.same path path' -> (* prerr_endline "self coercion"; *) r := loc :: !r; @@ -3191,9 +4021,9 @@ and type_expect_ | Some sty -> begin_def (); let (cty, ty, force) = - Typetexp.transl_simple_type_delayed env sty + Typetexp.transl_simple_type_delayed env type_mode sty and (cty', ty', force') = - Typetexp.transl_simple_type_delayed env sty' + Typetexp.transl_simple_type_delayed env type_mode sty' in begin try let force'' = subtype env ty ty' in @@ -3204,13 +4034,14 @@ and type_expect_ end_def (); generalize_structure ty; generalize_structure ty'; - (type_argument env sarg ty (instance ty), + (type_argument env expected_mode sarg ty (instance ty), instance ty', Some cty, cty') in rue { exp_desc = arg.exp_desc; exp_loc = arg.exp_loc; exp_type = ty'; + exp_mode = expected_mode.mode; exp_attributes = arg.exp_attributes; exp_env = env; exp_extra = (Texp_coerce (cty, cty'), loc, sexp.pexp_attributes) :: @@ -3218,12 +4049,12 @@ and type_expect_ } | Pexp_send (e, {txt=met}) -> if !Clflags.principal then begin_def (); - let obj = type_exp env e in + let obj = type_exp env mode_global e in let obj_meths = ref None in begin try let (meth, exp, typ) = match obj.exp_desc with - Texp_ident(_path, _, {val_kind = Val_self (meths, _, _, privty)}) -> + Texp_ident(_p, _, {val_kind = Val_self (meths, _, _, privty)}, _) -> obj_meths := Some meths; let (id, typ) = filter_self_method env met Private meths privty @@ -3232,7 +4063,7 @@ and type_expect_ Location.prerr_warning loc (Warnings.Undeclared_virtual_method met); (Tmeth_val id, None, typ) - | Texp_ident(_path, lid, {val_kind = Val_anc (methods, cl_num)}) -> + | Texp_ident(_p, lid, {val_kind = Val_anc (methods, cl_num)}, _) -> let method_id = begin try List.assoc met methods with Not_found -> let valid_methods = List.map fst methods in @@ -3253,7 +4084,11 @@ and type_expect_ filter_self_method env met Private meths privty in let method_type = newvar () in - let (obj_ty, res_ty) = filter_arrow env method_type Nolabel in + let (marg, obj_ty, mres, res_ty) = + filter_arrow env method_type Nolabel + in + unify_alloc_mode marg Alloc_mode.global; + unify_alloc_mode mres Alloc_mode.global; unify env obj_ty desc.val_type; unify env res_ty (instance typ); let method_desc = @@ -3268,22 +4103,25 @@ and type_expect_ let exp = Texp_apply({exp_desc = Texp_ident(Path.Pident method_id, - lid, method_desc); + lid, method_desc, Id_value); exp_loc = loc; exp_extra = []; exp_type = method_type; + exp_mode = Value_mode.global; exp_attributes = []; (* check *) exp_env = exp_env}, [ Nolabel, - Some {exp_desc = Texp_ident(path, lid, desc); + Arg {exp_desc = Texp_ident(path, lid, desc, Id_value); exp_loc = obj.exp_loc; exp_extra = []; exp_type = desc.val_type; + exp_mode = Value_mode.global; exp_attributes = []; (* check *) exp_env = exp_env} - ]) + ], expected_mode.position) in (Tmeth_name met, Some (re {exp_desc = exp; exp_loc = loc; exp_extra = []; exp_type = typ; + exp_mode = expected_mode.mode; exp_attributes = []; (* check *) exp_env = exp_env}), typ) | _ -> @@ -3316,9 +4154,10 @@ and type_expect_ assert false in rue { - exp_desc = Texp_send(obj, meth, exp); + exp_desc = Texp_send(obj, meth, exp, expected_mode.position); exp_loc = loc; exp_extra = []; exp_type = typ; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } with Unify _ -> @@ -3345,9 +4184,10 @@ and type_expect_ raise(Error(loc, env, Virtual_class cl.txt)) | Some ty -> rue { - exp_desc = Texp_new (cl_path, cl, cl_decl); + exp_desc = + Texp_new (cl_path, cl, cl_decl, expected_mode.position); exp_loc = loc; exp_extra = []; - exp_type = instance ty; + exp_type = instance ty; exp_mode = Value_mode.global; exp_attributes = sexp.pexp_attributes; exp_env = env } end @@ -3358,7 +4198,8 @@ and type_expect_ match mut with | Mutable -> let newval = - type_expect env snewval (mk_expected (instance ty)) + type_expect env mode_global snewval + (mk_expected (instance ty)) in let (path_self, _) = Env.find_value_by_name (Longident.Lident ("self-" ^ cl_num)) env @@ -3366,7 +4207,7 @@ and type_expect_ rue { exp_desc = Texp_setinstvar(path_self, path, lab, newval); exp_loc = loc; exp_extra = []; - exp_type = instance Predef.type_unit; + exp_type = instance Predef.type_unit; exp_mode = Value_mode.global; exp_attributes = sexp.pexp_attributes; exp_env = env } | _ -> @@ -3395,7 +4236,8 @@ and type_expect_ begin try let (id, _, _, ty) = Vars.find lab.txt !vars in (Path.Pident id, lab, - type_expect env snewval (mk_expected (instance ty))) + type_expect env mode_global snewval + (mk_expected (instance ty))) with Not_found -> let vars = Vars.fold (fun var _ li -> var::li) !vars [] in @@ -3408,6 +4250,7 @@ and type_expect_ exp_desc = Texp_override(path_self, modifs); exp_loc = loc; exp_extra = []; exp_type = self_ty; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | _ -> @@ -3442,7 +4285,9 @@ and type_expect_ in type_expect triggered by escaping identifiers from the local module and refine them into Scoping_let_module errors *) - let body = type_expect new_env sbody ty_expected_explained in + let body = + type_expect new_env expected_mode sbody ty_expected_explained + in (* go back to original level *) end_def (); Ctype.unify_var new_env ty body.exp_type; @@ -3450,21 +4295,27 @@ and type_expect_ exp_desc = Texp_letmodule(id, name, pres, modl, body); exp_loc = loc; exp_extra = []; exp_type = ty; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_letexception(cd, sbody) -> let (cd, newenv) = Typedecl.transl_exception env cd in - let body = type_expect newenv sbody ty_expected_explained in + let body = + type_expect newenv expected_mode sbody ty_expected_explained + in re { exp_desc = Texp_letexception(cd, body); exp_loc = loc; exp_extra = []; exp_type = body.exp_type; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_assert (e) -> - let cond = type_expect env e - (mk_expected ~explanation:Assert_condition Predef.type_bool) in + let cond = + type_expect env (mode_var ()) e + (mk_expected ~explanation:Assert_condition Predef.type_bool) + in let exp_type = match cond.exp_desc with | Texp_construct(_, {cstr_name="false"}, _) -> @@ -3476,6 +4327,7 @@ and type_expect_ exp_desc = Texp_assert cond; exp_loc = loc; exp_extra = []; exp_type; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env; } @@ -3484,11 +4336,13 @@ and type_expect_ let to_unify = Predef.type_lazy_t ty in with_explanation (fun () -> unify_exp_types loc env to_unify (generic_instance ty_expected)); - let arg = type_expect env e (mk_expected ty) in + let env = Env.add_lock Value_mode.global env in + let arg = type_expect env mode_lazy e (mk_expected ty) in re { exp_desc = Texp_lazy arg; exp_loc = loc; exp_extra = []; exp_type = instance ty_expected; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env; } @@ -3498,6 +4352,7 @@ and type_expect_ exp_desc = Texp_object (desc, (*sign,*) meths); exp_loc = loc; exp_extra = []; exp_type = sign.csig_self; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env; } @@ -3507,7 +4362,7 @@ and type_expect_ match sty with None -> repr ty_expected, None | Some sty -> let sty = Ast_helper.Typ.force_poly sty in - let cty = Typetexp.transl_simple_type env false sty in + let cty = Typetexp.transl_simple_type env false Global sty in repr cty.ctyp_type, Some cty in if !Clflags.principal then begin @@ -3520,7 +4375,7 @@ and type_expect_ let exp = match (expand_head env ty).desc with Tpoly (ty', []) -> - let exp = type_expect env sbody (mk_expected ty') in + let exp = type_expect env expected_mode sbody (mk_expected ty') in { exp with exp_type = instance ty } | Tpoly (ty', tl) -> (* One more level to generalize locally *) @@ -3531,12 +4386,12 @@ and type_expect_ end_def (); generalize_structure ty'' end; - let exp = type_expect env sbody (mk_expected ty'') in + let exp = type_expect env expected_mode sbody (mk_expected ty'') in end_def (); generalize_and_check_univars env "method" exp ty_expected vars; { exp with exp_type = instance ty } | Tvar _ -> - let exp = type_exp env sbody in + let exp = type_exp env expected_mode sbody in let exp = {exp with exp_type = newty (Tpoly (exp.exp_type, []))} in unify_exp env exp ty; exp @@ -3574,7 +4429,7 @@ and type_expect_ let scope = create_scope () in let (id, new_env) = Env.enter_type ~scope name decl env in - let body = type_exp new_env sbody in + let body = type_exp new_env expected_mode sbody in (* Replace every instance of this type constructor in the resulting type. *) let seen = Hashtbl.create 8 in @@ -3619,18 +4474,20 @@ and type_expect_ exp_desc = Texp_pack modl; exp_loc = loc; exp_extra = []; exp_type = newty (Tpackage (p, nl, tl')); + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_open (od, e) -> let tv = newvar () in let (od, _, newenv) = !type_open_decl env od in - let exp = type_expect newenv e ty_expected_explained in + let exp = type_expect newenv expected_mode e ty_expected_explained in (* Force the return type to be well-formed in the original environment. *) unify_var newenv tv exp.exp_type; re { exp_desc = Texp_open (od, exp); exp_type = exp.exp_type; + exp_mode = expected_mode.mode; exp_loc = loc; exp_extra = []; exp_attributes = sexp.pexp_attributes; @@ -3653,12 +4510,17 @@ and type_expect_ let op_type = instance op_desc.val_type in let spat_params, ty_params = loop slet.pbop_pat (newvar ()) sands in let ty_func_result = newvar () in - let ty_func = newty (Tarrow(Nolabel, ty_params, ty_func_result, Cok)) in + let ty_func = + newty (Tarrow( + (Nolabel, Alloc_mode.global, Alloc_mode.global), + ty_params, ty_func_result, Cok)) + in let ty_result = newvar () in let ty_andops = newvar () in let ty_op = - newty (Tarrow(Nolabel, ty_andops, - newty (Tarrow(Nolabel, ty_func, ty_result, Cok)), Cok)) + newty (Tarrow((Nolabel, Alloc_mode.global, Alloc_mode.global), ty_andops, + newty (Tarrow((Nolabel, Alloc_mode.global, Alloc_mode.global), + ty_func, ty_result, Cok)), Cok)) in begin try unify env op_type ty_op @@ -3672,10 +4534,15 @@ and type_expect_ generalize_structure ty_func_result; generalize_structure ty_result end; - let exp, ands = type_andops env slet.pbop_exp sands ty_andops in + let exp, ands = + type_andops env slet.pbop_exp sands ty_andops + in + let body_env = Env.add_lock Value_mode.global env in let scase = Ast_helper.Exp.case spat_params sbody in let cases, partial = - type_cases Value env + type_cases Value body_env + (simple_pat_mode Value_mode.global) + (mode_return Value_mode.global) ty_params (mk_expected ty_func_result) true loc [scase] in let body = @@ -3699,6 +4566,7 @@ and type_expect_ exp_loc = sexp.pexp_loc; exp_extra = []; exp_type = instance ty_result; + exp_mode = expected_mode.mode; exp_env = env; exp_attributes = sexp.pexp_attributes; } @@ -3721,6 +4589,7 @@ and type_expect_ exp_desc = Texp_extension_constructor (lid, path); exp_loc = loc; exp_extra = []; exp_type = instance Predef.type_extension_constructor; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | _ -> @@ -3741,12 +4610,15 @@ and type_expect_ ; _ } , _)}]) -> check_probe_name name name_loc env; + let env = Env.add_lock Value_mode.global env in Env.add_probe name; - let exp = type_expect env arg (mk_expected Predef.type_unit) in + let exp = type_expect env mode_global arg + (mk_expected Predef.type_unit) in rue { exp_desc = Texp_probe {name; handler=exp}; exp_loc = loc; exp_extra = []; exp_type = instance Predef.type_unit; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | _ -> raise (Error (loc, env, Probe_format)) @@ -3769,6 +4641,7 @@ and type_expect_ exp_desc = Texp_probe_is_enabled {name}; exp_loc = loc; exp_extra = []; exp_type = instance Predef.type_bool; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } | _ -> raise (Error (loc, env, Probe_is_enabled_format)) @@ -3778,7 +4651,7 @@ and type_expect_ _ ) as extension) -> if Clflags.Extension.(is_enabled Comprehensions) then let ext_expr = Extensions.extension_expr_of_payload ~loc extension in - type_extension ~loc ~env ~ty_expected ~sexp ext_expr + type_extension ~loc ~env ~ty_expected ~expected_mode ~sexp ext_expr else raise (Error (loc, env, Extension_not_enabled(Clflags.Extension.Comprehensions))) @@ -3789,11 +4662,13 @@ and type_expect_ re { exp_desc = Texp_unreachable; exp_loc = loc; exp_extra = []; exp_type = instance ty_expected; + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } -and type_ident env ?(recarg=Rejected) lid = - let (path, desc) = Env.lookup_value ~loc:lid.loc lid.txt env in +and type_ident env expected_mode ?(recarg=Rejected) lid = + let (path, desc, mode) = Env.lookup_value ~loc:lid.loc lid.txt env in + submode ~env ~loc:lid.loc mode expected_mode; let is_recarg = match (repr desc.val_type).desc with | Tconstr(p, _, _) -> Path.is_constructor_typath p @@ -3808,12 +4683,23 @@ and type_ident env ?(recarg=Rejected) lid = raise (Error (lid.loc, env, Inlined_record_escape)) | false, Required, _ -> () (* will fail later *) end; - path, desc + let val_type, kind = + match desc.val_kind with + | Val_prim prim -> + let ty, mode = instance_prim_mode prim (instance desc.val_type) in + begin match prim.prim_native_repr_res with + | Prim_poly, _ -> register_allocation_mode mode + | _ -> () + end; + ty, Id_prim mode + | _ -> + instance desc.val_type, Id_value in + path, { desc with val_type }, kind and type_binding_op_ident env s = let loc = s.loc in let lid = Location.mkloc (Longident.Lident s.txt) loc in - let path, desc = type_ident env lid in + let path, desc, kind = type_ident env mode_global lid in let path = match desc.val_kind with | Val_ivar _ -> @@ -3825,18 +4711,31 @@ and type_binding_op_ident env s = path | _ -> path in + (* FIXME is [external (let+)] valid? *) + assert (kind = Id_value); path, desc -and type_function ?in_function loc attrs env ty_expected_explained l caselist = +and type_function ?in_function loc attrs env (expected_mode : expected_mode) + ty_expected_explained l has_local caselist = let { ty = ty_expected; explanation } = ty_expected_explained in + register_allocation expected_mode; + let alloc_mode = Value_mode.regional_to_global_alloc expected_mode.mode in let (loc_fun, ty_fun) = - match in_function with Some p -> p + match in_function with + | Some (loc_fun, ty_fun, _) -> (loc_fun, ty_fun) | None -> (loc, instance ty_expected) in let separate = !Clflags.principal || Env.has_local_constraints env in if separate then begin_def (); - let (ty_arg, ty_res) = - try filter_arrow env (instance ty_expected) l + let uncurried_function = + match caselist with + | [{pc_lhs = _; pc_guard = None; pc_rhs = e}] -> + is_an_uncurried_function e + | _ -> false + in + let ty_expected' = instance ty_expected in + let (arg_mode, ty_arg, ret_mode, ty_res) = + try filter_arrow env ty_expected' l with Unify _ -> match expand_head env ty_expected with {desc = Tarrow _} as ty -> @@ -3847,6 +4746,21 @@ and type_function ?in_function loc attrs env ty_expected_explained l caselist = ty_fun, explanation))) in + if has_local then + eqmode ~loc ~env arg_mode Alloc_mode.local + (Param_mode_mismatch ty_expected'); + if uncurried_function then begin + begin match Btype.Alloc_mode.submode arg_mode ret_mode with + | Ok () -> () + | Error () -> + raise (Error(loc_fun, env, Uncurried_function_escapes)) + end; + begin match Btype.Alloc_mode.submode alloc_mode ret_mode with + | Ok () -> () + | Error () -> + raise (Error(loc_fun, env, Uncurried_function_escapes)) + end + end; let ty_arg = if is_optional l then let tv = newvar() in @@ -3862,9 +4776,46 @@ and type_function ?in_function loc attrs env ty_expected_explained l caselist = generalize_structure ty_arg; generalize_structure ty_res end; + let env, region_locked = + match in_function with + | Some (_, _, region_locked) -> env, region_locked + | None -> + let region_locked = not (is_local_returning_function caselist) in + let env = + Env.add_lock (Value_mode.regional_to_global expected_mode.mode) env + in + let env = + if region_locked then Env.add_region_lock env + else env + in + env, region_locked + in + let arg_value_mode = Value_mode.of_alloc arg_mode in + let arg_value_mode = + if region_locked then Value_mode.local_to_regional arg_value_mode + else arg_value_mode + in + let cases_expected_mode = + if uncurried_function then + mode_nontail (Value_mode.of_alloc ret_mode) + else begin + let ret_value_mode = Value_mode.of_alloc ret_mode in + let ret_value_mode = + if region_locked then Value_mode.local_to_regional ret_value_mode + else ret_value_mode + in + mode_return ret_value_mode + end + in + let in_function = + if uncurried_function then + Some (loc_fun, ty_fun, region_locked) + else + None + in let cases, partial = - type_cases Value ~in_function:(loc_fun,ty_fun) env - ty_arg (mk_expected ty_res) true loc caselist in + type_cases Value ?in_function env (simple_pat_mode arg_value_mode) + cases_expected_mode ty_arg (mk_expected ty_res) true loc caselist in let not_nolabel_function ty = let ls, tvar = list_labels env ty in List.for_all ((<>) Nolabel) ls && not tvar @@ -3873,17 +4824,23 @@ and type_function ?in_function loc attrs env ty_expected_explained l caselist = Location.prerr_warning (List.hd cases).c_lhs.pat_loc Warnings.Unerasable_optional_argument; let param = name_cases "param" cases in + let region = region_locked && not uncurried_function in re { - exp_desc = Texp_function { arg_label = l; param; cases; partial; }; + exp_desc = + Texp_function + { arg_label = l; param; cases; partial; region }; exp_loc = loc; exp_extra = []; - exp_type = instance (newgenty (Tarrow(l, ty_arg, ty_res, Cok))); + exp_type = + instance (newgenty (Tarrow((l,arg_mode,ret_mode), ty_arg, ty_res, Cok))); + exp_mode = expected_mode.mode; exp_attributes = attrs; exp_env = env } and type_label_access env srecord lid = if !Clflags.principal then begin_def (); - let record = type_exp ~recarg:Allowed env srecord in + let mode = Value_mode.newvar () in + let record = type_exp ~recarg:Allowed env (mode_nontail mode) srecord in if !Clflags.principal then begin end_def (); generalize_structure record.exp_type @@ -3899,7 +4856,7 @@ and type_label_access env srecord lid = let label = wrap_disambiguate "This expression has" (mk_expected ty_exp) (Label.disambiguate () lid env expected_type) labels in - (record, label, expected_type) + (record, mode, label, expected_type) (* Typing format strings for printing or reading. These formats are used by functions in modules Printf, Format, and Scanf. @@ -4147,7 +5104,7 @@ and type_format loc str env = with Failure msg -> raise (Error (loc, env, Invalid_format msg)) -and type_label_exp create env loc ty_expected +and type_label_exp create env rmode loc ty_expected (lid, label, sarg) = (* Here also ty_expected may be at generic_level *) begin_def (); @@ -4179,7 +5136,15 @@ and type_label_exp create env loc ty_expected raise (Error(lid.loc, env, Private_label(lid.txt, ty_expected))); let arg = let snap = if vars = [] then None else Some (Btype.snapshot ()) in - let arg = type_argument env sarg ty_arg (instance ty_arg) in + let arg_mode = + match label.lbl_global with + | Global -> Value_mode.global + | Nonlocal -> Value_mode.local_to_regional rmode + | Unrestricted -> rmode + in + let arg = + type_argument env (mode_nontail arg_mode) sarg ty_arg (instance ty_arg) + in end_def (); try if (vars = []) then arg @@ -4193,7 +5158,7 @@ and type_label_exp create env loc ty_expected (* Try to retype without propagating ty_arg, cf PR#4862 *) Option.iter Btype.backtrack snap; begin_def (); - let arg = type_exp env sarg in + let arg = type_exp env (mode_nontail arg_mode) sarg in end_def (); lower_contravariant env arg.exp_type; begin_def (); @@ -4207,41 +5172,36 @@ and type_label_exp create env loc ty_expected in (lid, label, arg) -and type_argument ?explanation ?recarg env sarg ty_expected' ty_expected = +and type_argument ?explanation ?recarg env (mode : expected_mode) sarg + ty_expected' ty_expected = (* ty_expected' may be generic *) let no_labels ty = let ls, tvar = list_labels env ty in not tvar && List.for_all ((=) Nolabel) ls in - let rec is_inferred sexp = - match sexp.pexp_desc with - Pexp_ident _ | Pexp_apply _ | Pexp_field _ | Pexp_constraint _ - | Pexp_coerce _ | Pexp_send _ | Pexp_new _ -> true - | Pexp_sequence (_, e) | Pexp_open (_, e) -> is_inferred e - | Pexp_ifthenelse (_, e1, Some e2) -> is_inferred e1 && is_inferred e2 - | _ -> false - in match expand_head env ty_expected' with - {desc = Tarrow(Nolabel,ty_arg,ty_res,_); level = lv} + {desc = Tarrow((Nolabel,marg,mret),ty_arg,ty_res,_); level = lv} when is_inferred sarg -> (* apply optional arguments when expected type is "" *) (* we must be very careful about not breaking the semantics *) if !Clflags.principal then begin_def (); - let texp = type_exp env sarg in + let texp = type_exp env mode sarg in if !Clflags.principal then begin end_def (); generalize_structure texp.exp_type end; let rec make_args args ty_fun = match (expand_head env ty_fun).desc with - | Tarrow (l,ty_arg,ty_fun,_) when is_optional l -> - let ty = option_none env (instance ty_arg) sarg.pexp_loc in - make_args ((l, Some ty) :: args) ty_fun - | Tarrow (l,_,ty_res',_) when l = Nolabel || !Clflags.classic -> + | Tarrow ((l,marg,_mret),ty_arg,ty_fun,_) when is_optional l -> + let marg = Value_mode.of_alloc marg in + let ty = option_none env (instance ty_arg) marg sarg.pexp_loc in + make_args ((l, Arg ty) :: args) ty_fun + | Tarrow ((l,_,_),_,ty_res',_) when l = Nolabel || !Clflags.classic -> List.rev args, ty_fun, no_labels ty_res' | Tvar _ -> List.rev args, ty_fun, false | _ -> [], texp.exp_type, false in + (* If make_args ends in Tvar, then simple_res is false, no_labels *) let args, ty_fun', simple_res = make_args [] texp.exp_type in let warn = !Clflags.principal && (lv <> generic_level || (repr ty_fun').level <> generic_level) @@ -4254,7 +5214,7 @@ and type_argument ?explanation ?recarg env sarg ty_expected' ty_expected = unify_exp env {texp with exp_type = ty_fun} ty_expected; if args = [] then texp else (* eta-expand to avoid side effects *) - let var_pair name ty = + let var_pair ~mode name ty = let id = Ident.create_local name in let desc = { val_type = ty; val_kind = Val_reg; @@ -4263,28 +5223,31 @@ and type_argument ?explanation ?recarg env sarg ty_expected' ty_expected = val_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); } in - let exp_env = Env.add_value id desc env in + let exp_env = Env.add_value ~mode id desc env in {pat_desc = Tpat_var (id, mknoloc name); pat_type = ty;pat_extra=[]; - pat_attributes = []; + pat_mode = mode; pat_attributes = []; pat_loc = Location.none; pat_env = env}, - {exp_type = ty; exp_loc = Location.none; exp_env = exp_env; + {exp_type = ty; exp_mode = mode; exp_loc = Location.none; exp_env = exp_env; exp_extra = []; exp_attributes = []; exp_desc = - Texp_ident(Path.Pident id, mknoloc (Longident.Lident name), desc)} + Texp_ident(Path.Pident id, mknoloc (Longident.Lident name), + desc, Id_value)} in - let eta_pat, eta_var = var_pair "eta" ty_arg in + let eta_mode = Value_mode.local_to_regional (Value_mode.of_alloc marg) in + let eta_pat, eta_var = var_pair ~mode:eta_mode "eta" ty_arg in let func texp = + let ret_mode = Value_mode.of_alloc mret in let e = - {texp with exp_type = ty_res; exp_desc = + {texp with exp_type = ty_res; exp_mode = ret_mode; exp_desc = Texp_apply (texp, - args @ [Nolabel, Some eta_var])} + args @ [Nolabel, Arg eta_var], Nontail)} in let cases = [case eta_pat e] in let param = name_cases "param" cases in - { texp with exp_type = ty_fun; exp_desc = - Texp_function { arg_label = Nolabel; param; cases; - partial = Total; } } + { texp with exp_type = ty_fun; exp_mode = mode.mode; + exp_desc = Texp_function { arg_label = Nolabel; param; cases; + partial = Total; region = false } } in Location.prerr_warning texp.exp_loc (Warnings.Eliminated_optional_arguments @@ -4292,191 +5255,57 @@ and type_argument ?explanation ?recarg env sarg ty_expected' ty_expected = if warn then Location.prerr_warning texp.exp_loc (Warnings.Non_principal_labels "eliminated optional argument"); (* let-expand to have side effects *) - let let_pat, let_var = var_pair "arg" texp.exp_type in - re { texp with exp_type = ty_fun; exp_desc = - Texp_let (Nonrecursive, - [{vb_pat=let_pat; vb_expr=texp; vb_attributes=[]; - vb_loc=Location.none; - }], - func let_var) } + let let_pat, let_var = var_pair ~mode:texp.exp_mode "arg" texp.exp_type in + re { texp with exp_type = ty_fun; exp_mode = mode.mode; + exp_desc = + Texp_let (Nonrecursive, + [{vb_pat=let_pat; vb_expr=texp; vb_attributes=[]; + vb_loc=Location.none; + }], + func let_var) } end | _ -> - let texp = type_expect ?recarg env sarg + let texp = type_expect ?recarg env mode sarg (mk_expected ?explanation ty_expected') in unify_exp env texp ty_expected; texp -and type_application env funct sargs = - (* funct.exp_type may be generic *) - let result_type omitted ty_fun = - List.fold_left - (fun ty_fun (l,ty,lv) -> newty2 lv (Tarrow(l,ty,ty_fun,Cok))) - ty_fun omitted - in - let has_label l ty_fun = - let ls, tvar = list_labels env ty_fun in - tvar || List.mem l ls - in - let eliminated_optional_arguments = ref [] in - let omitted_parameters = ref [] in - let type_unknown_arg (ty_fun, typed_args) (lbl, sarg) = - let (ty_arg, ty_res) = - let ty_fun = expand_head env ty_fun in - match ty_fun.desc with - | Tvar _ -> - let t1 = newvar () and t2 = newvar () in - if ty_fun.level >= t1.level && - not (is_prim ~name:"%identity" funct) - then - Location.prerr_warning sarg.pexp_loc - Warnings.Ignored_extra_argument; - unify env ty_fun (newty (Tarrow(lbl,t1,t2,Clink(ref Cunknown)))); - (t1, t2) - | Tarrow (l,t1,t2,_) when l = lbl - || !Clflags.classic && lbl = Nolabel && not (is_optional l) -> - (t1, t2) - | td -> - let ty_fun = match td with Tarrow _ -> newty td | _ -> ty_fun in - let ty_res = - result_type (!omitted_parameters @ !eliminated_optional_arguments) - ty_fun - in - match ty_res.desc with - | Tarrow _ -> - if !Clflags.classic || not (has_label lbl ty_fun) then - raise (Error(sarg.pexp_loc, env, - Apply_wrong_label(lbl, ty_res, false))) - else - raise (Error(funct.exp_loc, env, Incoherent_label_order)) - | _ -> - raise(Error(funct.exp_loc, env, Apply_non_function - (expand_head env funct.exp_type))) - in - let arg () = - let arg = type_expect env sarg (mk_expected ty_arg) in +and type_apply_arg env ~funct ~index ~position ~partial_app (lbl, arg) = + match arg with + | Arg (Unknown_arg { sarg; ty_arg; mode_arg }) -> + let mode = Alloc_mode.newvar () in + Alloc_mode.submode_exn mode mode_arg; + let expected_mode = + mode_argument ~funct ~index ~position ~partial_app mode in + let arg = type_expect env expected_mode sarg (mk_expected ty_arg) in if is_optional lbl then unify_exp env arg (type_option(newvar())); - arg - in - (ty_res, (lbl, Some arg) :: typed_args) - in - let ignore_labels = - !Clflags.classic || - begin - let ls, tvar = list_labels env funct.exp_type in - not tvar && - let labels = List.filter (fun l -> not (is_optional l)) ls in - List.length labels = List.length sargs && - List.for_all (fun (l,_) -> l = Nolabel) sargs && - List.exists (fun l -> l <> Nolabel) labels && - (Location.prerr_warning - funct.exp_loc - (Warnings.Labels_omitted - (List.map Printtyp.string_of_label - (List.filter ((<>) Nolabel) labels))); - true) - end - in - let warned = ref false in - let rec type_args args ty_fun ty_fun0 sargs = - match expand_head env ty_fun, expand_head env ty_fun0 with - | {desc=Tarrow (l, ty, ty_fun, com); level=lv} as ty_fun', - {desc=Tarrow (_, ty0, ty_fun0, _)} - when sargs <> [] && commu_repr com = Cok -> - let may_warn loc w = - if not !warned && !Clflags.principal && lv <> generic_level - then begin - warned := true; - Location.prerr_warning loc w - end - in - let name = label_name l - and optional = is_optional l in - let use_arg sarg l' = - Some ( - if not optional || is_optional l' then - (fun () -> type_argument env sarg ty ty0) - else begin - may_warn sarg.pexp_loc - (Warnings.Not_principal "using an optional argument here"); - (fun () -> option_some env (type_argument env sarg - (extract_option_type env ty) - (extract_option_type env ty0))) - end - ) - in - let eliminate_optional_arg () = - may_warn funct.exp_loc - (Warnings.Non_principal_labels "eliminated optional argument"); - eliminated_optional_arguments := - (l,ty,lv) :: !eliminated_optional_arguments; - Some (fun () -> option_none env (instance ty) Location.none) - in - let remaining_sargs, arg = - if ignore_labels then begin - (* No reordering is allowed, process arguments in order *) - match sargs with - | [] -> assert false - | (l', sarg) :: remaining_sargs -> - if name = label_name l' || (not optional && l' = Nolabel) then - (remaining_sargs, use_arg sarg l') - else if - optional && - not (List.exists (fun (l, _) -> name = label_name l) - remaining_sargs) && - List.exists (function (Nolabel, _) -> true | _ -> false) - sargs - then - (sargs, eliminate_optional_arg ()) - else - raise(Error(sarg.pexp_loc, env, - Apply_wrong_label(l', ty_fun', optional))) - end else - (* Arguments can be commuted, try to fetch the argument - corresponding to the first parameter. *) - match extract_label name sargs with - | Some (l', sarg, commuted, remaining_sargs) -> - if commuted then begin - may_warn sarg.pexp_loc - (Warnings.Not_principal "commuting this argument") - end; - if not optional && is_optional l' then - Location.prerr_warning sarg.pexp_loc - (Warnings.Nonoptional_label (Printtyp.string_of_label l)); - remaining_sargs, use_arg sarg l' - | None -> - sargs, - if optional && List.mem_assoc Nolabel sargs then - eliminate_optional_arg () - else begin - (* No argument was given for this parameter, we abstract over - it. *) - may_warn funct.exp_loc - (Warnings.Non_principal_labels "commuted an argument"); - omitted_parameters := (l,ty,lv) :: !omitted_parameters; - None - end - in - type_args ((l,arg)::args) ty_fun ty_fun0 remaining_sargs - | _ -> - (* We're not looking at a *known* function type anymore, or there are no - arguments left. *) - let ty_fun, typed_args = - List.fold_left type_unknown_arg (ty_fun0, args) sargs - in - let args = - (* Force typing of arguments. - Careful: the order matters here. Using [List.rev_map] would be - incorrect. *) - List.map - (function - | l, None -> l, None - | l, Some f -> l, Some (f ())) - (List.rev typed_args) - in - let result_ty = instance (result_type !omitted_parameters ty_fun) in - args, result_ty - in + (lbl, Arg arg) + | Arg (Known_arg { sarg; ty_arg; ty_arg0; mode_arg; wrapped_in_some }) -> + let mode = Alloc_mode.newvar () in + Alloc_mode.submode_exn mode mode_arg; + let expected_mode = + mode_argument ~funct ~index ~position ~partial_app mode in + let arg = + if wrapped_in_some then + option_some env + (type_argument env (mode_subcomponent expected_mode) sarg + (extract_option_type env ty_arg) + (extract_option_type env ty_arg0)) + expected_mode.mode + else + type_argument env expected_mode sarg ty_arg ty_arg0 + in + (lbl, Arg arg) + | Arg (Eliminated_optional_arg { ty_arg; _ }) -> + let arg = + option_none env (instance ty_arg) + Value_mode.global Location.none + in + (lbl, Arg arg) + | Omitted _ as arg -> (lbl, arg) + +and type_application env app_loc expected_mode funct funct_mode sargs = let is_ignore funct = is_prim ~name:"%ignore" funct && (try ignore (filter_arrow env (instance funct.exp_type) Nolabel); true @@ -4485,16 +5314,62 @@ and type_application env funct sargs = match sargs with | (* Special case for ignore: avoid discarding warning *) [Nolabel, sarg] when is_ignore funct -> - let ty_arg, ty_res = filter_arrow env (instance funct.exp_type) Nolabel in - let exp = type_expect env sarg (mk_expected ty_arg) in + let marg, ty_arg, mres, ty_res = + filter_arrow env (instance funct.exp_type) Nolabel + in + submode ~loc:app_loc ~env + (Value_mode.of_alloc mres) expected_mode; + let marg = + mode_argument ~funct ~index:0 ~position:expected_mode.position + ~partial_app:false marg + in + let exp = type_expect env marg sarg (mk_expected ty_arg) in check_partial_application false exp; - ([Nolabel, Some exp], ty_res) + ([Nolabel, Arg exp], ty_res, expected_mode.position) | _ -> - let ty = funct.exp_type in - type_args [] ty (instance ty) sargs + let ty = funct.exp_type in + let ignore_labels = + !Clflags.classic || + begin + let ls, tvar = list_labels env funct.exp_type in + not tvar && + let labels = List.filter (fun l -> not (is_optional l)) ls in + List.length labels = List.length sargs && + List.for_all (fun (l,_) -> l = Nolabel) sargs && + List.exists (fun l -> l <> Nolabel) labels && + (Location.prerr_warning + funct.exp_loc + (Warnings.Labels_omitted + (List.map Printtyp.string_of_label + (List.filter ((<>) Nolabel) labels))); + true) + end + in + let ty_ret, mode_ret, args = + collect_apply_args env funct ignore_labels ty (instance ty) + (Value_mode.regional_to_global_alloc funct_mode) sargs + in + let partial_app = is_partial_apply args in + let position = if partial_app then Nontail else expected_mode.position in + let args = + List.mapi (fun index arg -> + type_apply_arg env ~funct ~index ~position ~partial_app arg) + args + in + let ty_ret, mode_ret, args = + type_omitted_parameters expected_mode env + ty_ret mode_ret args + in + submode ~loc:app_loc ~env + (Value_mode.of_alloc mode_ret) expected_mode; + args, ty_ret, position -and type_construct env loc lid sarg ty_expected_explained attrs = +and type_construct env (expected_mode : expected_mode) loc lid sarg + ty_expected_explained attrs = let { ty = ty_expected; explanation } = ty_expected_explained in + if sarg <> None then + register_allocation expected_mode; + let argument_mode = mode_subcomponent expected_mode in let expected_type = try let (p0, p,_) = extract_concrete_variant env ty_expected in @@ -4530,6 +5405,7 @@ and type_construct env loc lid sarg ty_expected_explained attrs = exp_desc = Texp_construct(lid, constr, []); exp_loc = loc; exp_extra = []; exp_type = ty_res; + exp_mode = expected_mode.mode; exp_attributes = attrs; exp_env = env } in if separate then begin @@ -4563,8 +5439,10 @@ and type_construct env loc lid sarg ty_expected_explained attrs = end in let args = - List.map2 (fun e (t,t0) -> type_argument ~recarg env e t t0) sargs - (List.combine ty_args ty_args0) in + List.map2 + (fun e (t,t0) -> type_argument ~recarg env argument_mode e t t0) + sargs (List.combine ty_args ty_args0) + in if constr.cstr_private = Private then begin match constr.cstr_tag with | Cstr_extension _ -> @@ -4580,7 +5458,7 @@ and type_construct env loc lid sarg ty_expected_explained attrs = and type_statement ?explanation env sexp = begin_def(); - let exp = type_exp env sexp in + let exp = type_exp env (mode_var ()) sexp in end_def(); let ty = expand_head env exp.exp_type and tv = newvar() in if is_Tvar ty && ty.level > tv.level then @@ -4598,7 +5476,8 @@ and type_statement ?explanation env sexp = exp end -and type_unpacks ?in_function env unpacks sbody expected_ty = +and type_unpacks ?in_function env (expected_mode : expected_mode) unpacks + sbody expected_ty = let ty = newvar() in (* remember original level *) let extended_env, tunpacks = @@ -4634,7 +5513,9 @@ and type_unpacks ?in_function env unpacks sbody expected_ty = in type_expect triggered by escaping identifiers from the local module and refine them into Scoping_let_module errors *) - let body = type_expect ?in_function extended_env sbody expected_ty in + let body = + type_expect ?in_function extended_env expected_mode sbody expected_ty + in let exp_loc = { body.exp_loc with loc_ghost = true } in let exp_attributes = [Ast_helper.Attr.mk (mknoloc "#modulepat") (PStr [])] in List.fold_left (fun body (id, name, pres, modl) -> @@ -4648,15 +5529,17 @@ and type_unpacks ?in_function env unpacks sbody expected_ty = exp_attributes; exp_extra = []; exp_type = ty; + exp_mode = expected_mode.mode; exp_env = env } ) body tunpacks (* Typing of match cases *) and type_cases - : type k . k pattern_category -> - ?in_function:_ -> _ -> _ -> _ -> _ -> _ -> Parsetree.case list -> - k case list * partial - = fun category ?in_function env + : type k . k pattern_category + -> ?in_function:_ -> _ -> _ -> _ -> _ -> _ -> _ -> _ + -> Parsetree.case list + -> k case list * partial + = fun category ?in_function env pmode emode ty_arg ty_res_explained partial_flag loc caselist -> (* ty_arg is _fully_ generalized *) let { ty = ty_res; explanation } = ty_res_explained in @@ -4701,7 +5584,7 @@ and type_cases end_def (); generalize_structure ty_arg; let (pat, ext_env, force, pvs, unpacks) = - type_pattern category ~lev env pc_lhs ty_arg + type_pattern category ~lev ~alloc_mode:pmode env pc_lhs ty_arg in pattern_force := force @ !pattern_force; let pat = @@ -4796,11 +5679,11 @@ and type_cases | None -> None | Some scond -> Some - (type_unpacks ext_env unpacks scond + (type_unpacks ext_env (mode_var ()) unpacks scond (mk_expected ~explanation:When_guard Predef.type_bool)) in let exp = - type_unpacks ?in_function ext_env + type_unpacks ?in_function ext_env emode unpacks pc_rhs (mk_expected ?explanation ty_res') in { @@ -4876,33 +5759,71 @@ and type_let | _ -> false in + let rec sexp_is_fun e = + match e.pexp_desc with + | Pexp_fun _ | Pexp_function _ -> true + | Pexp_constraint (e, _) + | Pexp_newtype (_, e) + | Pexp_apply + ({ pexp_desc = Pexp_extension({txt = "extension.local"}, PStr []) }, + [Nolabel, e]) -> sexp_is_fun e + | _ -> false + in + let vb_is_fun { pvb_expr = sexp; _ } = sexp_is_fun sexp in + let entirely_functions = List.for_all vb_is_fun spat_sexp_list in let check = if is_fake_let then check_strict else check in - + let rec_mode_var = + match rec_flag with + | Recursive when entirely_functions -> Some (Value_mode.newvar ()) + | Recursive -> Some Value_mode.global + | Nonrecursive -> None + in let spatl = List.map (fun {pvb_pat=spat; pvb_expr=sexp; pvb_attributes=attrs} -> - attrs, - match spat.ppat_desc, sexp.pexp_desc with - (Ppat_any | Ppat_constraint _), _ -> spat - | _, Pexp_coerce (_, _, sty) - | _, Pexp_constraint (_, sty) when !Clflags.principal -> - (* propagate type annotation to pattern, - to allow it to be generalized in -principal mode *) - Pat.constraint_ - ~loc:{spat.ppat_loc with Location.loc_ghost=true} - spat - sty - | _ -> spat) + let spat = + match spat.ppat_desc, sexp.pexp_desc with + | (Ppat_any | Ppat_constraint _), _ -> spat + | _, Pexp_coerce (_, _, sty) + | _, Pexp_constraint (_, sty) when !Clflags.principal -> + (* propagate type annotation to pattern, + to allow it to be generalized in -principal mode *) + Pat.constraint_ + ~loc:{spat.ppat_loc with Location.loc_ghost=true} + spat + sty + | _ -> spat + in + let pat_mode, exp_mode = + match rec_mode_var with + | None -> begin + match pat_tuple_arity spat with + | Not_local_tuple | Maybe_local_tuple -> + let mode = Value_mode.newvar () in + simple_pat_mode mode, mode_nontail mode + | Local_tuple arity -> + let modes = + List.init arity (fun _ -> Value_mode.newvar ()) + in + let mode = + Value_mode.regional_to_local (Value_mode.join modes) + in + tuple_pat_mode mode modes, mode_tuple mode modes + end + | Some mode -> + simple_pat_mode mode, mode_nontail mode + in + attrs, pat_mode, exp_mode, spat) spat_sexp_list in let nvs = List.map (fun _ -> newvar ()) spatl in let (pat_list, new_env, force, pvs, unpacks) = type_pattern_list Value existential_context env spatl nvs allow in - let attrs_list = List.map fst spatl in + let attrs_list = List.map (fun (attrs, _, _, _) -> attrs) spatl in let is_recursive = (rec_flag = Recursive) in (* If recursive, first unify with an approximation of the expression *) if is_recursive then List.iter2 - (fun pat binding -> + (fun (_, pat) binding -> let pat = match pat.pat_type.desc with | Tpoly (ty, tl) -> @@ -4913,7 +5834,7 @@ and type_let pat_list spat_sexp_list; (* Polymorphic variant processing *) List.iter - (fun pat -> + (fun (_, pat) -> if has_variants pat then begin Parmatch.pressure_variants env [pat]; finalize_variants pat @@ -4924,23 +5845,18 @@ and type_let if !Clflags.principal then begin end_def (); iter_pattern_variables_type generalize_structure pvs; - List.map (fun pat -> + List.map (fun (m, pat) -> generalize_structure pat.pat_type; - {pat with pat_type = instance pat.pat_type} + m, {pat with pat_type = instance pat.pat_type} ) pat_list end else pat_list in (* Only bind pattern variables after generalizing *) List.iter (fun f -> f()) force; - let sexp_is_fun { pvb_expr = sexp; _ } = - match sexp.pexp_desc with - | Pexp_fun _ | Pexp_function _ -> true - | _ -> false - in let exp_env = if is_recursive then new_env - else if List.for_all sexp_is_fun spat_sexp_list + else if entirely_functions then begin (* Add ghost bindings to help detecting missing "rec" keywords. @@ -4968,7 +5884,7 @@ and type_let || (is_recursive && (Warnings.is_active Warnings.Unused_rec_flag)))) attrs_list in - let pat_slot_list = + let mode_pat_slot_list = (* Algorithm to detect unused declarations in recursive bindings: - During type checking of the definitions, we capture the 'value_used' events on the bound identifiers and record them in a slot corresponding @@ -4986,9 +5902,9 @@ and type_let warning is 26, not 27. *) List.map2 - (fun attrs pat -> + (fun attrs (mode, pat) -> Builtin_attributes.warning_scope ~ppwarning:false attrs (fun () -> - if not warn_about_unused_bindings then pat, None + if not warn_about_unused_bindings then mode, pat, None else let some_used = ref false in (* has one of the identifier of this pattern been used? *) @@ -5020,14 +5936,14 @@ and type_let ) ) (Typedtree.pat_bound_idents pat); - pat, Some slot + mode, pat, Some slot )) attrs_list pat_list in let exp_list = List.map2 - (fun {pvb_expr=sexp; pvb_attributes; _} (pat, slot) -> + (fun {pvb_expr=sexp; pvb_attributes; _} (mode, pat, slot) -> if is_recursive then current_slot := slot; match pat.pat_type.desc with | Tpoly (ty, tl) -> @@ -5040,9 +5956,11 @@ and type_let let exp = Builtin_attributes.warning_scope pvb_attributes (fun () -> if rec_flag = Recursive then - type_unpacks exp_env unpacks sexp (mk_expected ty') + type_unpacks exp_env mode + unpacks sexp (mk_expected ty') else - type_expect exp_env sexp (mk_expected ty') + type_expect exp_env mode + sexp (mk_expected ty') ) in exp, Some vars @@ -5050,12 +5968,14 @@ and type_let let exp = Builtin_attributes.warning_scope pvb_attributes (fun () -> if rec_flag = Recursive then - type_unpacks exp_env unpacks sexp (mk_expected pat.pat_type) + type_unpacks exp_env mode + unpacks sexp (mk_expected pat.pat_type) else - type_expect exp_env sexp (mk_expected pat.pat_type)) + type_expect exp_env mode + sexp (mk_expected pat.pat_type)) in exp, None) - spat_sexp_list pat_slot_list in + spat_sexp_list mode_pat_slot_list in current_slot := None; if is_recursive && not !rec_needed then begin let {pvb_pat; pvb_attributes} = List.hd spat_sexp_list in @@ -5066,7 +5986,7 @@ and type_let ) end; List.iter2 - (fun pat (attrs, exp) -> + (fun (_,pat) (attrs, exp) -> Builtin_attributes.warning_scope ~ppwarning:false attrs (fun () -> ignore(check_partial env pat.pat_type pat.pat_loc @@ -5074,17 +5994,17 @@ and type_let ) ) pat_list - (List.map2 (fun (attrs, _) (e, _) -> attrs, e) spatl exp_list); + (List.map2 (fun (attrs, _, _, _) (e, _) -> attrs, e) spatl exp_list); let pvs = List.map (fun pv -> { pv with pv_type = instance pv.pv_type}) pvs in end_def(); List.iter2 - (fun pat (exp, _) -> + (fun (_,pat) (exp, _) -> if maybe_expansive exp then lower_contravariant env pat.pat_type) pat_list exp_list; iter_pattern_variables_type generalize pvs; List.iter2 - (fun pat (exp, vars) -> + (fun (_,pat) (exp, vars) -> match vars with | None -> (* We generalize expressions even if they are not bound to a variable @@ -5105,7 +6025,7 @@ and type_let let l = List.combine pat_list exp_list in let l = List.map2 - (fun (p, (e, _)) pvb -> + (fun ((_,p), (e, _)) pvb -> {vb_pat=p; vb_expr=e; vb_attributes=pvb.pvb_attributes; vb_loc=pvb.pvb_loc; }) @@ -5129,16 +6049,25 @@ and type_let and type_andops env sarg sands expected_ty = let rec loop env let_sarg rev_sands expected_ty = match rev_sands with - | [] -> type_expect env let_sarg (mk_expected expected_ty), [] + | [] -> + type_expect env mode_global let_sarg + (mk_expected expected_ty), + [] | { pbop_op = sop; pbop_exp = sexp; pbop_loc = loc; _ } :: rest -> if !Clflags.principal then begin_def (); let op_path, op_desc = type_binding_op_ident env sop in - let op_type = instance op_desc.val_type in + let op_type = op_desc.val_type in let ty_arg = newvar () in let ty_rest = newvar () in let ty_result = newvar() in - let ty_rest_fun = newty (Tarrow(Nolabel, ty_arg, ty_result, Cok)) in - let ty_op = newty (Tarrow(Nolabel, ty_rest, ty_rest_fun, Cok)) in + let ty_rest_fun = + newty (Tarrow((Nolabel,Alloc_mode.global,Alloc_mode.global), + ty_arg, ty_result, Cok)) + in + let ty_op = + newty (Tarrow((Nolabel,Alloc_mode.global,Alloc_mode.global), + ty_rest, ty_rest_fun, Cok)) + in begin try unify env op_type ty_op with Unify trace -> @@ -5151,7 +6080,9 @@ and type_andops env sarg sands expected_ty = generalize_structure ty_result end; let let_arg, rest = loop env let_sarg rest ty_rest in - let exp = type_expect env sexp (mk_expected ty_arg) in + let exp = + type_expect env mode_global sexp (mk_expected ty_arg) + in begin try unify env (instance ty_result) (instance expected_ty) with Unify trace -> @@ -5170,17 +6101,20 @@ and type_andops env sarg sands expected_ty = let let_arg, rev_ands = loop env sarg (List.rev sands) expected_ty in let_arg, List.rev rev_ands - and type_extension ~loc ~env ~ty_expected ~sexp = function + and type_extension ~loc ~env ~ty_expected ~expected_mode ~sexp = function | Extensions.Eexp_list_comprehension (sbody, comp_typell) -> - type_comprehension ~loc ~env ~ty_expected ~sexp ~sbody ~comp_typell + type_comprehension ~loc ~env ~ty_expected ~expected_mode + ~sexp ~sbody ~comp_typell ~container_type:Predef.type_list ~build:(fun body comp_type -> Texp_list_comprehension (body, comp_type)) | Extensions.Eexp_arr_comprehension (sbody, comp_typell) -> - type_comprehension ~loc ~env ~ty_expected ~sexp ~sbody ~comp_typell + type_comprehension ~loc ~env ~ty_expected ~expected_mode + ~sexp ~sbody ~comp_typell ~container_type:Predef.type_array ~build:(fun body comp_type -> Texp_arr_comprehension (body, comp_type)) - and type_comprehension ~loc ~env ~ty_expected ~sexp ~sbody ~comp_typell + and type_comprehension ~loc ~env ~ty_expected ~(expected_mode : expected_mode) + ~sexp ~sbody ~comp_typell ~container_type ~build = if !Clflags.principal then begin_def (); let without_arr_ty = Ctype.newvar () in @@ -5190,14 +6124,16 @@ and type_andops env sarg sands expected_ty = end_def(); generalize_structure without_arr_ty; end; + let env = Env.add_lock Value_mode.global env in let comp_type, new_env = type_comprehension_list ~loc ~env ~container_type ~comp_typell in - let body = type_expect new_env sbody (mk_expected without_arr_ty) in + let body = type_expect new_env mode_global sbody (mk_expected without_arr_ty) in re { exp_desc = build body comp_type; exp_loc = loc; exp_extra = []; exp_type = instance (container_type body.exp_type); + exp_mode = expected_mode.mode; exp_attributes = sexp.pexp_attributes; exp_env = env } @@ -5205,9 +6141,9 @@ and type_andops env sarg sands expected_ty = ~(comp_type : Extensions.comprehension_clause) = let comp, env = match comp_type with | From_to (param, slow, shigh, dir) -> - let low = type_expect env slow + let low = type_expect env mode_global slow (mk_expected ~explanation:For_loop_start_index Predef.type_int) in - let high = type_expect env shigh + let high = type_expect env mode_global shigh (mk_expected ~explanation:For_loop_stop_index Predef.type_int) in let id, new_env = type_for_loop_index ~loc ~env:body_env ~param Predef.type_int @@ -5216,10 +6152,11 @@ and type_andops env sarg sands expected_ty = | In (param, siter) -> let item_ty = newvar() in let iter_ty = instance (container_type item_ty) in - let iter = type_expect env siter + let iter = type_expect env mode_global siter (mk_expected ~explanation:In_comprehension_argument iter_ty) in let pat = - type_pat Value ~no_existentials:In_self_pattern (ref env) param item_ty + let alloc_mode = simple_pat_mode Value_mode.global in + type_pat Value ~no_existentials:In_self_pattern ~alloc_mode (ref env) param item_ty in let pv = !pattern_variables in pattern_variables := []; @@ -5254,7 +6191,7 @@ and type_andops env sarg sands expected_ty = clauses ([], env) in - let new_guard = Option.map (fun gu -> type_expect new_env gu + let new_guard = Option.map (fun gu -> type_expect new_env mode_global gu (mk_expected ~explanation:When_guard Predef.type_bool)) guard in {clauses=new_comps; guard=new_guard}, new_env @@ -5294,7 +6231,7 @@ let type_let existential_ctx env rec_flag spat_sexp_list = let type_expression env sexp = Typetexp.reset_type_variables(); begin_def(); - let exp = type_exp env sexp in + let exp = type_exp env mode_global sexp in end_def(); if maybe_expansive exp then lower_contravariant env exp.exp_type; generalize exp.exp_type; @@ -5302,7 +6239,9 @@ let type_expression env sexp = Pexp_ident lid -> let loc = sexp.pexp_loc in (* Special case for keeping type variables when looking-up a variable *) - let (_path, desc) = Env.lookup_value ~use:false ~loc lid.txt env in + let (_path, desc, _mode) = + Env.lookup_value ~use:false ~loc lid.txt env + in {exp with exp_type = desc.val_type} | _ -> exp @@ -5396,6 +6335,23 @@ let report_type_expected_explanation expl ppf = | When_guard -> because "a when-guard" +let escaping_hint reason context = + match reason, context with + | `Locality, Some Return -> + [ Location.msg + "@[Hint: Cannot return local value without an explicit@ \ + \"local_\" annotation@]" ] + | `Locality, Some Tailcall_argument -> + [ Location.msg + "@[Hint: This argument cannot be local, because this is a tail call@]" ] + | `Locality, Some Tailcall_function -> + [ Location.msg + "@[Hint: This function cannot be local, because this is a tail call@]" ] + | `Regionality, Some Partial_application -> + [ Location.msg + "@[Hint: It is captured by a partial application@]" ] + | _, _ -> [] + let report_type_expected_explanation_opt expl ppf = match expl with | None -> () @@ -5776,6 +6732,26 @@ let report_error ~loc env = function fprintf ppf "These bindings have type") (function ppf -> fprintf ppf "but bindings were expected of type") + | Local_value_escapes(reason, context) -> + let sub = escaping_hint reason context in + let mode = + match reason with + | `Locality -> "local " + | `Regionality -> "" + in + Location.errorf ~loc ~sub "This %svalue escapes its region" mode + | Param_mode_mismatch ty -> + Location.errorf ~loc + "@[This function has a local parameter, but was expected to have type:@ %a@]" + Printtyp.type_expr ty + | Uncurried_function_escapes -> + Location.errorf ~loc + "This function or one of its parameters escape their region@ \ + when it is partially applied" + | Local_return_annotation_mismatch _ -> + Location.errorf ~loc + "This function return is not annotated with \"local_\"@ \ + whilst other returns were." let report_error ~loc env err = Printtyp.wrap_printing_env ~error:true env @@ -5797,7 +6773,7 @@ let () = Env.add_delayed_check_forward := add_delayed_check; () -(* drop ?recarg argument from the external API *) -let type_expect ?in_function env e ty = type_expect ?in_function env e ty -let type_exp env e = type_exp env e -let type_argument env e t1 t2 = type_argument env e t1 t2 +(* drop unnecessary arguments from the external API *) +let type_expect env e ty = type_expect env mode_global e ty +let type_exp env e = type_exp env mode_global e +let type_argument env e t1 t2 = type_argument env mode_global e t1 t2 diff --git a/typing/typecore.mli b/typing/typecore.mli index 73c2cfaa667..12aaa6302ff 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -78,6 +78,12 @@ type existential_restriction = | In_class_def (** or in [class c = let ... in ...] *) | In_self_pattern (** or in self pattern *) +type escaping_context = + | Return + | Tailcall_argument + | Tailcall_function + | Partial_application + val type_binding: Env.t -> rec_flag -> Parsetree.value_binding list -> @@ -104,7 +110,6 @@ val check_partial: ?lev:int -> Env.t -> type_expr -> Location.t -> Typedtree.value Typedtree.case list -> Typedtree.partial val type_expect: - ?in_function:(Location.t * type_expr) -> Env.t -> Parsetree.expression -> type_expected -> Typedtree.expression val type_exp: Env.t -> Parsetree.expression -> Typedtree.expression @@ -114,16 +119,24 @@ val type_argument: Env.t -> Parsetree.expression -> type_expr -> type_expr -> Typedtree.expression -val option_some: Env.t -> Typedtree.expression -> Typedtree.expression -val option_none: Env.t -> type_expr -> Location.t -> Typedtree.expression +val option_some: + Env.t -> Typedtree.expression -> value_mode -> Typedtree.expression +val option_none: + Env.t -> type_expr -> value_mode -> Location.t -> Typedtree.expression val extract_option_type: Env.t -> type_expr -> type_expr val generalizable: int -> type_expr -> bool val reset_delayed_checks: unit -> unit val force_delayed_checks: unit -> unit +val reset_allocations: unit -> unit +val optimise_allocations: unit -> unit + + val name_pattern : string -> Typedtree.pattern list -> Ident.t val name_cases : string -> Typedtree.value Typedtree.case list -> Ident.t +val escape : loc:Location.t -> env:Env.t -> value_mode -> unit + val self_coercion : (Path.t * Location.t list ref) list ref type error = @@ -194,6 +207,10 @@ type error = | Letop_type_clash of string * Ctype.Unification_trace.t | Andop_type_clash of string * Ctype.Unification_trace.t | Bindings_type_clash of Ctype.Unification_trace.t + | Local_value_escapes of Btype.Value_mode.error * escaping_context option + | Param_mode_mismatch of type_expr + | Uncurried_function_escapes + | Local_return_annotation_mismatch of Location.t exception Error of Location.t * Env.t * error exception Error_forward of Location.error diff --git a/typing/typedecl.ml b/typing/typedecl.ml index 2b4caa6a0b8..5e3b7a99ea6 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -200,6 +200,16 @@ let make_params env params = in List.map make_param params +let has_global_attr attributes = + List.exists + (fun attr -> String.equal attr.attr_name.txt "ocaml.global") + attributes + +let has_nonlocal_attr attributes = + List.exists + (fun attr -> String.equal attr.attr_name.txt "ocaml.nonlocal") + attributes + let transl_labels env closed lbls = assert (lbls <> []); let all_labels = ref String.Set.empty in @@ -214,7 +224,7 @@ let transl_labels env closed lbls = Builtin_attributes.warning_scope attrs (fun () -> let arg = Ast_helper.Typ.force_poly arg in - let cty = transl_simple_type env closed arg in + let cty = transl_simple_type env closed Global arg in {ld_id = Ident.create_local name.txt; ld_name = name; ld_mutable = mut; ld_type = cty; ld_loc = loc; ld_attributes = attrs} @@ -226,8 +236,20 @@ let transl_labels env closed lbls = (fun ld -> let ty = ld.ld_type.ctyp_type in let ty = match ty.desc with Tpoly(t,[]) -> t | _ -> ty in + let gbl = + match ld.ld_mutable with + | Mutable -> Types.Global + | Immutable -> + if has_global_attr ld.ld_attributes then + Types.Global + else if has_nonlocal_attr ld.ld_attributes then + Types.Nonlocal + else + Types.Unrestricted + in {Types.ld_id = ld.ld_id; ld_mutable = ld.ld_mutable; + ld_global = gbl; ld_type = ty; ld_loc = ld.ld_loc; ld_attributes = ld.ld_attributes; @@ -239,7 +261,7 @@ let transl_labels env closed lbls = let transl_constructor_arguments env closed = function | Pcstr_tuple l -> - let l = List.map (transl_simple_type env closed) l in + let l = List.map (transl_simple_type env closed Global) l in Types.Cstr_tuple (List.map (fun t -> t.ctyp_type) l), Cstr_tuple l | Pcstr_record l -> @@ -262,7 +284,7 @@ let make_constructor env type_path type_params sargs sret_type = let args, targs = transl_constructor_arguments env false sargs in - let tret_type = transl_simple_type env false sret_type in + let tret_type = transl_simple_type env false Global sret_type in let ret_type = tret_type.ctyp_type in (* TODO add back type_path as a parameter ? *) begin match (Ctype.repr ret_type).desc with @@ -282,8 +304,8 @@ let transl_declaration env sdecl (id, uid) = let params = List.map (fun (cty, _) -> cty.ctyp_type) tparams in let cstrs = List.map (fun (sty, sty', loc) -> - transl_simple_type env false sty, - transl_simple_type env false sty', loc) + transl_simple_type env false Global sty, + transl_simple_type env false Global sty', loc) sdecl.ptype_cstrs in let raw_status = get_unboxed_from_attributes sdecl in @@ -393,7 +415,7 @@ let transl_declaration env sdecl (id, uid) = None -> None, None | Some sty -> let no_row = not (is_fixed_type sdecl) in - let cty = transl_simple_type env no_row sty in + let cty = transl_simple_type env no_row Global sty in Some cty, Some cty.ctyp_type in let arity = List.length params in @@ -1280,28 +1302,45 @@ let make_native_repr env core_type ty ~global_repr = error_if_has_deep_native_repr_attributes core_type; match get_native_repr_attribute core_type.ptyp_attributes ~global_repr with | Native_repr_attr_absent -> - Primitive.Prim_global, Same_as_ocaml_repr + Same_as_ocaml_repr | Native_repr_attr_present kind -> begin match native_repr_of_type env kind ty with | None -> raise (Error (core_type.ptyp_loc, Cannot_unbox_or_untag_type kind)) - | Some repr -> Primitive.Prim_global, repr + | Some repr -> repr end -let rec parse_native_repr_attributes env core_type ty ~global_repr = +let prim_const_mode m = + match Btype.Alloc_mode.check_const m with + | Some Global -> Prim_global + | Some Local -> Prim_local + | None -> assert false + +let rec parse_native_repr_attributes env core_type ty rmode ~global_repr = match core_type.ptyp_desc, (Ctype.repr ty).desc, get_native_repr_attribute core_type.ptyp_attributes ~global_repr:None with | Ptyp_arrow _, Tarrow _, Native_repr_attr_present kind -> raise (Error (core_type.ptyp_loc, Cannot_unbox_or_untag_type kind)) - | Ptyp_arrow (_, ct1, ct2), Tarrow (_, t1, t2, _), _ -> + | Ptyp_arrow (_, ct1, ct2), Tarrow ((_,marg,mret), t1, t2, _), _ + when not (Builtin_attributes.has_curry core_type.ptyp_attributes) -> let repr_arg = make_native_repr env ct1 t1 ~global_repr in + let mode = + if Builtin_attributes.has_local_opt ct1.ptyp_attributes + then Prim_poly + else prim_const_mode marg + in let repr_args, repr_res = - parse_native_repr_attributes env ct2 t2 ~global_repr + parse_native_repr_attributes env ct2 t2 (prim_const_mode mret) ~global_repr in - (repr_arg :: repr_args, repr_res) - | Ptyp_arrow _, _, _ | _, Tarrow _, _ -> assert false - | _ -> ([], make_native_repr env core_type ty ~global_repr) + ((mode,repr_arg) :: repr_args, repr_res) + | _ -> + let rmode = + if Builtin_attributes.has_local_opt core_type.ptyp_attributes + then Prim_poly + else rmode + in + ([], (rmode, make_native_repr env core_type ty ~global_repr)) let check_unboxable env loc ty = @@ -1347,7 +1386,7 @@ let transl_value_decl env loc valdecl = | Native_repr_attr_absent -> None in let native_repr_args, native_repr_res = - parse_native_repr_attributes env valdecl.pval_type ty ~global_repr + parse_native_repr_attributes env valdecl.pval_type ty Prim_global ~global_repr in let prim = Primitive.parse_declaration valdecl @@ -1412,8 +1451,8 @@ let transl_with_constraint id row_path ~sig_env ~sig_decl ~outer_env sdecl = let arity = List.length params in let constraints = List.map (fun (ty, ty', loc) -> - let cty = transl_simple_type env false ty in - let cty' = transl_simple_type env false ty' in + let cty = transl_simple_type env false Global ty in + let cty' = transl_simple_type env false Global ty' in (* Note: We delay the unification of those constraints after the unification of parameters, so that clashing constraints report an error on the constraint location @@ -1425,7 +1464,7 @@ let transl_with_constraint id row_path ~sig_env ~sig_decl ~outer_env sdecl = let (tman, man) = match sdecl.ptype_manifest with None -> None, None | Some sty -> - let cty = transl_simple_type env no_row sty in + let cty = transl_simple_type env no_row Global sty in Some cty, Some cty.ctyp_type in (* In the second part, we check the consistency between the two diff --git a/typing/typedtree.ml b/typing/typedtree.ml index d97f8b6bc0e..2bba65ded03 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -40,6 +40,7 @@ and 'a pattern_data = pat_loc: Location.t; pat_extra : (pat_extra * Location.t * attribute list) list; pat_type: type_expr; + pat_mode: value_mode; pat_env: Env.t; pat_attributes: attribute list; } @@ -85,6 +86,7 @@ and expression = exp_loc: Location.t; exp_extra: (exp_extra * Location.t * attribute list) list; exp_type: type_expr; + exp_mode: value_mode; exp_env: Env.t; exp_attributes: attribute list; } @@ -96,12 +98,13 @@ and exp_extra = | Texp_newtype of string and expression_desc = - Texp_ident of Path.t * Longident.t loc * Types.value_description + Texp_ident of + Path.t * Longident.t loc * Types.value_description * ident_kind | Texp_constant of constant | Texp_let of rec_flag * value_binding list * expression | Texp_function of { arg_label : arg_label; param : Ident.t; - cases : value case list; partial : partial; } - | Texp_apply of expression * (arg_label * expression option) list + cases : value case list; partial : partial; region : bool; } + | Texp_apply of expression * (arg_label * apply_arg) list * apply_position | Texp_match of expression * computation case list * partial | Texp_try of expression * value case list | Texp_tuple of expression list @@ -127,8 +130,9 @@ and expression_desc = | Texp_for of Ident.t * Parsetree.pattern * expression * expression * direction_flag * expression - | Texp_send of expression * meth * expression option - | Texp_new of Path.t * Longident.t loc * Types.class_declaration + | Texp_send of expression * meth * expression option * apply_position + | Texp_new of + Path.t * Longident.t loc * Types.class_declaration * apply_position | Texp_instvar of Path.t * Path.t * string loc | Texp_setinstvar of Path.t * Path.t * string loc * expression | Texp_override of Path.t * (Path.t * string loc * expression) list @@ -153,6 +157,8 @@ and expression_desc = | Texp_probe of { name:string; handler:expression; } | Texp_probe_is_enabled of { name:string } +and ident_kind = Id_value | Id_prim of Types.alloc_mode + and meth = Tmeth_name of string | Tmeth_val of Ident.t @@ -189,6 +195,21 @@ and binding_op = bop_loc : Location.t; } +and ('a, 'b) arg_or_omitted = + | Arg of 'a + | Omitted of 'b + +and omitted_parameter = + { mode_closure : alloc_mode; + mode_arg : alloc_mode; + mode_ret : alloc_mode } + +and apply_arg = (expression, omitted_parameter) arg_or_omitted + +and apply_position = + | Tail + | Nontail + (* Value expressions for the class language *) and class_expr = @@ -206,7 +227,7 @@ and class_expr_desc = | Tcl_fun of arg_label * pattern * (Ident.t * expression) list * class_expr * partial - | Tcl_apply of class_expr * (arg_label * expression option) list + | Tcl_apply of class_expr * (arg_label * apply_arg) list | Tcl_let of rec_flag * value_binding list * (Ident.t * expression) list * class_expr | Tcl_constraint of @@ -346,6 +367,7 @@ and primitive_coercion = { pc_desc: Primitive.description; pc_type: type_expr; + pc_poly_mode: alloc_mode; pc_env: Env.t; pc_loc : Location.t; } @@ -638,6 +660,7 @@ let as_computation_pattern (p : pattern) : computation general_pattern = pat_loc = p.pat_loc; pat_extra = []; pat_type = p.pat_type; + pat_mode = p.pat_mode; pat_env = p.pat_env; pat_attributes = []; } @@ -756,7 +779,7 @@ let rec iter_bound_idents : type k . _ -> k general_pattern -> _ = fun f pat -> match pat.pat_desc with - | Tpat_var (id,s) -> + | Tpat_var (id, s) -> f (id,s,pat.pat_type) | Tpat_alias(p, id, s) -> iter_bound_idents f p; @@ -789,6 +812,23 @@ let rev_let_bound_idents_full bindings = List.iter (fun vb -> iter_bound_idents add vb.vb_pat) bindings; !idents_full +let let_bound_idents_with_modes bindings = + let modes = Ident.Tbl.create 3 in + let rec loop : type k . k general_pattern -> _ = + fun pat -> + match pat.pat_desc with + | Tpat_var (id, { loc }) -> + Ident.Tbl.add modes id (loc, pat.pat_mode) + | Tpat_alias(p, id, { loc }) -> + loop p; + Ident.Tbl.add modes id (loc, pat.pat_mode) + | d -> shallow_iter_pattern_desc { f = loop } d + in + List.iter (fun vb -> loop vb.vb_pat) bindings; + List.rev_map + (fun (id, _, _) -> id, List.rev (Ident.Tbl.find_all modes id)) + (rev_let_bound_idents_full bindings) + let let_bound_idents_full bindings = List.rev (rev_let_bound_idents_full bindings) let let_bound_idents pat = diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 562f6f75b46..56c8e0e97df 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -49,6 +49,7 @@ and 'a pattern_data = pat_loc: Location.t; pat_extra : (pat_extra * Location.t * attributes) list; pat_type: Types.type_expr; + pat_mode: Types.value_mode; pat_env: Env.t; pat_attributes: attributes; } @@ -150,6 +151,7 @@ and expression = exp_loc: Location.t; exp_extra: (exp_extra * Location.t * attributes) list; exp_type: Types.type_expr; + exp_mode: Types.value_mode; exp_env: Env.t; exp_attributes: attributes; } @@ -167,7 +169,8 @@ and exp_extra = (** fun (type t) -> *) and expression_desc = - Texp_ident of Path.t * Longident.t loc * Types.value_description + Texp_ident of + Path.t * Longident.t loc * Types.value_description * ident_kind (** x M.x *) @@ -178,7 +181,7 @@ and expression_desc = let rec P1 = E1 and ... and Pn = EN in E (flag = Recursive) *) | Texp_function of { arg_label : arg_label; param : Ident.t; - cases : value case list; partial : partial; } + cases : value case list; partial : partial; region : bool } (** [Pexp_fun] and [Pexp_function] both translate to [Texp_function]. See {!Parsetree} for more details. @@ -189,10 +192,10 @@ and expression_desc = [Partial] if the pattern match is partial [Total] otherwise. *) - | Texp_apply of expression * (arg_label * expression option) list + | Texp_apply of expression * (arg_label * apply_arg) list * apply_position (** E0 ~l1:E1 ... ~ln:En - The expression can be None if the expression is abstracted over + The expression can be Omitted if the expression is abstracted over this argument. It currently appears when a label is applied. For example: @@ -201,7 +204,7 @@ and expression_desc = The resulting typedtree for the application is: Texp_apply (Texp_ident "f/1037", - [(Nolabel, None); + [(Nolabel, Omitted _); (Labelled "y", Some (Texp_constant Const_int 3)) ]) *) @@ -255,8 +258,9 @@ and expression_desc = | Texp_for of Ident.t * Parsetree.pattern * expression * expression * direction_flag * expression - | Texp_send of expression * meth * expression option - | Texp_new of Path.t * Longident.t loc * Types.class_declaration + | Texp_send of expression * meth * expression option * apply_position + | Texp_new of + Path.t * Longident.t loc * Types.class_declaration * apply_position | Texp_instvar of Path.t * Path.t * string loc | Texp_setinstvar of Path.t * Path.t * string loc * expression | Texp_override of Path.t * (Path.t * string loc * expression) list @@ -282,6 +286,8 @@ and expression_desc = | Texp_probe of { name:string; handler:expression; } | Texp_probe_is_enabled of { name:string } +and ident_kind = Id_value | Id_prim of Types.alloc_mode + and meth = Tmeth_name of string | Tmeth_val of Ident.t @@ -320,6 +326,21 @@ and binding_op = bop_loc : Location.t; } +and ('a, 'b) arg_or_omitted = + | Arg of 'a + | Omitted of 'b + +and omitted_parameter = + { mode_closure : Types.alloc_mode; + mode_arg : Types.alloc_mode; + mode_ret : Types.alloc_mode } + +and apply_arg = (expression, omitted_parameter) arg_or_omitted + +and apply_position = + | Tail + | Nontail + (* Value expressions for the class language *) and class_expr = @@ -337,7 +358,7 @@ and class_expr_desc = | Tcl_fun of arg_label * pattern * (Ident.t * expression) list * class_expr * partial - | Tcl_apply of class_expr * (arg_label * expression option) list + | Tcl_apply of class_expr * (arg_label * apply_arg) list | Tcl_let of rec_flag * value_binding list * (Ident.t * expression) list * class_expr | Tcl_constraint of @@ -482,6 +503,7 @@ and primitive_coercion = { pc_desc: Primitive.description; pc_type: Types.type_expr; + pc_poly_mode: Types.alloc_mode; pc_env: Env.t; pc_loc : Location.t; } @@ -800,6 +822,9 @@ val exists_pattern: (pattern -> bool) -> pattern -> bool val let_bound_idents: value_binding list -> Ident.t list val let_bound_idents_full: value_binding list -> (Ident.t * string loc * Types.type_expr) list +val let_bound_idents_with_modes: + value_binding list + -> (Ident.t * (Location.t * Types.value_mode) list) list (** Alpha conversion of patterns *) val alpha_pat: diff --git a/typing/typemod.ml b/typing/typemod.ml index 69f4b87e799..aa92a0daf64 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -20,7 +20,7 @@ open Asttypes open Parsetree open Types open Format - +module Value_mode = Btype.Value_mode module String = Misc.Stdlib.String module Sig_component_kind = struct @@ -1624,12 +1624,12 @@ let path_of_module mexp = (* Check that all core type schemes in a structure are closed *) -let rec closed_modtype env = function +let rec check_modtype env f = function Mty_ident _ -> true | Mty_alias _ -> true | Mty_signature sg -> let env = Env.add_signature sg env in - List.for_all (closed_signature_item env) sg + List.for_all (check_signature_item env f) sg | Mty_functor(arg_opt, body) -> let env = match arg_opt with @@ -1638,26 +1638,37 @@ let rec closed_modtype env = function | Named (Some id, param) -> Env.add_module ~arg:true id Mp_present param env in - closed_modtype env body + check_modtype env f body -and closed_signature_item env = function - Sig_value(_id, desc, _) -> Ctype.closed_schema env desc.val_type - | Sig_module(_id, _, md, _, _) -> closed_modtype env md.md_type +and check_signature_item env f = function + Sig_value(_id, desc, _) -> f desc.val_type + | Sig_module(_id, _, md, _, _) -> check_modtype env f md.md_type | _ -> true let check_nongen_scheme env sig_item = + let check ty = + Ctype.remove_mode_variables ty; Ctype.closed_schema env ty + in + let ok = check_signature_item env check sig_item in match sig_item with - Sig_value(_id, vd, _) -> - if not (Ctype.closed_schema env vd.val_type) then - raise (Error (vd.val_loc, env, Non_generalizable vd.val_type)) - | Sig_module (_id, _, md, _, _) -> - if not (closed_modtype env md.md_type) then - raise(Error(md.md_loc, env, Non_generalizable_module md.md_type)) + Sig_value(_id, vd, _) when not ok -> + raise (Error (vd.val_loc, env, Non_generalizable vd.val_type)) + | Sig_module (_id, _, md, _, _) when not ok -> + raise(Error(md.md_loc, env, Non_generalizable_module md.md_type)) | _ -> () let check_nongen_schemes env sg = List.iter (check_nongen_scheme env) sg +let closed_modtype env mty = + let check ty = + Ctype.remove_mode_variables ty; Ctype.closed_schema env ty + in check_modtype env check mty + +let remove_mode_variables env sg = + let rm ty = Ctype.remove_mode_variables ty; true in + List.for_all (check_signature_item env rm) sg |> ignore + (* Helpers for typing recursive modules *) let anchor_submodule name anchor = @@ -1948,6 +1959,7 @@ and type_module_aux ~alias sttn funct_body anchor env smod = in Named (id, param, mty), Types.Named (id, mty.mty_type), newenv, true in + let newenv = Env.add_lock Value_mode.global newenv in let body = type_module sttn funct_body None newenv sbody in { mod_desc = Tmod_functor(t_arg, body); mod_type = Mty_functor(ty_arg, body.mod_type); @@ -2157,13 +2169,23 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr = let () = if rec_flag = Recursive then Typecore.check_recursive_bindings env defs in + if toplevel then begin + (* Values bound by '_' still escape in the toplevel, because + they may be printed even though they are not named *) + defs |> List.iter (fun vb -> + Typecore.escape ~loc:vb.vb_pat.pat_loc ~env:newenv vb.vb_expr.exp_mode); + end; (* Note: Env.find_value does not trigger the value_used event. Values will be marked as being used during the signature inclusion test. *) Tstr_value(rec_flag, defs), - List.map (fun (id, { Asttypes.loc; _ }, _typ)-> - Signature_names.check_value names loc id; + List.map (fun (id, modes) -> + List.iter + (fun (loc, mode) -> Typecore.escape ~loc ~env:newenv mode) + modes; + let (first_loc, _) = List.hd modes in + Signature_names.check_value names first_loc id; Sig_value(id, Env.find_value (Pident id) newenv, Exported) - ) (let_bound_idents_full defs), + ) (let_bound_idents_with_modes defs), newenv | Pstr_primitive sdesc -> let (desc, newenv) = Typedecl.transl_value_decl env loc sdesc in @@ -2447,11 +2469,28 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr = if toplevel then run () else Builtin_attributes.warning_scope [] run +(* The toplevel will print some types not present in the signature *) +let remove_mode_variables_for_toplevel str = + match str.str_items with + | [{ str_desc = + ( Tstr_eval (exp, _) + | Tstr_value (Nonrecursive, + [{vb_pat = {pat_desc=Tpat_any}; + vb_expr = exp}])) }] -> + (* These types are printed by the toplevel, + even though they do not appear in sg *) + Ctype.remove_mode_variables exp.exp_type + | _ -> () + let type_toplevel_phrase env s = Env.reset_required_globals (); Env.reset_probes (); + Typecore.reset_allocations (); let (str, sg, to_remove_from_sg, env) = type_structure ~toplevel:true false None env s in + remove_mode_variables env sg; + remove_mode_variables_for_toplevel str; + Typecore.optimise_allocations (); (str, sg, to_remove_from_sg, env) let type_module_alias = type_module ~alias:true true false None @@ -2627,6 +2666,7 @@ let type_implementation sourcefile outputprefix modulename initial_env ast = Cmt_format.clear (); Misc.try_finally (fun () -> Typecore.reset_delayed_checks (); + Typecore.reset_allocations (); Env.reset_required_globals (); Env.reset_probes (); if !Clflags.print_types then (* #7656 *) @@ -2636,6 +2676,7 @@ let type_implementation sourcefile outputprefix modulename initial_env ast = let simple_sg = Signature_names.simplify finalenv names sg in if !Clflags.print_types then begin Typecore.force_delayed_checks (); + Typecore.optimise_allocations (); Printtyp.wrap_printing_env ~error:false initial_env (fun () -> fprintf std_formatter "%a@." (Printtyp.printed_signature sourcefile) simple_sg @@ -2658,6 +2699,7 @@ let type_implementation sourcefile outputprefix modulename initial_env ast = sourcefile sg intf_file dclsig in Typecore.force_delayed_checks (); + Typecore.optimise_allocations (); (* It is important to run these checks after the inclusion test above, so that value declarations which are not used internally but exported are not reported as being unused. *) @@ -2674,6 +2716,7 @@ let type_implementation sourcefile outputprefix modulename initial_env ast = check_nongen_schemes finalenv simple_sg; normalize_signature simple_sg; Typecore.force_delayed_checks (); + Typecore.optimise_allocations (); (* See comment above. Here the target signature contains all the value being exported. We can still capture unused declarations like "let x = true;; let x = 1;;", because in this diff --git a/typing/types.ml b/typing/types.ml index 3b2da9d396c..49372bb3369 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -27,7 +27,7 @@ type type_expr = and type_desc = Tvar of string option - | Tarrow of arg_label * type_expr * type_expr * commutable + | Tarrow of arrow_desc * type_expr * type_expr * commutable | Ttuple of type_expr list | Tconstr of Path.t * type_expr list * abbrev_memo ref | Tobject of type_expr * (Path.t * type_expr list) option ref @@ -40,6 +40,22 @@ and type_desc = | Tpoly of type_expr * type_expr list | Tpackage of Path.t * Longident.t list * type_expr list +and arrow_desc = + arg_label * alloc_mode * alloc_mode + +and alloc_mode_const = Global | Local + +and alloc_mode_var = { + mutable upper: alloc_mode_const; + mutable lower: alloc_mode_const; + mutable vlower: alloc_mode_var list; + mvid: int; +} + +and alloc_mode = + | Amode of alloc_mode_const + | Amodevar of alloc_mode_var + and row_desc = { row_fields: (label * row_field) list; row_more: type_expr; @@ -250,10 +266,16 @@ and record_representation = | Record_inlined of int (* Inlined record *) | Record_extension of Path.t (* Inlined record under extension *) +and global_flag = + | Global + | Nonlocal + | Unrestricted + and label_declaration = { ld_id: Ident.t; ld_mutable: mutable_flag; + ld_global: global_flag; ld_type: type_expr; ld_loc: Location.t; ld_attributes: Parsetree.attributes; @@ -448,6 +470,7 @@ type label_description = lbl_res: type_expr; (* Type of the result *) lbl_arg: type_expr; (* Type of the argument *) lbl_mut: mutable_flag; (* Is this a mutable field? *) + lbl_global: global_flag; (* Is this a global field? *) lbl_pos: int; (* Position in block *) lbl_all: label_description array; (* All the labels in this type *) lbl_repres: record_representation; (* Representation for this record *) @@ -476,3 +499,7 @@ let signature_item_id = function | Sig_class (id, _, _, _) | Sig_class_type (id, _, _, _) -> id + +type value_mode = + { r_as_l : alloc_mode; + r_as_g : alloc_mode; } diff --git a/typing/types.mli b/typing/types.mli index 98bd408f72f..74b2b1e7150 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -66,7 +66,7 @@ and type_desc = (** [Tvar (Some "a")] ==> ['a] or ['_a] [Tvar None] ==> [_] *) - | Tarrow of arg_label * type_expr * type_expr * commutable + | Tarrow of arrow_desc * type_expr * type_expr * commutable (** [Tarrow (Nolabel, e1, e2, c)] ==> [e1 -> e2] [Tarrow (Labelled "l", e1, e2, c)] ==> [l:e1 -> e2] [Tarrow (Optional "l", e1, e2, c)] ==> [?l:e1 -> e2] @@ -129,6 +129,23 @@ and type_desc = | Tpackage of Path.t * Longident.t list * type_expr list (** Type of a first-class module (a.k.a package). *) +and arrow_desc = + arg_label * alloc_mode * alloc_mode + +and alloc_mode_const = Global | Local + +and alloc_mode_var = { + mutable upper: alloc_mode_const; + mutable lower: alloc_mode_const; + mutable vlower: alloc_mode_var list; + mvid: int; +} + +and alloc_mode = + | Amode of alloc_mode_const + | Amodevar of alloc_mode_var + + (** [ `X | `Y ] (row_closed = true) [< `X | `Y ] (row_closed = true) [> `X | `Y ] (row_closed = false) @@ -377,10 +394,16 @@ and record_representation = | Record_inlined of int (* Inlined record *) | Record_extension of Path.t (* Inlined record under extension *) +and global_flag = + | Global + | Nonlocal + | Unrestricted + and label_declaration = { ld_id: Ident.t; ld_mutable: mutable_flag; + ld_global: global_flag; ld_type: type_expr; ld_loc: Location.t; ld_attributes: Parsetree.attributes; @@ -568,6 +591,7 @@ type label_description = lbl_res: type_expr; (* Type of the result *) lbl_arg: type_expr; (* Type of the argument *) lbl_mut: mutable_flag; (* Is this a mutable field? *) + lbl_global: global_flag; (* Is this a nonlocal field? *) lbl_pos: int; (* Position in block *) lbl_all: label_description array; (* All the labels in this type *) lbl_repres: record_representation; (* Representation for this record *) @@ -584,3 +608,8 @@ type label_description = val bound_value_identifiers: signature -> Ident.t list val signature_item_id : signature_item -> Ident.t + +type value_mode = + (* See Btype.Value_mode *) + { r_as_l : alloc_mode; + r_as_g : alloc_mode; } diff --git a/typing/typetexp.ml b/typing/typetexp.ml index 84c5de3d59e..c2b02ce743b 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -23,6 +23,7 @@ open Parsetree open Typedtree open Types open Ctype +module Alloc_mode = Btype.Alloc_mode exception Already_bound @@ -155,17 +156,37 @@ let transl_type_param env styp = Builtin_attributes.warning_scope styp.ptyp_attributes (fun () -> transl_type_param env styp) +let rec extract_params styp = + let final styp = + let ret_mode = + if Builtin_attributes.has_local styp.ptyp_attributes then Alloc_mode.Local + else Alloc_mode.Global + in + [], styp, ret_mode + in + match styp.ptyp_desc with + | Ptyp_arrow (l, a, r) -> + let arg_mode = + if Builtin_attributes.has_local a.ptyp_attributes then Alloc_mode.Local + else Alloc_mode.Global + in + let params, ret, ret_mode = + if Builtin_attributes.has_curry r.ptyp_attributes then final r + else extract_params r + in + (l, arg_mode, a) :: params, ret, ret_mode + | _ -> final styp let new_pre_univar ?name () = let v = newvar ?name () in pre_univars := v :: !pre_univars; v type policy = Fixed | Extensible | Univars -let rec transl_type env policy styp = +let rec transl_type env policy mode styp = Builtin_attributes.warning_scope styp.ptyp_attributes - (fun () -> transl_type_aux env policy styp) + (fun () -> transl_type_aux env policy mode styp) -and transl_type_aux env policy styp = +and transl_type_aux env policy mode styp = let loc = styp.ptyp_loc in let ctyp ctyp_desc ctyp_type = { ctyp_desc; ctyp_type; ctyp_env = env; @@ -197,19 +218,38 @@ and transl_type_aux env policy styp = end in ctyp (Ttyp_var name) ty - | Ptyp_arrow(l, st1, st2) -> - let cty1 = transl_type env policy st1 in - let cty2 = transl_type env policy st2 in - let ty1 = cty1.ctyp_type in - let ty1 = - if Btype.is_optional l - then newty (Tconstr(Predef.path_option,[ty1], ref Mnil)) - else ty1 in - let ty = newty (Tarrow(l, ty1, cty2.ctyp_type, Cok)) in - ctyp (Ttyp_arrow (l, cty1, cty2)) ty + | Ptyp_arrow _ -> + let args, ret, ret_mode = extract_params styp in + let rec loop acc_mode args = + match args with + | (l, arg_mode, arg) :: rest -> + let arg_cty = transl_type env policy arg_mode arg in + let acc_mode = Alloc_mode.join_const acc_mode arg_mode in + let ret_mode = + match rest with + | [] -> ret_mode + | _ :: _ -> acc_mode + in + let ret_cty = loop acc_mode rest in + let arg_ty = arg_cty.ctyp_type in + let arg_ty = + if Btype.is_optional l + then newty (Tconstr(Predef.path_option,[arg_ty], ref Mnil)) + else arg_ty + in + let arg_mode = Alloc_mode.of_const arg_mode in + let ret_mode = Alloc_mode.of_const ret_mode in + let ty = + newty + (Tarrow((l,arg_mode,ret_mode), arg_ty, ret_cty.ctyp_type, Cok)) + in + ctyp (Ttyp_arrow (l, arg_cty, arg_cty)) ty + | [] -> transl_type env policy ret_mode ret + in + loop mode args | Ptyp_tuple stl -> assert (List.length stl >= 2); - let ctys = List.map (transl_type env policy) stl in + let ctys = List.map (transl_type env policy Alloc_mode.Global) stl in let ty = newty (Ttuple (List.map (fun ctyp -> ctyp.ctyp_type) ctys)) in ctyp (Ttyp_tuple ctys) ty | Ptyp_constr(lid, stl) -> @@ -224,7 +264,7 @@ and transl_type_aux env policy styp = raise(Error(styp.ptyp_loc, env, Type_arity_mismatch(lid.txt, decl.type_arity, List.length stl))); - let args = List.map (transl_type env policy) stl in + let args = List.map (transl_type env policy Alloc_mode.Global) stl in let params = instance_list decl.type_params in let unify_param = match decl.type_manifest with @@ -285,7 +325,7 @@ and transl_type_aux env policy styp = raise(Error(styp.ptyp_loc, env, Type_arity_mismatch(lid.txt, decl.type_arity, List.length stl))); - let args = List.map (transl_type env policy) stl in + let args = List.map (transl_type env policy Alloc_mode.Global) stl in let params = instance_list decl.type_params in List.iter2 (fun (sty, cty) ty' -> @@ -340,7 +380,7 @@ and transl_type_aux env policy styp = with Not_found -> instance (fst(TyVarMap.find alias !used_variables)) in - let ty = transl_type env policy st in + let ty = transl_type env policy mode st in begin try unify_var env t ty.ctyp_type with Unify trace -> let trace = Unification_trace.swap trace in raise(Error(styp.ptyp_loc, env, Alias_type_mismatch trace)) @@ -351,7 +391,7 @@ and transl_type_aux env policy styp = let t = newvar () in used_variables := TyVarMap.add alias (t, styp.ptyp_loc) !used_variables; - let ty = transl_type env policy st in + let ty = transl_type env policy mode st in begin try unify_var env t ty.ctyp_type with Unify trace -> let trace = Unification_trace.swap trace in raise(Error(styp.ptyp_loc, env, Alias_type_mismatch trace)) @@ -399,7 +439,8 @@ and transl_type_aux env policy styp = name := None; let tl = Builtin_attributes.warning_scope rf_attributes - (fun () -> List.map (transl_type env policy) stl) + (fun () -> + List.map (transl_type env policy Alloc_mode.Global) stl) in let f = match present with Some present when not (List.mem l.txt present) -> @@ -416,7 +457,7 @@ and transl_type_aux env policy styp = add_typed_field styp.ptyp_loc l.txt f; Ttag (l,c,tl) | Rinherit sty -> - let cty = transl_type env policy sty in + let cty = transl_type env policy Alloc_mode.Global sty in let ty = cty.ctyp_type in let nm = match repr cty.ctyp_type with @@ -480,7 +521,7 @@ and transl_type_aux env policy styp = let new_univars = List.map (fun name -> name, newvar ~name ()) vars in let old_univars = !univars in univars := new_univars @ !univars; - let cty = transl_type env policy st in + let cty = transl_type env policy mode st in let ty = cty.ctyp_type in univars := old_univars; end_def(); @@ -508,7 +549,7 @@ and transl_type_aux env policy styp = let mty = !transl_modtype env mty in widen z; let ptys = List.map (fun (s, pty) -> - s, transl_type env policy pty + s, transl_type env policy Alloc_mode.Global pty ) l in let path = !transl_modtype_longident styp.ptyp_loc env p.txt in let ty = newty (Tpackage (path, @@ -524,8 +565,8 @@ and transl_type_aux env policy styp = | Ptyp_extension ext -> raise (Error_forward (Builtin_attributes.error_of_extension ext)) -and transl_poly_type env policy t = - transl_type env policy (Ast_helper.Typ.force_poly t) +and transl_poly_type env policy mode t = + transl_type env policy mode (Ast_helper.Typ.force_poly t) and transl_fields env policy o fields = let hfields = Hashtbl.create 17 in @@ -545,14 +586,14 @@ and transl_fields env policy o fields = | Otag (s, ty1) -> begin let ty1 = Builtin_attributes.warning_scope of_attributes - (fun () -> transl_poly_type env policy ty1) + (fun () -> transl_poly_type env policy Alloc_mode.Global ty1) in let field = OTtag (s, ty1) in add_typed_field ty1.ctyp_loc s.txt ty1.ctyp_type; field end | Oinherit sty -> begin - let cty = transl_type env policy sty in + let cty = transl_type env policy Alloc_mode.Global sty in let nm = match repr cty.ctyp_type with {desc=Tconstr(p, _, _)} -> Some p @@ -589,7 +630,6 @@ and transl_fields env policy o fields = newty (Tfield (s, Fpresent, ty', ty))) ty_init fields in ty, object_fields - (* Make the rows "fixed" in this type, to make universal check easier *) let rec make_fixed_univars ty = let ty = repr ty in @@ -642,9 +682,9 @@ let globalize_used_variables env fixed = raise (Error(loc, env, Type_mismatch trace))) !r -let transl_simple_type env fixed styp = +let transl_simple_type env fixed mode styp = univars := []; used_variables := TyVarMap.empty; - let typ = transl_type env (if fixed then Fixed else Extensible) styp in + let typ = transl_type env (if fixed then Fixed else Extensible) mode styp in globalize_used_variables env fixed (); make_fixed_univars typ.ctyp_type; typ @@ -652,7 +692,7 @@ let transl_simple_type env fixed styp = let transl_simple_type_univars env styp = univars := []; used_variables := TyVarMap.empty; pre_univars := []; begin_def (); - let typ = transl_type env Univars styp in + let typ = transl_type env Univars Alloc_mode.Global styp in (* Only keep already global variables in used_variables *) let new_variables = !used_variables in used_variables := TyVarMap.empty; @@ -678,10 +718,10 @@ let transl_simple_type_univars env styp = { typ with ctyp_type = instance (Btype.newgenty (Tpoly (typ.ctyp_type, univs))) } -let transl_simple_type_delayed env styp = +let transl_simple_type_delayed env mode styp = univars := []; used_variables := TyVarMap.empty; begin_def (); - let typ = transl_type env Extensible styp in + let typ = transl_type env Extensible mode styp in end_def (); make_fixed_univars typ.ctyp_type; (* This brings the used variables to the global level, but doesn't link them @@ -695,7 +735,7 @@ let transl_simple_type_delayed env styp = let transl_type_scheme env styp = reset_type_variables(); begin_def(); - let typ = transl_simple_type env false styp in + let typ = transl_simple_type env false Alloc_mode.Global styp in end_def(); generalize typ.ctyp_type; typ diff --git a/typing/typetexp.mli b/typing/typetexp.mli index 602b7c7afd2..03290719a9c 100644 --- a/typing/typetexp.mli +++ b/typing/typetexp.mli @@ -20,11 +20,12 @@ open Types val valid_tyvar_name : string -> bool val transl_simple_type: - Env.t -> bool -> Parsetree.core_type -> Typedtree.core_type + Env.t -> bool -> alloc_mode_const + -> Parsetree.core_type -> Typedtree.core_type val transl_simple_type_univars: Env.t -> Parsetree.core_type -> Typedtree.core_type val transl_simple_type_delayed - : Env.t + : Env.t -> alloc_mode_const -> Parsetree.core_type -> Typedtree.core_type * type_expr * (unit -> unit) (* Translate a type, but leave type variables unbound. Returns diff --git a/typing/untypeast.ml b/typing/untypeast.ml index f2c4a20926b..a4d84a4be29 100644 --- a/typing/untypeast.ml +++ b/typing/untypeast.ml @@ -403,7 +403,7 @@ let expression sub exp = in let desc = match exp.exp_desc with - Texp_ident (_path, lid, _) -> Pexp_ident (map_loc sub lid) + Texp_ident (_path, lid, _, _) -> Pexp_ident (map_loc sub lid) | Texp_constant cst -> Pexp_constant (constant cst) | Texp_let (rec_flag, list, exp) -> Pexp_let (rec_flag, @@ -425,12 +425,12 @@ let expression sub exp = Pexp_fun (label, None, Pat.var ~loc {loc;txt = name }, Exp.match_ ~loc (Exp.ident ~loc {loc;txt= Lident name}) (List.map (sub.case sub) cases)) - | Texp_apply (exp, list) -> + | Texp_apply (exp, list, _) -> Pexp_apply (sub.expr sub exp, - List.fold_right (fun (label, expo) list -> - match expo with - None -> list - | Some exp -> (label, sub.expr sub exp) :: list + List.fold_right (fun (label, arg) list -> + match arg with + | Omitted _ -> list + | Arg exp -> (label, sub.expr sub exp) :: list ) list []) | Texp_match (exp, cases, _) -> Pexp_match (sub.expr sub exp, List.map (sub.case sub) cases) @@ -485,11 +485,11 @@ let expression sub exp = Pexp_for (name, sub.expr sub exp1, sub.expr sub exp2, dir, sub.expr sub exp3) - | Texp_send (exp, meth, _) -> + | Texp_send (exp, meth, _, _) -> Pexp_send (sub.expr sub exp, match meth with Tmeth_name name -> mkloc name loc | Tmeth_val id -> mkloc (Ident.name id) loc) - | Texp_new (_path, lid, _) -> Pexp_new (map_loc sub lid) + | Texp_new (_path, lid, _, _) -> Pexp_new (map_loc sub lid) | Texp_instvar (_, path, name) -> Pexp_ident ({loc = sub.location sub name.loc ; txt = lident_of_path path}) | Texp_setinstvar (_, _path, lid, exp) -> @@ -736,8 +736,8 @@ let class_expr sub cexpr = Pcl_apply (sub.class_expr sub cl, List.fold_right (fun (label, expo) list -> match expo with - None -> list - | Some exp -> (label, sub.expr sub exp) :: list + | Omitted _ -> list + | Arg exp -> (label, sub.expr sub exp) :: list ) args []) | Tcl_let (rec_flat, bindings, _ivars, cl) -> diff --git a/utils/clflags.ml b/utils/clflags.ml index ab66c8a38f9..785e9921c20 100644 --- a/utils/clflags.ml +++ b/utils/clflags.ml @@ -376,21 +376,23 @@ let set_dumped_pass s enabled = end module Extension = struct - type t = Comprehensions + type t = Comprehensions | Local - let all = [ Comprehensions ] + let all = [ Comprehensions; Local ] let extensions = ref ([] : t list) (* -extension *) - let equal Comprehensions Comprehensions = true + let equal (a : t) (b : t) = (a = b) let disable_all_extensions = ref false (* -disable-all-extensions *) let disable_all () = disable_all_extensions := true let to_string = function | Comprehensions -> "comprehensions" + | Local -> "local" let of_string = function | "comprehensions" -> Comprehensions + | "local" -> Local | extn -> raise (Arg.Bad(Printf.sprintf "Extension %s is not known" extn)) let enable extn = diff --git a/utils/clflags.mli b/utils/clflags.mli index 903106b210f..83d3a4d35cd 100644 --- a/utils/clflags.mli +++ b/utils/clflags.mli @@ -202,7 +202,7 @@ val set_dumped_pass : string -> bool -> unit val dump_into_file : bool ref module Extension : sig - type t = Comprehensions + type t = Comprehensions | Local val enable : string -> unit val is_enabled : t -> bool val to_string : t -> string diff --git a/utils/config.mlp b/utils/config.mlp index 5da81f23391..96c92b0402a 100644 --- a/utils/config.mlp +++ b/utils/config.mlp @@ -91,27 +91,30 @@ let function_sections = %%FUNCTION_SECTIONS%% let probes = %%PROBES%% let afl_instrument = %%AFL_INSTRUMENT%% +(* When artifacts are incompatible with upstream OCaml, ocaml-jst uses + magic numbers ending in 5xx. (The AST and bytecode executables remain + compatible, so use upstream numbers) *) let exec_magic_number = "Caml1999X029" (* exec_magic_number is duplicated in runtime/caml/exec.h *) -and cmi_magic_number = "Caml1999I029" -and cmo_magic_number = "Caml1999O029" -and cma_magic_number = "Caml1999A029" +and cmi_magic_number = "Caml1999I500" +and cmo_magic_number = "Caml1999O500" +and cma_magic_number = "Caml1999A500" and cmx_magic_number = if flambda || flambda2 then - "Caml2021y029" + "Caml2021y500" else - "Caml2021Y029" + "Caml2021Y500" and cmxa_magic_number = if flambda || flambda2 then - "Caml2021z029" + "Caml2021z500" else - "Caml2021Z029" + "Caml2021Z500" and ast_impl_magic_number = "Caml1999M029" and ast_intf_magic_number = "Caml1999N029" -and cmxs_magic_number = "Caml1999D029" -and cmt_magic_number = "Caml1999T029" -and linear_magic_number = "Caml1999L029" -and cfg_magic_number = "Caml2021G029" +and cmxs_magic_number = "Caml1999D500" +and cmt_magic_number = "Caml1999T500" +and linear_magic_number = "Caml1999L500" +and cfg_magic_number = "Caml2021G500" let interface_suffix = ref ".mli"