author | rprotacio |
Tue, 17 Jan 2017 15:27:22 +0100 | |
changeset 43452 | e55041dfa534 |
parent 43451 | 7706e5ac9f32 (current diff) |
parent 43450 | c83d7ccaf56e (diff) |
child 43454 | c11ebe3f754c |
jdk/src/java.base/share/classes/sun/security/validator/KeyStores.java | file | annotate | diff | comparison | revisions | |
jdk/test/lib/testlibrary/ModuleSourceBuilder.java | file | annotate | diff | comparison | revisions | |
jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh | file | annotate | diff | comparison | revisions | |
jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh | file | annotate | diff | comparison | revisions | |
nashorn/RELEASE_README | file | annotate | diff | comparison | revisions | |
nashorn/src/jdk.scripting.nashorn/share/classes/overview.html | file | annotate | diff | comparison | revisions |
--- a/.hgtags Fri Jan 13 16:49:34 2017 -0500 +++ b/.hgtags Tue Jan 17 15:27:22 2017 +0100 @@ -393,3 +393,4 @@ 5c71ea43933b6c7e8a85eb1a4eb2213011b95d82 jdk-9+148 cf139f925da04c8bd7efd33270a0315d72b338d3 jdk-9+149 17469f16fbb406ec9f0dd262ce776ab6efbc38f1 jdk-9+150 +37b95df0042ae0687324e1f7dc4a2519e230e704 jdk-9+151
--- a/.hgtags-top-repo Fri Jan 13 16:49:34 2017 -0500 +++ b/.hgtags-top-repo Tue Jan 17 15:27:22 2017 +0100 @@ -393,3 +393,4 @@ 3ffc3e886c74736e387f3685e86b557cdea706c8 jdk-9+148 b119012d1c2ab2570fe8718633840d0c1f1f441d jdk-9+149 6234069ff9789f7582e1faa32cb6283cbd1a5a2d jdk-9+150 +71a766d4c18041a7f833ee22823125b02e1a7f1e jdk-9+151
--- a/common/autoconf/flags.m4 Fri Jan 13 16:49:34 2017 -0500 +++ b/common/autoconf/flags.m4 Tue Jan 17 15:27:22 2017 +0100 @@ -147,15 +147,6 @@ EXTRA_CXXFLAGS="$with_extra_cxxflags" EXTRA_LDFLAGS="$with_extra_ldflags" - # Hotspot needs these set in their legacy form - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $EXTRA_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $EXTRA_CXXFLAGS" - LEGACY_EXTRA_LDFLAGS="$LEGACY_EXTRA_LDFLAGS $EXTRA_LDFLAGS" - - AC_SUBST(LEGACY_EXTRA_CFLAGS) - AC_SUBST(LEGACY_EXTRA_CXXFLAGS) - AC_SUBST(LEGACY_EXTRA_LDFLAGS) - AC_SUBST(EXTRA_CFLAGS) AC_SUBST(EXTRA_CXXFLAGS) AC_SUBST(EXTRA_LDFLAGS) @@ -192,10 +183,6 @@ $1SYSROOT_CFLAGS="-isysroot [$]$1SYSROOT" $1SYSROOT_LDFLAGS="-isysroot [$]$1SYSROOT" fi - # Propagate the sysroot args to hotspot - $1LEGACY_EXTRA_CFLAGS="[$]$1LEGACY_EXTRA_CFLAGS [$]$1SYSROOT_CFLAGS" - $1LEGACY_EXTRA_CXXFLAGS="[$]$1LEGACY_EXTRA_CXXFLAGS [$]$1SYSROOT_CFLAGS" - $1LEGACY_EXTRA_LDFLAGS="[$]$1LEGACY_EXTRA_LDFLAGS [$]$1SYSROOT_LDFLAGS" # The global CFLAGS and LDFLAGS variables need these for configure to function $1CFLAGS="[$]$1CFLAGS [$]$1SYSROOT_CFLAGS" $1CPPFLAGS="[$]$1CPPFLAGS [$]$1SYSROOT_CFLAGS"
--- a/common/autoconf/generated-configure.sh Fri Jan 13 16:49:34 2017 -0500 +++ b/common/autoconf/generated-configure.sh Tue Jan 17 15:27:22 2017 +0100 @@ -854,9 +854,6 @@ EXTRA_LDFLAGS EXTRA_CXXFLAGS EXTRA_CFLAGS -LEGACY_EXTRA_LDFLAGS -LEGACY_EXTRA_CXXFLAGS -LEGACY_EXTRA_CFLAGS EXE_SUFFIX OBJ_SUFFIX STATIC_LIBRARY @@ -5170,7 +5167,7 @@ #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1482828098 +DATE_WHEN_GENERATED=1483542685 ############################################################################### # @@ -31290,8 +31287,6 @@ as_fn_error $? "--enable-static-build is only supported for macosx builds" "$LINENO" 5 fi STATIC_BUILD_CFLAGS="-DSTATIC_BUILD=1" - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $STATIC_BUILD_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $STATIC_BUILD_CFLAGS" CFLAGS_JDKLIB_EXTRA="$CFLAGS_JDKLIB_EXTRA $STATIC_BUILD_CFLAGS" CXXFLAGS_JDKLIB_EXTRA="$CXXFLAGS_JDKLIB_EXTRA $STATIC_BUILD_CFLAGS" STATIC_BUILD=true @@ -31493,15 +31488,6 @@ EXTRA_CXXFLAGS="$with_extra_cxxflags" EXTRA_LDFLAGS="$with_extra_ldflags" - # Hotspot needs these set in their legacy form - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $EXTRA_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $EXTRA_CXXFLAGS" - LEGACY_EXTRA_LDFLAGS="$LEGACY_EXTRA_LDFLAGS $EXTRA_LDFLAGS" - - - - - @@ -31533,10 +31519,6 @@ SYSROOT_CFLAGS="-isysroot $SYSROOT" SYSROOT_LDFLAGS="-isysroot $SYSROOT" fi - # Propagate the sysroot args to hotspot - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $SYSROOT_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $SYSROOT_CFLAGS" - LEGACY_EXTRA_LDFLAGS="$LEGACY_EXTRA_LDFLAGS $SYSROOT_LDFLAGS" # The global CFLAGS and LDFLAGS variables need these for configure to function CFLAGS="$CFLAGS $SYSROOT_CFLAGS" CPPFLAGS="$CPPFLAGS $SYSROOT_CFLAGS" @@ -44053,10 +44035,6 @@ BUILD_SYSROOT_CFLAGS="-isysroot $BUILD_SYSROOT" BUILD_SYSROOT_LDFLAGS="-isysroot $BUILD_SYSROOT" fi - # Propagate the sysroot args to hotspot - BUILD_LEGACY_EXTRA_CFLAGS="$BUILD_LEGACY_EXTRA_CFLAGS $BUILD_SYSROOT_CFLAGS" - BUILD_LEGACY_EXTRA_CXXFLAGS="$BUILD_LEGACY_EXTRA_CXXFLAGS $BUILD_SYSROOT_CFLAGS" - BUILD_LEGACY_EXTRA_LDFLAGS="$BUILD_LEGACY_EXTRA_LDFLAGS $BUILD_SYSROOT_LDFLAGS" # The global CFLAGS and LDFLAGS variables need these for configure to function BUILD_CFLAGS="$BUILD_CFLAGS $BUILD_SYSROOT_CFLAGS" BUILD_CPPFLAGS="$BUILD_CPPFLAGS $BUILD_SYSROOT_CFLAGS" @@ -52779,9 +52757,8 @@ $as_echo "yes" >&6; } GCOV_CFLAGS="-fprofile-arcs -ftest-coverage -fno-inline" GCOV_LDFLAGS="-fprofile-arcs" - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $GCOV_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $GCOV_CFLAGS" - LEGACY_EXTRA_LDFLAGS="$LEGACY_EXTRA_LDFLAGS $GCOV_LDFLAGS" + JVM_CFLAGS="$JVM_CFLAGS $GCOV_CFLAGS" + JVM_LDFLAGS="$JVM_LDFLAGS $GCOV_LDFLAGS" CFLAGS_JDKLIB="$CFLAGS_JDKLIB $GCOV_CFLAGS" CFLAGS_JDKEXE="$CFLAGS_JDKEXE $GCOV_CFLAGS" CXXFLAGS_JDKLIB="$CXXFLAGS_JDKLIB $GCOV_CFLAGS" @@ -52982,7 +52959,7 @@ $as_echo "no, forced" >&6; } BUILD_GTEST="false" elif test "x$enable_hotspot_gtest" = "x"; then - if test "x$GTEST_DIR_EXISTS" = "xtrue" && test "x$OPENJDK_TARGET_OS" != "xaix"; then + if test "x$GTEST_DIR_EXISTS" = "xtrue"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } BUILD_GTEST="true"
--- a/common/autoconf/jdk-options.m4 Fri Jan 13 16:49:34 2017 -0500 +++ b/common/autoconf/jdk-options.m4 Tue Jan 17 15:27:22 2017 +0100 @@ -320,9 +320,8 @@ AC_MSG_RESULT([yes]) GCOV_CFLAGS="-fprofile-arcs -ftest-coverage -fno-inline" GCOV_LDFLAGS="-fprofile-arcs" - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $GCOV_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $GCOV_CFLAGS" - LEGACY_EXTRA_LDFLAGS="$LEGACY_EXTRA_LDFLAGS $GCOV_LDFLAGS" + JVM_CFLAGS="$JVM_CFLAGS $GCOV_CFLAGS" + JVM_LDFLAGS="$JVM_LDFLAGS $GCOV_LDFLAGS" CFLAGS_JDKLIB="$CFLAGS_JDKLIB $GCOV_CFLAGS" CFLAGS_JDKEXE="$CFLAGS_JDKEXE $GCOV_CFLAGS" CXXFLAGS_JDKLIB="$CXXFLAGS_JDKLIB $GCOV_CFLAGS" @@ -360,8 +359,6 @@ AC_MSG_ERROR([--enable-static-build is only supported for macosx builds]) fi STATIC_BUILD_CFLAGS="-DSTATIC_BUILD=1" - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $STATIC_BUILD_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $STATIC_BUILD_CFLAGS" CFLAGS_JDKLIB_EXTRA="$CFLAGS_JDKLIB_EXTRA $STATIC_BUILD_CFLAGS" CXXFLAGS_JDKLIB_EXTRA="$CXXFLAGS_JDKLIB_EXTRA $STATIC_BUILD_CFLAGS" STATIC_BUILD=true
--- a/common/conf/jib-profiles.js Fri Jan 13 16:49:34 2017 -0500 +++ b/common/conf/jib-profiles.js Tue Jan 17 15:27:22 2017 +0100 @@ -263,6 +263,7 @@ labels: "open" }; + common.configure_args_64bit = ["--with-target-bits=64"]; common.configure_args_32bit = ["--with-target-bits=32"]; /** @@ -419,7 +420,7 @@ target_os: "linux", target_cpu: "x64", dependencies: ["devkit"], - configure_args: ["--with-zlib=system"], + configure_args: concat(common.configure_args_64bit, "--with-zlib=system"), default_make_targets: ["docs-bundles"], }, @@ -436,27 +437,30 @@ target_os: "macosx", target_cpu: "x64", dependencies: ["devkit"], - configure_args: concat(common.configure_args, "--with-zlib=system"), + configure_args: concat(common.configure_args_64bit, "--with-zlib=system"), }, "solaris-x64": { target_os: "solaris", target_cpu: "x64", dependencies: ["devkit", "cups"], - configure_args: ["--with-zlib=system", "--enable-dtrace"], + configure_args: concat(common.configure_args_64bit, + "--with-zlib=system", "--enable-dtrace"), }, "solaris-sparcv9": { target_os: "solaris", target_cpu: "sparcv9", dependencies: ["devkit", "cups"], - configure_args: ["--with-zlib=system", "--enable-dtrace"], + configure_args: concat(common.configure_args_64bit, + "--with-zlib=system", "--enable-dtrace"), }, "windows-x64": { target_os: "windows", target_cpu: "x64", dependencies: ["devkit", "freetype"], + configure_args: concat(common.configure_args_64bit), }, "windows-x86": { @@ -518,11 +522,11 @@ target_os: "linux", target_cpu: "x64", dependencies: ["devkit"], - configure_args: [ + configure_args: concat(common.configure_args_64bit, [ "--with-zlib=system", "--with-jvm-variants=zero", "--enable-libffi-bundling" - ] + ]) }, "linux-x86-zero": {
--- a/corba/.hgtags Fri Jan 13 16:49:34 2017 -0500 +++ b/corba/.hgtags Tue Jan 17 15:27:22 2017 +0100 @@ -393,3 +393,4 @@ f95cc86b6ac22ec1ade5d4f825dc7782adeea228 jdk-9+148 00b19338e505690abe93d5995ed74a473d969c2c jdk-9+149 9205e980062a5c4530b51021c6e274025f4ccbdf jdk-9+150 +77f827f5bbad3ef795664bc675f72d98d156b9f8 jdk-9+151
--- a/hotspot/make/CopyToExplodedJdk.gmk Fri Jan 13 16:49:34 2017 -0500 +++ b/hotspot/make/CopyToExplodedJdk.gmk Tue Jan 17 15:27:22 2017 +0100 @@ -49,6 +49,7 @@ DEST := $(JDK_OUTPUTDIR)/lib, \ FILES := $(filter-out %$(SHARED_LIBRARY_SUFFIX), $(LIB_TARGETS)), \ MACRO := link-file-relative, \ + LOG_ACTION := Creating symlink, \ )) TARGETS += $(COPY_LIBS) $(LINK_LIBS)
--- a/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp Fri Jan 13 16:49:34 2017 -0500 +++ b/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -1179,6 +1179,15 @@ Label done; Label runtime; + // Is marking still active? + if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) { + __ ldrw(tmp, in_progress); + } else { + assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption"); + __ ldrb(tmp, in_progress); + } + __ cbzw(tmp, done); + // Can we store original value in the thread's buffer? __ ldr(tmp, queue_index); __ cbz(tmp, runtime);
--- a/hotspot/src/cpu/arm/vm/c1_Runtime1_arm.cpp Fri Jan 13 16:49:34 2017 -0500 +++ b/hotspot/src/cpu/arm/vm/c1_Runtime1_arm.cpp Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -551,6 +551,8 @@ const Register r_index_1 = R1; const Register r_buffer_2 = R2; + Address queue_active(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() + + SATBMarkQueue::byte_offset_of_active())); Address queue_index(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_index())); Address buffer(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() + @@ -559,6 +561,11 @@ Label done; Label runtime; + // Is marking still active? + assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption"); + __ ldrb(R1, queue_active); + __ cbz(R1, done); + __ ldr(r_index_1, queue_index); __ ldr(r_pre_val_0, Address(SP, nb_saved_regs*wordSize)); __ ldr(r_buffer_2, buffer);
--- a/hotspot/src/cpu/ppc/vm/c1_Runtime1_ppc.cpp Fri Jan 13 16:49:34 2017 -0500 +++ b/hotspot/src/cpu/ppc/vm/c1_Runtime1_ppc.cpp Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2015 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -741,7 +741,10 @@ Register tmp = R14; Register tmp2 = R15; - Label refill, restart; + Label refill, restart, marking_not_active; + int satb_q_active_byte_offset = + in_bytes(JavaThread::satb_mark_queue_offset() + + SATBMarkQueue::byte_offset_of_active()); int satb_q_index_byte_offset = in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_index()); @@ -753,6 +756,16 @@ __ std(tmp, -16, R1_SP); __ std(tmp2, -24, R1_SP); + // Is marking still active? + if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) { + __ lwz(tmp, satb_q_active_byte_offset, R16_thread); + } else { + assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption"); + __ lbz(tmp, satb_q_active_byte_offset, R16_thread); + } + __ cmpdi(CCR0, tmp, 0); + __ beq(CCR0, marking_not_active); + __ bind(restart); // Load the index into the SATB buffer. SATBMarkQueue::_index is a // size_t so ld_ptr is appropriate. @@ -769,6 +782,7 @@ __ std(tmp, satb_q_index_byte_offset, R16_thread); __ stdx(pre_val, tmp2, tmp); // [_buf + index] := <address_of_card> + __ bind(marking_not_active); // Restore temp registers and return-from-leaf. __ ld(tmp2, -24, R1_SP); __ ld(tmp, -16, R1_SP);
--- a/hotspot/src/cpu/s390/vm/c1_Runtime1_s390.cpp Fri Jan 13 16:49:34 2017 -0500 +++ b/hotspot/src/cpu/s390/vm/c1_Runtime1_s390.cpp Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017 Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -784,7 +784,10 @@ Register tmp = Z_R6; // Must be non-volatile because it is used to save pre_val. Register tmp2 = Z_R7; - Label refill, restart; + Label refill, restart, marking_not_active; + int satb_q_active_byte_offset = + in_bytes(JavaThread::satb_mark_queue_offset() + + SATBMarkQueue::byte_offset_of_active()); int satb_q_index_byte_offset = in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_index()); @@ -796,6 +799,15 @@ __ z_stg(tmp, 0*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP); __ z_stg(tmp2, 1*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP); + // Is marking still active? + if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) { + __ load_and_test_int(tmp, Address(Z_thread, satb_q_active_byte_offset)); + } else { + assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption"); + __ load_and_test_byte(tmp, Address(Z_thread, satb_q_active_byte_offset)); + } + __ z_bre(marking_not_active); // Activity indicator is zero, so there is no marking going on currently. + __ bind(restart); // Load the index into the SATB buffer. SATBMarkQueue::_index is a // size_t so ld_ptr is appropriate. @@ -810,6 +822,7 @@ __ z_stg(pre_val, 0, tmp, tmp2); // [_buf + index] := <address_of_card> __ z_stg(tmp, satb_q_index_byte_offset, Z_thread); + __ bind(marking_not_active); // Restore tmp registers (see assertion in G1PreBarrierStub::emit_code()). __ z_lg(tmp, 0*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP); __ z_lg(tmp2, 1*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP);
--- a/hotspot/src/cpu/sparc/vm/c1_Runtime1_sparc.cpp Fri Jan 13 16:49:34 2017 -0500 +++ b/hotspot/src/cpu/sparc/vm/c1_Runtime1_sparc.cpp Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -856,7 +856,9 @@ Register tmp2 = G3_scratch; Label refill, restart; - bool with_frame = false; // I don't know if we can do with-frame. + int satb_q_active_byte_offset = + in_bytes(JavaThread::satb_mark_queue_offset() + + SATBMarkQueue::byte_offset_of_active()); int satb_q_index_byte_offset = in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_index()); @@ -864,6 +866,17 @@ in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_buf()); + // Is marking still active? + if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) { + __ ld(G2_thread, satb_q_active_byte_offset, tmp); + } else { + assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption"); + __ ldsb(G2_thread, satb_q_active_byte_offset, tmp); + } + __ cmp_and_br_short(tmp, G0, Assembler::notEqual, Assembler::pt, restart); + __ retl(); + __ delayed()->nop(); + __ bind(restart); // Load the index into the SATB buffer. SATBMarkQueue::_index is a // size_t so ld_ptr is appropriate
--- a/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp Fri Jan 13 16:49:34 2017 -0500 +++ b/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1623,6 +1623,8 @@ NOT_LP64(__ get_thread(thread);) + Address queue_active(thread, in_bytes(JavaThread::satb_mark_queue_offset() + + SATBMarkQueue::byte_offset_of_active())); Address queue_index(thread, in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_index())); Address buffer(thread, in_bytes(JavaThread::satb_mark_queue_offset() + @@ -1631,6 +1633,15 @@ Label done; Label runtime; + // Is marking still active? + if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) { + __ cmpl(queue_active, 0); + } else { + assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption"); + __ cmpb(queue_active, 0); + } + __ jcc(Assembler::equal, done); + // Can we store original value in the thread's buffer? __ movptr(tmp, queue_index);
--- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Fri Jan 13 16:49:34 2017 -0500 +++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Tue Jan 17 15:27:22 2017 +0100 @@ -89,7 +89,10 @@ // Minimum usable stack sizes required to get to user code. Space for // HotSpot guard pages is added later. #ifdef _LP64 -size_t os::Posix::_compiler_thread_min_stack_allowed = 202 * K; +// The adlc generated method 'State::MachNodeGenerator(int)' used by the C2 compiler +// threads requires a large stack with the Solaris Studio C++ compiler version 5.13 +// and product VM builds (debug builds require significantly less stack space). +size_t os::Posix::_compiler_thread_min_stack_allowed = 325 * K; size_t os::Posix::_java_thread_min_stack_allowed = 48 * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = 224 * K; #else
--- a/jaxp/.hgtags Fri Jan 13 16:49:34 2017 -0500 +++ b/jaxp/.hgtags Tue Jan 17 15:27:22 2017 +0100 @@ -393,3 +393,4 @@ c45db75bfe8bc20bb80b4a009ae3f69c9cd2d885 jdk-9+148 5978df8bfa3894f2b3d07b7256f25f78dffb1f9c jdk-9+149 f85154af719f99a3b4d81b67a8b4c18a650d10f9 jdk-9+150 +13c6906bfc861d99dc35a19c80b7a99f0b0ac58d jdk-9+151
--- a/jaxws/.hgtags Fri Jan 13 16:49:34 2017 -0500 +++ b/jaxws/.hgtags Tue Jan 17 15:27:22 2017 +0100 @@ -396,3 +396,4 @@ c8c9c334743caf8155c9809b6b4ac315d3a66476 jdk-9+148 72554d319b474b3636c7d02fe3c110254d111b1a jdk-9+149 77e4e30d9d111272cd4a45a2203e8f570d40b12e jdk-9+150 +c48b4d4768b1c2b8fe5d1a844ca13732e5dfbe2a jdk-9+151
--- a/jdk/.hgtags Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/.hgtags Tue Jan 17 15:27:22 2017 +0100 @@ -393,3 +393,4 @@ 9098b2b9d997d65af0026fc2f39cf75234e26bc5 jdk-9+148 5a846396a24c7aff01d6a8feaa7afc0a6369f04d jdk-9+149 71e198ef3839045e829a879af1d709be16ab0f88 jdk-9+150 +d27bab22ff62823902d93d1d35ca397cfd50d059 jdk-9+151
--- a/jdk/src/java.base/share/classes/java/io/FilePermission.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/io/FilePermission.java Tue Jan 17 15:27:22 2017 +0100 @@ -532,11 +532,13 @@ * simple {@code npath} is inside a wildcard {@code npath} if and only if * {@code simple_npath.relativize(wildcard_npath)} is exactly "..", * a simple {@code npath} is recursively inside a wildcard {@code npath} - * if and only if {@code simple_npath.relativize(wildcard_npath)} - * is a series of one or more "..". An invalid {@code FilePermission} does - * not imply any object except for itself. An invalid {@code FilePermission} - * is not implied by any object except for itself or a {@code FilePermission} - * on {@literal "<<ALL FILES>>"} whose actions is a superset of this + * if and only if {@code simple_npath.relativize(wildcard_npath)} is a + * series of one or more "..". This means "/-" implies "/foo" but not "foo". + * <p> + * An invalid {@code FilePermission} does not imply any object except for + * itself. An invalid {@code FilePermission} is not implied by any object + * except for itself or a {@code FilePermission} on + * {@literal "<<ALL FILES>>"} whose actions is a superset of this * invalid {@code FilePermission}. Even if two {@code FilePermission} * are created with the same invalid path, one does not imply the other. *
--- a/jdk/src/java.base/share/classes/java/lang/Class.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/lang/Class.java Tue Jan 17 15:27:22 2017 +0100 @@ -26,8 +26,6 @@ package java.lang; import java.lang.annotation.Annotation; -import java.lang.module.ModuleDescriptor.Version; -import java.lang.module.ModuleFinder; import java.lang.module.ModuleReader; import java.lang.ref.SoftReference; import java.io.IOException; @@ -42,7 +40,6 @@ import java.lang.reflect.GenericArrayType; import java.lang.reflect.GenericDeclaration; import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Layer; import java.lang.reflect.Member; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -54,7 +51,6 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -62,19 +58,15 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.StringJoiner; -import java.util.stream.Collectors; import jdk.internal.HotSpotIntrinsicCandidate; import jdk.internal.loader.BootLoader; import jdk.internal.loader.BuiltinClassLoader; import jdk.internal.loader.ResourceHelper; -import jdk.internal.misc.SharedSecrets; import jdk.internal.misc.Unsafe; import jdk.internal.misc.VM; -import jdk.internal.module.ModuleHashes; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.ConstantPool; import jdk.internal.reflect.Reflection; @@ -532,7 +524,8 @@ } try { Class<?>[] empty = {}; - final Constructor<T> c = getConstructor0(empty, Member.DECLARED); + final Constructor<T> c = getReflectionFactory().copyConstructor( + getConstructor0(empty, Member.DECLARED)); // Disable accessibility checks on the constructor // since we have to do the security check here anyway // (the stack depth is wrong for the Constructor's @@ -1024,6 +1017,11 @@ * @return an array of interfaces directly implemented by this class */ public Class<?>[] getInterfaces() { + // defensively copy before handing over to user code + return getInterfaces(true); + } + + private Class<?>[] getInterfaces(boolean cloneArray) { ReflectionData<T> rd = reflectionData(); if (rd == null) { // no cloning required @@ -1034,8 +1032,8 @@ interfaces = getInterfaces0(); rd.interfaces = interfaces; } - // defensively copy before handing over to user code - return interfaces.clone(); + // defensively copy if requested + return cloneArray ? interfaces.clone() : interfaces; } } @@ -1767,15 +1765,6 @@ * Class} object, including those declared by the class or interface and * those inherited from superclasses and superinterfaces. * - * <p> If this {@code Class} object represents a type that has multiple - * public methods with the same name and parameter types, but different - * return types, then the returned array has a {@code Method} object for - * each such method. - * - * <p> If this {@code Class} object represents a type with a class - * initialization method {@code <clinit>}, then the returned array does - * <em>not</em> have a corresponding {@code Method} object. - * * <p> If this {@code Class} object represents an array type, then the * returned array has a {@code Method} object for each of the public * methods inherited by the array type from {@code Object}. It does not @@ -1788,16 +1777,54 @@ * has length 0. (Note that a {@code Class} object which represents a class * always has public methods, inherited from {@code Object}.) * - * <p> If this {@code Class} object represents a primitive type or void, - * then the returned array has length 0. - * - * <p> Static methods declared in superinterfaces of the class or interface - * represented by this {@code Class} object are not considered members of - * the class or interface. + * <p> The returned array never contains methods with names "{@code <init>}" + * or "{@code <clinit>}". * * <p> The elements in the returned array are not sorted and are not in any * particular order. * + * <p> Generally, the result is computed as with the following 4 step algorithm. + * Let C be the class or interface represented by this {@code Class} object: + * <ol> + * <li> A union of methods is composed of: + * <ol type="a"> + * <li> C's declared public instance and static methods as returned by + * {@link #getDeclaredMethods()} and filtered to include only public + * methods.</li> + * <li> If C is a class other than {@code Object}, then include the result + * of invoking this algorithm recursively on the superclass of C.</li> + * <li> Include the results of invoking this algorithm recursively on all + * direct superinterfaces of C, but include only instance methods.</li> + * </ol></li> + * <li> Union from step 1 is partitioned into subsets of methods with same + * signature (name, parameter types) and return type.</li> + * <li> Within each such subset only the most specific methods are selected. + * Let method M be a method from a set of methods with same signature + * and return type. M is most specific if there is no such method + * N != M from the same set, such that N is more specific than M. + * N is more specific than M if: + * <ol type="a"> + * <li> N is declared by a class and M is declared by an interface; or</li> + * <li> N and M are both declared by classes or both by interfaces and + * N's declaring type is the same as or a subtype of M's declaring type + * (clearly, if M's and N's declaring types are the same type, then + * M and N are the same method).</li> + * </ol></li> + * <li> The result of this algorithm is the union of all selected methods from + * step 3.</li> + * </ol> + * + * @apiNote There may be more than one method with a particular name + * and parameter types in a class because while the Java language forbids a + * class to declare multiple methods with the same signature but different + * return types, the Java virtual machine does not. This + * increased flexibility in the virtual machine can be used to + * implement various language features. For example, covariant + * returns can be implemented with {@linkplain + * java.lang.reflect.Method#isBridge bridge methods}; the bridge + * method and the overriding method would have the same + * signature but different return types. + * * @return the array of {@code Method} objects representing the * public methods of this class * @throws SecurityException @@ -1900,12 +1927,13 @@ @CallerSensitive public Field getField(String name) throws NoSuchFieldException, SecurityException { + Objects.requireNonNull(name); checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true); Field field = getField0(name); if (field == null) { throw new NoSuchFieldException(name); } - return field; + return getReflectionFactory().copyField(field); } @@ -1919,47 +1947,69 @@ * order. If {@code parameterTypes} is {@code null}, it is * treated as if it were an empty array. * - * <p> If the {@code name} is "{@code <init>}" or "{@code <clinit>}" a - * {@code NoSuchMethodException} is raised. Otherwise, the method to - * be reflected is determined by the algorithm that follows. Let C be the - * class or interface represented by this object: - * <OL> - * <LI> C is searched for a <I>matching method</I>, as defined below. If a - * matching method is found, it is reflected.</LI> - * <LI> If no matching method is found by step 1 then: - * <OL TYPE="a"> - * <LI> If C is a class other than {@code Object}, then this algorithm is - * invoked recursively on the superclass of C.</LI> - * <LI> If C is the class {@code Object}, or if C is an interface, then - * the superinterfaces of C (if any) are searched for a matching - * method. If any such method is found, it is reflected.</LI> - * </OL></LI> - * </OL> + * <p> If this {@code Class} object represents an array type, then this + * method finds any public method inherited by the array type from + * {@code Object} except method {@code clone()}. + * + * <p> If this {@code Class} object represents an interface then this + * method does not find any implicitly declared method from + * {@code Object}. Therefore, if no methods are explicitly declared in + * this interface or any of its superinterfaces, then this method does not + * find any method. + * + * <p> This method does not find any method with name "{@code <init>}" or + * "{@code <clinit>}". * - * <p> To find a matching method in a class or interface C: If C - * declares exactly one public method with the specified name and exactly - * the same formal parameter types, that is the method reflected. If more - * than one such method is found in C, and one of these methods has a - * return type that is more specific than any of the others, that method is - * reflected; otherwise one of the methods is chosen arbitrarily. + * <p> Generally, the method to be reflected is determined by the 4 step + * algorithm that follows. + * Let C be the class or interface represented by this {@code Class} object: + * <ol> + * <li> A union of methods is composed of: + * <ol type="a"> + * <li> C's declared public instance and static methods as returned by + * {@link #getDeclaredMethods()} and filtered to include only public + * methods that match given {@code name} and {@code parameterTypes}</li> + * <li> If C is a class other than {@code Object}, then include the result + * of invoking this algorithm recursively on the superclass of C.</li> + * <li> Include the results of invoking this algorithm recursively on all + * direct superinterfaces of C, but include only instance methods.</li> + * </ol></li> + * <li> This union is partitioned into subsets of methods with same + * return type (the selection of methods from step 1 also guarantees that + * they have the same method name and parameter types).</li> + * <li> Within each such subset only the most specific methods are selected. + * Let method M be a method from a set of methods with same VM + * signature (return type, name, parameter types). + * M is most specific if there is no such method N != M from the same + * set, such that N is more specific than M. N is more specific than M + * if: + * <ol type="a"> + * <li> N is declared by a class and M is declared by an interface; or</li> + * <li> N and M are both declared by classes or both by interfaces and + * N's declaring type is the same as or a subtype of M's declaring type + * (clearly, if M's and N's declaring types are the same type, then + * M and N are the same method).</li> + * </ol></li> + * <li> The result of this algorithm is chosen arbitrarily from the methods + * with most specific return type among all selected methods from step 3. + * Let R be a return type of a method M from the set of all selected methods + * from step 3. M is a method with most specific return type if there is + * no such method N != M from the same set, having return type S != R, + * such that S is a subtype of R as determined by + * R.class.{@link #isAssignableFrom}(S.class). + * </ol> * - * <p>Note that there may be more than one matching method in a - * class because while the Java language forbids a class to - * declare multiple methods with the same signature but different + * @apiNote There may be more than one method with matching name and + * parameter types in a class because while the Java language forbids a + * class to declare multiple methods with the same signature but different * return types, the Java virtual machine does not. This * increased flexibility in the virtual machine can be used to * implement various language features. For example, covariant * returns can be implemented with {@linkplain * java.lang.reflect.Method#isBridge bridge methods}; the bridge - * method and the method being overridden would have the same - * signature but different return types. - * - * <p> If this {@code Class} object represents an array type, then this - * method does not find the {@code clone()} method. - * - * <p> Static methods declared in superinterfaces of the class or interface - * represented by this {@code Class} object are not considered members of - * the class or interface. + * method and the overriding method would have the same + * signature but different return types. This method would return the + * overriding method as it would have a more specific return type. * * @param name the name of the method * @param parameterTypes the list of parameters @@ -1983,12 +2033,13 @@ @CallerSensitive public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException { + Objects.requireNonNull(name); checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true); - Method method = getMethod0(name, parameterTypes, true); + Method method = getMethod0(name, parameterTypes); if (method == null) { throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes)); } - return method; + return getReflectionFactory().copyMethod(method); } /** @@ -2004,7 +2055,9 @@ * "<init>"or "<clinit>". */ Method getMethodOrNull(String name, Class<?>... parameterTypes) { - return getMethod0(name, parameterTypes, true); + Objects.requireNonNull(name); + Method method = getMethod0(name, parameterTypes); + return method == null ? null : getReflectionFactory().copyMethod(method); } @@ -2041,7 +2094,8 @@ public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException { checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true); - return getConstructor0(parameterTypes, Member.PUBLIC); + return getReflectionFactory().copyConstructor( + getConstructor0(parameterTypes, Member.PUBLIC)); } @@ -2283,12 +2337,13 @@ @CallerSensitive public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException { + Objects.requireNonNull(name); checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true); Field field = searchFields(privateGetDeclaredFields(false), name); if (field == null) { throw new NoSuchFieldException(name); } - return field; + return getReflectionFactory().copyField(field); } @@ -2343,12 +2398,13 @@ @CallerSensitive public Method getDeclaredMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException { + Objects.requireNonNull(name); checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true); Method method = searchMethods(privateGetDeclaredMethods(false), name, parameterTypes); if (method == null) { throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes)); } - return method; + return getReflectionFactory().copyMethod(method); } @@ -2394,7 +2450,8 @@ public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException { checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true); - return getConstructor0(parameterTypes, Member.DECLARED); + return getReflectionFactory().copyConstructor( + getConstructor0(parameterTypes, Member.DECLARED)); } /** @@ -3004,180 +3061,6 @@ return res; } - static class MethodArray { - // Don't add or remove methods except by add() or remove() calls. - private Method[] methods; - private int length; - private int defaults; - - MethodArray() { - this(20); - } - - MethodArray(int initialSize) { - if (initialSize < 2) - throw new IllegalArgumentException("Size should be 2 or more"); - - methods = new Method[initialSize]; - length = 0; - defaults = 0; - } - - boolean hasDefaults() { - return defaults != 0; - } - - void add(Method m) { - if (length == methods.length) { - methods = Arrays.copyOf(methods, 2 * methods.length); - } - methods[length++] = m; - - if (m != null && m.isDefault()) - defaults++; - } - - void addAll(Method[] ma) { - for (Method m : ma) { - add(m); - } - } - - void addAll(MethodArray ma) { - for (int i = 0; i < ma.length(); i++) { - add(ma.get(i)); - } - } - - void addIfNotPresent(Method newMethod) { - for (int i = 0; i < length; i++) { - Method m = methods[i]; - if (m == newMethod || (m != null && m.equals(newMethod))) { - return; - } - } - add(newMethod); - } - - void addAllIfNotPresent(MethodArray newMethods) { - for (int i = 0; i < newMethods.length(); i++) { - Method m = newMethods.get(i); - if (m != null) { - addIfNotPresent(m); - } - } - } - - /* Add Methods declared in an interface to this MethodArray. - * Static methods declared in interfaces are not inherited. - */ - void addInterfaceMethods(Method[] methods) { - for (Method candidate : methods) { - if (!Modifier.isStatic(candidate.getModifiers())) { - add(candidate); - } - } - } - - int length() { - return length; - } - - Method get(int i) { - return methods[i]; - } - - Method getFirst() { - for (Method m : methods) - if (m != null) - return m; - return null; - } - - void removeByNameAndDescriptor(Method toRemove) { - for (int i = 0; i < length; i++) { - Method m = methods[i]; - if (m != null && matchesNameAndDescriptor(m, toRemove)) { - remove(i); - } - } - } - - private void remove(int i) { - if (methods[i] != null && methods[i].isDefault()) - defaults--; - methods[i] = null; - } - - private boolean matchesNameAndDescriptor(Method m1, Method m2) { - return m1.getReturnType() == m2.getReturnType() && - m1.getName() == m2.getName() && // name is guaranteed to be interned - arrayContentsEq(m1.getParameterTypes(), - m2.getParameterTypes()); - } - - void compactAndTrim() { - int newPos = 0; - // Get rid of null slots - for (int pos = 0; pos < length; pos++) { - Method m = methods[pos]; - if (m != null) { - if (pos != newPos) { - methods[newPos] = m; - } - newPos++; - } - } - if (newPos != methods.length) { - methods = Arrays.copyOf(methods, newPos); - } - } - - /* Removes all Methods from this MethodArray that have a more specific - * default Method in this MethodArray. - * - * Users of MethodArray are responsible for pruning Methods that have - * a more specific <em>concrete</em> Method. - */ - void removeLessSpecifics() { - if (!hasDefaults()) - return; - - for (int i = 0; i < length; i++) { - Method m = get(i); - if (m == null || !m.isDefault()) - continue; - - for (int j = 0; j < length; j++) { - if (i == j) - continue; - - Method candidate = get(j); - if (candidate == null) - continue; - - if (!matchesNameAndDescriptor(m, candidate)) - continue; - - if (hasMoreSpecificClass(m, candidate)) - remove(j); - } - } - } - - Method[] getArray() { - return methods; - } - - // Returns true if m1 is more specific than m2 - static boolean hasMoreSpecificClass(Method m1, Method m2) { - Class<?> m1Class = m1.getDeclaringClass(); - Class<?> m2Class = m2.getDeclaringClass(); - return m1Class != m2Class && m2Class.isAssignableFrom(m1Class); - } - } - - // Returns an array of "root" methods. These Method objects must NOT // be propagated to the outside world, but must instead be copied // via ReflectionFactory.copyMethod. @@ -3190,51 +3073,29 @@ } // No cached value available; compute value recursively. - // Start by fetching public declared methods - MethodArray methods = new MethodArray(); - { - Method[] tmp = privateGetDeclaredMethods(true); - methods.addAll(tmp); - } - // Now recur over superclass and direct superinterfaces. - // Go over superinterfaces first so we can more easily filter - // out concrete implementations inherited from superclasses at - // the end. - MethodArray inheritedMethods = new MethodArray(); - for (Class<?> i : getInterfaces()) { - inheritedMethods.addInterfaceMethods(i.privateGetPublicMethods()); + // Start by fetching public declared methods... + PublicMethods pms = new PublicMethods(); + for (Method m : privateGetDeclaredMethods(/* publicOnly */ true)) { + pms.merge(m); } - if (!isInterface()) { - Class<?> c = getSuperclass(); - if (c != null) { - MethodArray supers = new MethodArray(); - supers.addAll(c.privateGetPublicMethods()); - // Filter out concrete implementations of any - // interface methods - for (int i = 0; i < supers.length(); i++) { - Method m = supers.get(i); - if (m != null && - !Modifier.isAbstract(m.getModifiers()) && - !m.isDefault()) { - inheritedMethods.removeByNameAndDescriptor(m); - } - } - // Insert superclass's inherited methods before - // superinterfaces' to satisfy getMethod's search - // order - supers.addAll(inheritedMethods); - inheritedMethods = supers; + // ...then recur over superclass methods... + Class<?> sc = getSuperclass(); + if (sc != null) { + for (Method m : sc.privateGetPublicMethods()) { + pms.merge(m); } } - // Filter out all local methods from inherited ones - for (int i = 0; i < methods.length(); i++) { - Method m = methods.get(i); - inheritedMethods.removeByNameAndDescriptor(m); + // ...and finally over direct superinterfaces. + for (Class<?> intf : getInterfaces(/* cloneArray */ false)) { + for (Method m : intf.privateGetPublicMethods()) { + // static interface methods are not inherited + if (!Modifier.isStatic(m.getModifiers())) { + pms.merge(m); + } + } } - methods.addAllIfNotPresent(inheritedMethods); - methods.removeLessSpecifics(); - methods.compactAndTrim(); - res = methods.getArray(); + + res = pms.toArray(); if (rd != null) { rd.publicMethods = res; } @@ -3246,17 +3107,20 @@ // Helpers for fetchers of one field, method, or constructor // + // This method does not copy the returned Field object! private static Field searchFields(Field[] fields, String name) { - String internedName = name.intern(); for (Field field : fields) { - if (field.getName() == internedName) { - return getReflectionFactory().copyField(field); + if (field.getName().equals(name)) { + return field; } } return null; } - private Field getField0(String name) throws NoSuchFieldException { + // Returns a "root" Field object. This Field object must NOT + // be propagated to the outside world, but must instead be copied + // via ReflectionFactory.copyField. + private Field getField0(String name) { // Note: the intent is that the search algorithm this routine // uses be equivalent to the ordering imposed by // privateGetPublicFields(). It fetches only the declared @@ -3270,7 +3134,7 @@ return res; } // Direct superinterfaces, recursively - Class<?>[] interfaces = getInterfaces(); + Class<?>[] interfaces = getInterfaces(/* cloneArray */ false); for (Class<?> c : interfaces) { if ((res = c.getField0(name)) != null) { return res; @@ -3288,87 +3152,85 @@ return null; } + // This method does not copy the returned Method object! private static Method searchMethods(Method[] methods, String name, Class<?>[] parameterTypes) { + ReflectionFactory fact = getReflectionFactory(); Method res = null; - String internedName = name.intern(); for (Method m : methods) { - if (m.getName() == internedName - && arrayContentsEq(parameterTypes, m.getParameterTypes()) + if (m.getName().equals(name) + && arrayContentsEq(parameterTypes, + fact.getExecutableSharedParameterTypes(m)) && (res == null - || res.getReturnType().isAssignableFrom(m.getReturnType()))) + || (res.getReturnType() != m.getReturnType() + && res.getReturnType().isAssignableFrom(m.getReturnType())))) res = m; } - - return (res == null ? res : getReflectionFactory().copyMethod(res)); + return res; } - private Method getMethod0(String name, Class<?>[] parameterTypes, boolean includeStaticMethods) { - MethodArray interfaceCandidates = new MethodArray(2); - Method res = privateGetMethodRecursive(name, parameterTypes, includeStaticMethods, interfaceCandidates); - if (res != null) - return res; - - // Not found on class or superclass directly - interfaceCandidates.removeLessSpecifics(); - return interfaceCandidates.getFirst(); // may be null + private static final Class<?>[] EMPTY_CLASS_ARRAY = new Class<?>[0]; + + // Returns a "root" Method object. This Method object must NOT + // be propagated to the outside world, but must instead be copied + // via ReflectionFactory.copyMethod. + private Method getMethod0(String name, Class<?>[] parameterTypes) { + PublicMethods.MethodList res = getMethodsRecursive( + name, + parameterTypes == null ? EMPTY_CLASS_ARRAY : parameterTypes, + /* includeStatic */ true); + return res == null ? null : res.getMostSpecific(); } - private Method privateGetMethodRecursive(String name, - Class<?>[] parameterTypes, - boolean includeStaticMethods, - MethodArray allInterfaceCandidates) { - // Note: the intent is that the search algorithm this routine - // uses be equivalent to the ordering imposed by - // privateGetPublicMethods(). It fetches only the declared - // public methods for each class, however, to reduce the - // number of Method objects which have to be created for the - // common case where the method being requested is declared in - // the class which is being queried. - // - // Due to default methods, unless a method is found on a superclass, - // methods declared in any superinterface needs to be considered. - // Collect all candidates declared in superinterfaces in {@code - // allInterfaceCandidates} and select the most specific if no match on - // a superclass is found. - - // Must _not_ return root methods - Method res; - // Search declared public methods - if ((res = searchMethods(privateGetDeclaredMethods(true), - name, - parameterTypes)) != null) { - if (includeStaticMethods || !Modifier.isStatic(res.getModifiers())) - return res; + // Returns a list of "root" Method objects. These Method objects must NOT + // be propagated to the outside world, but must instead be copied + // via ReflectionFactory.copyMethod. + private PublicMethods.MethodList getMethodsRecursive(String name, + Class<?>[] parameterTypes, + boolean includeStatic) { + // 1st check declared public methods + Method[] methods = privateGetDeclaredMethods(/* publicOnly */ true); + PublicMethods.MethodList res = PublicMethods.MethodList + .filter(methods, name, parameterTypes, includeStatic); + // if there is at least one match among declared methods, we need not + // search any further as such match surely overrides matching methods + // declared in superclass(es) or interface(s). + if (res != null) { + return res; } - // Search superclass's methods - if (!isInterface()) { - Class<? super T> c = getSuperclass(); - if (c != null) { - if ((res = c.getMethod0(name, parameterTypes, true)) != null) { - return res; - } - } + + // if there was no match among declared methods, + // we must consult the superclass (if any) recursively... + Class<?> sc = getSuperclass(); + if (sc != null) { + res = sc.getMethodsRecursive(name, parameterTypes, includeStatic); } - // Search superinterfaces' methods - Class<?>[] interfaces = getInterfaces(); - for (Class<?> c : interfaces) - if ((res = c.getMethod0(name, parameterTypes, false)) != null) - allInterfaceCandidates.add(res); - // Not found - return null; + + // ...and coalesce the superclass methods with methods obtained + // from directly implemented interfaces excluding static methods... + for (Class<?> intf : getInterfaces(/* cloneArray */ false)) { + res = PublicMethods.MethodList.merge( + res, intf.getMethodsRecursive(name, parameterTypes, + /* includeStatic */ false)); + } + + return res; } + // Returns a "root" Constructor object. This Constructor object must NOT + // be propagated to the outside world, but must instead be copied + // via ReflectionFactory.copyConstructor. private Constructor<T> getConstructor0(Class<?>[] parameterTypes, int which) throws NoSuchMethodException { + ReflectionFactory fact = getReflectionFactory(); Constructor<T>[] constructors = privateGetDeclaredConstructors((which == Member.PUBLIC)); for (Constructor<T> constructor : constructors) { if (arrayContentsEq(parameterTypes, - constructor.getParameterTypes())) { - return getReflectionFactory().copyConstructor(constructor); + fact.getExecutableSharedParameterTypes(constructor))) { + return constructor; } } throw new NoSuchMethodException(getName() + ".<init>" + argumentTypesToString(parameterTypes));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/PublicMethods.java Tue Jan 17 15:27:22 2017 +0100 @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang; + +import jdk.internal.reflect.ReflectionFactory; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.security.AccessController; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * A collection of most specific public methods. Methods are added to it using + * {@link #merge(Method)} method. Only the most specific methods for a + * particular signature are kept. + */ +final class PublicMethods { + + /** + * a map of (method name, parameter types) -> linked list of Method(s) + */ + private final Map<Key, MethodList> map = new LinkedHashMap<>(); + + /** + * keeps track of the number of collected methods + */ + private int methodCount; + + /** + * Merges new method with existing methods. New method is either + * ignored (if a more specific method with same signature exists) or added + * to the collection. When it is added to the collection, it may replace one + * or more existing methods with same signature if they are less specific + * than added method. + * See comments in code... + */ + void merge(Method method) { + Key key = new Key(method); + MethodList existing = map.get(key); + int xLen = existing == null ? 0 : existing.length(); + MethodList merged = MethodList.merge(existing, method); + methodCount += merged.length() - xLen; + // replace if head of list changed + if (merged != existing) { + map.put(key, merged); + } + } + + /** + * Dumps methods to array. + */ + Method[] toArray() { + Method[] array = new Method[methodCount]; + int i = 0; + for (MethodList ml : map.values()) { + for (; ml != null; ml = ml.next) { + array[i++] = ml.method; + } + } + return array; + } + + /** + * Method (name, parameter types) tuple. + */ + private static final class Key { + private static final ReflectionFactory reflectionFactory = + AccessController.doPrivileged( + new ReflectionFactory.GetReflectionFactoryAction()); + + private final String name; // must be interned (as from Method.getName()) + private final Class<?>[] ptypes; + + Key(Method method) { + name = method.getName(); + ptypes = reflectionFactory.getExecutableSharedParameterTypes(method); + } + + static boolean matches(Method method, + String name, // may not be interned + Class<?>[] ptypes) { + return method.getName().equals(name) && + Arrays.equals( + reflectionFactory.getExecutableSharedParameterTypes(method), + ptypes + ); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Key)) return false; + Key that = (Key) o; + //noinspection StringEquality (guaranteed interned String(s)) + return name == that.name && + Arrays.equals(ptypes, that.ptypes); + } + + @Override + public int hashCode() { + return System.identityHashCode(name) + // guaranteed interned String + 31 * Arrays.hashCode(ptypes); + } + } + + /** + * Node of a inked list containing Method(s) sharing the same + * (name, parameter types) tuple. + */ + static final class MethodList { + Method method; + MethodList next; + + private MethodList(Method method) { + this.method = method; + } + + /** + * @return the head of a linked list containing given {@code methods} + * filtered by given method {@code name}, parameter types + * {@code ptypes} and including or excluding static methods as + * requested by {@code includeStatic} flag. + */ + static MethodList filter(Method[] methods, String name, + Class<?>[] ptypes, boolean includeStatic) { + MethodList head = null, tail = null; + for (Method method : methods) { + if ((includeStatic || !Modifier.isStatic(method.getModifiers())) && + Key.matches(method, name, ptypes)) { + if (tail == null) { + head = tail = new MethodList(method); + } else { + tail = tail.next = new MethodList(method); + } + } + } + return head; + } + + /** + * This method should only be called with the {@code head} (possibly null) + * of a list of Method(s) that share the same (method name, parameter types) + * and another {@code methodList} that also contains Method(s) with the + * same and equal (method name, parameter types) as the 1st list. + * It modifies the 1st list and returns the head of merged list + * containing only the most specific methods for each signature + * (i.e. return type). The returned head of the merged list may or + * may not be the same as the {@code head} of the given list. + * The given {@code methodList} is not modified. + */ + static MethodList merge(MethodList head, MethodList methodList) { + for (MethodList ml = methodList; ml != null; ml = ml.next) { + head = merge(head, ml.method); + } + return head; + } + + private static MethodList merge(MethodList head, Method method) { + Class<?> dclass = method.getDeclaringClass(); + Class<?> rtype = method.getReturnType(); + MethodList prev = null; + for (MethodList l = head; l != null; l = l.next) { + // eXisting method + Method xmethod = l.method; + // only merge methods with same signature: + // (return type, name, parameter types) tuple + // as we only keep methods with same (name, parameter types) + // tuple together in one list, we only need to check return type + if (rtype == xmethod.getReturnType()) { + Class<?> xdclass = xmethod.getDeclaringClass(); + if (dclass.isInterface() == xdclass.isInterface()) { + // both methods are declared by interfaces + // or both by classes + if (dclass.isAssignableFrom(xdclass)) { + // existing method is the same or overrides + // new method - ignore new method + return head; + } + if (xdclass.isAssignableFrom(dclass)) { + // new method overrides existing + // method - knock out existing method + if (prev != null) { + prev.next = l.next; + } else { + head = l.next; + } + // keep iterating + } else { + // unrelated (should only happen for interfaces) + prev = l; + // keep iterating + } + } else if (dclass.isInterface()) { + // new method is declared by interface while + // existing method is declared by class - + // ignore new method + return head; + } else /* xdclass.isInterface() */ { + // new method is declared by class while + // existing method is declared by interface - + // knock out existing method + if (prev != null) { + prev.next = l.next; + } else { + head = l.next; + } + // keep iterating + } + } else { + // distinct signatures + prev = l; + // keep iterating + } + } + // append new method to the list + if (prev == null) { + head = new MethodList(method); + } else { + prev.next = new MethodList(method); + } + return head; + } + + private int length() { + int len = 1; + for (MethodList ml = next; ml != null; ml = ml.next) { + len++; + } + return len; + } + + /** + * @return 1st method in list with most specific return type + */ + Method getMostSpecific() { + Method m = method; + Class<?> rt = m.getReturnType(); + for (MethodList ml = next; ml != null; ml = ml.next) { + Method m2 = ml.method; + Class<?> rt2 = m2.getReturnType(); + if (rt2 != rt && rt.isAssignableFrom(rt2)) { + // found more specific return type + m = m2; + rt = rt2; + } + } + return m; + } + } +}
--- a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1786,10 +1786,6 @@ AccessMode(final String methodName, AccessType at) { this.methodName = methodName; this.at = at; - - // Assert that return type is correct - // Otherwise, when disabled avoid using reflection - assert at.returnType == getReturnType(methodName); } /** @@ -1821,16 +1817,6 @@ throw new IllegalArgumentException("No AccessMode value for method name " + methodName); } - private static Class<?> getReturnType(String name) { - try { - Method m = VarHandle.class.getMethod(name, Object[].class); - return m.getReturnType(); - } - catch (Exception e) { - throw newInternalError(e); - } - } - @ForceInline static MemberName getMemberName(int ordinal, VarForm vform) { return vform.memberName_table[ordinal];
--- a/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java Tue Jan 17 15:27:22 2017 +0100 @@ -240,6 +240,11 @@ } + @Override + Class<?>[] getSharedParameterTypes() { + return parameterTypes; + } + /** * {@inheritDoc} */
--- a/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java Tue Jan 17 15:27:22 2017 +0100 @@ -222,6 +222,10 @@ */ public abstract TypeVariable<?>[] getTypeParameters(); + // returns shared array of parameter types - must never give it out + // to the untrusted code... + abstract Class<?>[] getSharedParameterTypes(); + /** * Returns an array of {@code Class} objects that represent the formal * parameter types, in declaration order, of the executable
--- a/jdk/src/java.base/share/classes/java/lang/reflect/Method.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Method.java Tue Jan 17 15:27:22 2017 +0100 @@ -290,6 +290,11 @@ } else { return getReturnType();} } + @Override + Class<?>[] getSharedParameterTypes() { + return parameterTypes; + } + /** * {@inheritDoc} */
--- a/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java Tue Jan 17 15:27:22 2017 +0100 @@ -132,6 +132,10 @@ return ex.getTypeAnnotationBytes(); } + public Class<?>[] getExecutableSharedParameterTypes(Executable ex) { + return ex.getSharedParameterTypes(); + } + // // Copying routines, needed to quickly fabricate new Field, // Method, and Constructor objects from templates
--- a/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -172,6 +172,8 @@ /** * Sets the pattern. * @param newPattern See the class description. + * @exception NullPointerException if {@code newPattern} + * is {@code null} */ public void applyPattern(String newPattern) { StringBuffer[] segments = new StringBuffer[2]; @@ -309,6 +311,8 @@ * Constructs with limits and corresponding formats based on the pattern. * * @param newPattern the new pattern string + * @exception NullPointerExcpetion if {@code newPattern} is + * {@code null} * @see #applyPattern */ public ChoiceFormat(String newPattern) { @@ -320,6 +324,8 @@ * * @param limits limits in ascending order * @param formats corresponding format strings + * @exception NullPointerException if {@code limits} or {@code formats} + * is {@code null} * @see #setChoices */ public ChoiceFormat(double[] limits, String[] formats) { @@ -339,6 +345,8 @@ * When formatting with object Y, * if the object is a NumberFormat, then ((NumberFormat) Y).format(X) * is called. Otherwise Y.toString() is called. + * @exception NullPointerException if {@code limits} or + * {@code formats} is {@code null} */ public void setChoices(double[] limits, String formats[]) { if (limits.length != formats.length) { @@ -386,6 +394,8 @@ * @param number number to be formatted and substituted. * @param toAppendTo where text is appended. * @param status ignore no useful status is returned. + * @exception NullPointerException if {@code toAppendTo} + * is {@code null} */ public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition status) { @@ -414,6 +424,9 @@ * status.index is unchanged and status.errorIndex is set to the * first index of the character that caused the parse to fail. * @return A Number representing the value of the number parsed. + * @exception NullPointerException if {@code status} is {@code null} + * or if {@code text} is {@code null} and the list of + * choice strings is not empty. */ public Number parse(String text, ParsePosition status) { // find the best number (defined as the one with the longest parse)
--- a/jdk/src/java.base/share/classes/java/text/DateFormat.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/text/DateFormat.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -141,6 +141,25 @@ * If multiple threads access a format concurrently, it must be synchronized * externally. * + * @implSpec + * <ul><li>The {@link #format(Date, StringBuffer, FieldPosition)} and + * {@link #parse(String, ParsePosition)} methods may throw + * {@code NullPointerException}, if any of their parameter is {@code null}. + * The subclass may provide its own implementation and specification about + * {@code NullPointerException}.</li> + * <li>The {@link #setCalendar(Calendar)}, {@link + * #setNumberFormat(NumberFormat)} and {@link #setTimeZone(TimeZone)} methods + * do not throw {@code NullPointerException} when their parameter is + * {@code null}, but any subsequent operations on the same instance may throw + * {@code NullPointerException}.</li> + * <li>The {@link #getCalendar()}, {@link #getNumberFormat()} and + * {@link getTimeZone()} methods may return {@code null}, if the respective + * values of this instance is set to {@code null} through the corresponding + * setter methods. For Example: {@link #getTimeZone()} may return {@code null}, + * if the {@code TimeZone} value of this instance is set as + * {@link #setTimeZone(java.util.TimeZone) setTimeZone(null)}.</li> + * </ul> + * * @see Format * @see NumberFormat * @see SimpleDateFormat @@ -296,6 +315,8 @@ * the begin index and end index of fieldPosition will be set to * 5 and 8, respectively, for the first occurrence of the timezone * pattern character 'z'. + * @exception IllegalArgumentException if the {@code Format} cannot format + * the given {@code obj}. * @see java.text.Format */ public final StringBuffer format(Object obj, StringBuffer toAppendTo,
--- a/jdk/src/java.base/share/classes/java/text/DecimalFormat.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/text/DecimalFormat.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -514,6 +514,8 @@ * @param result where the text is to be appended * @param fieldPosition On input: an alignment field, if desired. * On output: the offsets of the alignment field. + * @exception NullPointerException if {@code result} or + * {@code fieldPosition} is {@code null} * @exception ArithmeticException if rounding is needed with rounding * mode being set to RoundingMode.UNNECESSARY * @return The formatted number string @@ -632,6 +634,8 @@ * @param result where the text is to be appended * @param fieldPosition On input: an alignment field, if desired. * On output: the offsets of the alignment field. + * @exception NullPointerException if {@code result} or + * {@code fieldPosition} is {@code null} * @exception ArithmeticException if rounding is needed with rounding * mode being set to RoundingMode.UNNECESSARY * @return The formatted number string
--- a/jdk/src/java.base/share/classes/java/text/MessageFormat.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/text/MessageFormat.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -356,6 +356,8 @@ * * @param pattern the pattern for this message format * @exception IllegalArgumentException if the pattern is invalid + * @exception NullPointerException if {@code pattern} is + * {@code null} */ public MessageFormat(String pattern) { this.locale = Locale.getDefault(Locale.Category.FORMAT); @@ -373,6 +375,8 @@ * @param pattern the pattern for this message format * @param locale the locale for this message format * @exception IllegalArgumentException if the pattern is invalid + * @exception NullPointerException if {@code pattern} is + * {@code null} * @since 1.4 */ public MessageFormat(String pattern, Locale locale) { @@ -420,6 +424,8 @@ * * @param pattern the pattern for this message format * @exception IllegalArgumentException if the pattern is invalid + * @exception NullPointerException if {@code pattern} is + * {@code null} */ @SuppressWarnings("fallthrough") // fallthrough in switch is expected, suppress it public void applyPattern(String pattern) { @@ -814,6 +820,7 @@ * @exception IllegalArgumentException if an argument in the * <code>arguments</code> array is not of the type * expected by the format element(s) that use it. + * @exception NullPointerException if {@code result} is {@code null} */ public final StringBuffer format(Object[] arguments, StringBuffer result, FieldPosition pos) @@ -835,6 +842,7 @@ * or if an argument in the <code>arguments</code> array * is not of the type expected by the format element(s) * that use it. + * @exception NullPointerException if {@code pattern} is {@code null} */ public static String format(String pattern, Object ... arguments) { MessageFormat temp = new MessageFormat(pattern); @@ -858,6 +866,7 @@ * @exception IllegalArgumentException if an argument in the * <code>arguments</code> array is not of the type * expected by the format element(s) that use it. + * @exception NullPointerException if {@code result} is {@code null} */ public final StringBuffer format(Object arguments, StringBuffer result, FieldPosition pos) @@ -947,6 +956,8 @@ * @param source the string to parse * @param pos the parse position * @return an array of parsed objects + * @exception NullPointerException if {@code pos} is {@code null} + * for a non-null {@code source} string. */ public Object[] parse(String source, ParsePosition pos) { if (source == null) {
--- a/jdk/src/java.base/share/classes/java/text/NumberFormat.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/text/NumberFormat.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -174,6 +174,13 @@ * If multiple threads access a format concurrently, it must be synchronized * externally. * + * @implSpec The {@link #format(double, StringBuffer, FieldPosition)}, + * {@link #format(long, StringBuffer, FieldPosition)} and + * {@link #parse(String, ParsePosition)} methods may throw + * {@code NullPointerException}, if any of their parameter is {@code null}. + * The subclass may provide its own implementation and specification about + * {@code NullPointerException}. + * * @see DecimalFormat * @see ChoiceFormat * @author Mark Davis
--- a/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -905,6 +905,7 @@ * @param startDate During parsing, two digit years will be placed in the range * <code>startDate</code> to <code>startDate + 100 years</code>. * @see #get2DigitYearStart + * @throws NullPointerException if {@code startDate} is {@code null}. * @since 1.2 */ public void set2DigitYearStart(Date startDate) { @@ -933,7 +934,7 @@ * @param pos the formatting position. On input: an alignment field, * if desired. On output: the offsets of the alignment field. * @return the formatted date-time string. - * @exception NullPointerException if the given {@code date} is {@code null}. + * @exception NullPointerException if any of the parameters is {@code null}. */ @Override public StringBuffer format(Date date, StringBuffer toAppendTo,
--- a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatter.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatter.java Tue Jan 17 15:27:22 2017 +0100 @@ -292,12 +292,12 @@ * W week-of-month number 4 * E day-of-week text Tue; Tuesday; T * e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T - * F week-of-month number 3 + * F day-of-week-in-month number 3 * * a am-pm-of-day text PM * h clock-hour-of-am-pm (1-12) number 12 * K hour-of-am-pm (0-11) number 0 - * k clock-hour-of-am-pm (1-24) number 0 + * k clock-hour-of-day (1-24) number 24 * * H hour-of-day (0-23) number 0 * m minute-of-hour number 30
--- a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Tue Jan 17 15:27:22 2017 +0100 @@ -1486,12 +1486,12 @@ * W week-of-month number 4 * E day-of-week text Tue; Tuesday; T * e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T - * F week-of-month number 3 + * F day-of-week-in-month number 3 * * a am-pm-of-day text PM * h clock-hour-of-am-pm (1-12) number 12 * K hour-of-am-pm (0-11) number 0 - * k clock-hour-of-am-pm (1-24) number 0 + * k clock-hour-of-day (1-24) number 24 * * H hour-of-day (0-23) number 0 * m minute-of-hour number 30
--- a/jdk/src/java.base/share/classes/java/time/zone/ZoneRules.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/time/zone/ZoneRules.java Tue Jan 17 15:27:22 2017 +0100 @@ -871,13 +871,13 @@ /** * Gets the previous transition before the specified instant. * <p> - * This returns details of the previous transition after the specified instant. + * This returns details of the previous transition before the specified instant. * For example, if the instant represents a point where "summer" daylight saving time * applies, then the method will return the transition from the previous "winter" time. * * @param instant the instant to get the previous transition after, not null, but null * may be ignored if the rules have a single offset for all instants - * @return the previous transition after the specified instant, null if this is before the first transition + * @return the previous transition before the specified instant, null if this is before the first transition */ public ZoneOffsetTransition previousTransition(Instant instant) { if (savingsInstantTransitions.length == 0) {
--- a/jdk/src/java.base/share/classes/java/util/Random.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/util/Random.java Tue Jan 17 15:27:22 2017 +0100 @@ -187,7 +187,7 @@ * * This is a linear congruential pseudorandom number generator, as * defined by D. H. Lehmer and described by Donald E. Knuth in - * <i>The Art of Computer Programming,</i> Volume 3: + * <i>The Art of Computer Programming,</i> Volume 2: * <i>Seminumerical Algorithms</i>, section 3.2.1. * * @param bits random bits @@ -570,7 +570,7 @@ * }}</pre> * This uses the <i>polar method</i> of G. E. P. Box, M. E. Muller, and * G. Marsaglia, as described by Donald E. Knuth in <i>The Art of - * Computer Programming</i>, Volume 3: <i>Seminumerical Algorithms</i>, + * Computer Programming</i>, Volume 2: <i>Seminumerical Algorithms</i>, * section 3.4.1, subsection C, algorithm P. Note that it generates two * independent values at the cost of only one call to {@code StrictMath.log} * and one call to {@code StrictMath.sqrt}.
--- a/jdk/src/java.base/share/classes/java/util/function/package-info.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/java/util/function/package-info.java Tue Jan 17 15:27:22 2017 +0100 @@ -74,7 +74,7 @@ * {@link java.util.function.Function} (unary function from {@code T} to {@code R}), * {@link java.util.function.Consumer} (unary function from {@code T} to {@code void}), * {@link java.util.function.Predicate} (unary function from {@code T} to {@code boolean}), - * and {@link java.util.function.Supplier} (nilary function to {@code R}). + * and {@link java.util.function.Supplier} (nullary function to {@code R}). * </li> * * <li>Function shapes have a natural arity based on how they are most
--- a/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java Tue Jan 17 15:27:22 2017 +0100 @@ -96,6 +96,9 @@ /** Gets the "parameterAnnotations" field from a Constructor (used for serialization) */ public byte[] getConstructorParameterAnnotations(Constructor<?> c); + /** Gets the shared array of parameter types of an Executable. */ + public Class<?>[] getExecutableSharedParameterTypes(Executable ex); + // // Copying routines, needed to quickly fabricate new Field, // Method, and Constructor objects from templates
--- a/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java Tue Jan 17 15:27:22 2017 +0100 @@ -345,6 +345,10 @@ return langReflectAccess().getExecutableTypeAnnotationBytes(ex); } + public Class<?>[] getExecutableSharedParameterTypes(Executable ex) { + return langReflectAccess().getExecutableSharedParameterTypes(ex); + } + //-------------------------------------------------------------------------- // // Routines used by serialization
--- a/jdk/src/java.base/share/classes/sun/net/www/ParseUtil.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/sun/net/www/ParseUtil.java Tue Jan 17 15:27:22 2017 +0100 @@ -26,7 +26,6 @@ package sun.net.www; import java.util.BitSet; -import java.io.UnsupportedEncodingException; import java.io.File; import java.net.URL; import java.net.MalformedURLException; @@ -49,7 +48,7 @@ static BitSet encodedInPath; static { - encodedInPath = new BitSet(256); + encodedInPath = new BitSet(128); // Set the bits corresponding to characters that are encoded in the // path component of a URI. @@ -102,14 +101,45 @@ * dependent File.separatorChar. */ public static String encodePath(String path, boolean flag) { - char[] retCC = new char[path.length() * 2 + 16]; - int retLen = 0; - char[] pathCC = path.toCharArray(); + if (flag && File.separatorChar != '/') { + return encodePath(path, 0, File.separatorChar); + } else { + int index = firstEncodeIndex(path); + if (index > -1) { + return encodePath(path, index, '/'); + } else { + return path; + } + } + } - int n = path.length(); - for (int i=0; i<n; i++) { + private static int firstEncodeIndex(String path) { + int len = path.length(); + for (int i = 0; i < len; i++) { + char c = path.charAt(i); + if (c == '/' || c == '.' || + c >= 'a' && c <= 'z' || + c >= 'A' && c <= 'Z' || + c >= '0' && c <= '9') { + continue; + } else if (c > 0x007F || encodedInPath.get(c)) { + return i; + } + } + return -1; + } + + private static String encodePath(String path, int index, char sep) { + char[] pathCC = path.toCharArray(); + char[] retCC = new char[pathCC.length * 2 + 16 - index]; + if (index > 0) { + System.arraycopy(pathCC, 0, retCC, 0, index); + } + int retLen = index; + + for (int i = index; i < pathCC.length; i++) { char c = pathCC[i]; - if ((!flag && c == '/') || (flag && c == File.separatorChar)) + if (c == sep) retCC[retLen++] = '/'; else { if (c <= 0x007F) { @@ -117,11 +147,11 @@ c >= 'A' && c <= 'Z' || c >= '0' && c <= '9') { retCC[retLen++] = c; - } else - if (encodedInPath.get(c)) + } else if (encodedInPath.get(c)) { retLen = escape(retCC, c, retLen); - else + } else { retCC[retLen++] = c; + } } else if (c > 0x07FF) { retLen = escape(retCC, (char)(0xE0 | ((c >> 12) & 0x0F)), retLen); retLen = escape(retCC, (char)(0x80 | ((c >> 6) & 0x3F)), retLen);
--- a/jdk/src/java.base/share/classes/sun/security/ssl/InputRecord.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/sun/security/ssl/InputRecord.java Tue Jan 17 15:27:22 2017 +0100 @@ -242,8 +242,9 @@ // 2: ClientHello.client_version // 32: ClientHello.random // 1: length byte of ClientHello.session_id + // 2: length bytes of ClientHello.cipher_suites // 2: empty ClientHello.compression_methods - int requiredSize = 46 + sessionIdLen + ((cipherSpecLen * 2 ) / 3 ); + int requiredSize = 48 + sessionIdLen + ((cipherSpecLen * 2 ) / 3 ); byte[] converted = new byte[requiredSize]; /*
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java Tue Jan 17 15:27:22 2017 +0100 @@ -935,12 +935,20 @@ } private static TrustManager[] getTrustManagers() throws Exception { - KeyStore ks = - TrustManagerFactoryImpl.getCacertsKeyStore("defaultctx"); + TrustManagerFactory tmf = TrustManagerFactory.getInstance( + TrustManagerFactory.getDefaultAlgorithm()); + if ("SunJSSE".equals(tmf.getProvider().getName())) { + // The implementation will load the default KeyStore + // automatically. Cached trust materials may be used + // for performance improvement. + tmf.init((KeyStore)null); + } else { + // Use the explicitly specified KeyStore for third party's + // TrustManagerFactory implementation. + KeyStore ks = TrustStoreManager.getTrustedKeyStore(); + tmf.init(ks); + } - TrustManagerFactory tmf = TrustManagerFactory.getInstance( - TrustManagerFactory.getDefaultAlgorithm()); - tmf.init(ks); return tmf.getTrustManagers(); }
--- a/jdk/src/java.base/share/classes/sun/security/ssl/TrustManagerFactoryImpl.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/sun/security/ssl/TrustManagerFactoryImpl.java Tue Jan 17 15:27:22 2017 +0100 @@ -32,6 +32,7 @@ import javax.net.ssl.*; import sun.security.validator.Validator; +import sun.security.validator.TrustStoreUtil; abstract class TrustManagerFactoryImpl extends TrustManagerFactorySpi { @@ -47,7 +48,7 @@ protected void engineInit(KeyStore ks) throws KeyStoreException { if (ks == null) { try { - ks = getCacertsKeyStore("trustmanager"); + trustManager = getInstance(TrustStoreManager.getTrustedCerts()); } catch (SecurityException se) { // eat security exceptions but report other throwables if (debug != null && Debug.isOn("trustmanager")) { @@ -72,14 +73,17 @@ "SunX509: skip default keystore: " + e); } throw new KeyStoreException( - "problem accessing trust store" + e); + "problem accessing trust store", e); } + } else { + trustManager = getInstance(TrustStoreUtil.getTrustedCerts(ks)); } - trustManager = getInstance(ks); + isInitialized = true; } - abstract X509TrustManager getInstance(KeyStore ks) throws KeyStoreException; + abstract X509TrustManager getInstance( + Collection<X509Certificate> trustedCerts); abstract X509TrustManager getInstance(ManagerFactoryParameters spec) throws InvalidAlgorithmParameterException; @@ -126,126 +130,14 @@ }); } - /** - * Returns the keystore with the configured CA certificates. - */ - static KeyStore getCacertsKeyStore(String dbgname) throws Exception - { - String storeFileName = null; - File storeFile = null; - FileInputStream fis = null; - String defaultTrustStoreType; - String defaultTrustStoreProvider; - final HashMap<String,String> props = new HashMap<>(); - final String sep = File.separator; - KeyStore ks = null; - - AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - props.put("trustStore", System.getProperty( - "javax.net.ssl.trustStore")); - props.put("javaHome", System.getProperty( - "java.home")); - props.put("trustStoreType", System.getProperty( - "javax.net.ssl.trustStoreType", - KeyStore.getDefaultType())); - props.put("trustStoreProvider", System.getProperty( - "javax.net.ssl.trustStoreProvider", "")); - props.put("trustStorePasswd", System.getProperty( - "javax.net.ssl.trustStorePassword", "")); - return null; - } - }); - - /* - * Try: - * javax.net.ssl.trustStore (if this variable exists, stop) - * jssecacerts - * cacerts - * - * If none exists, we use an empty keystore. - */ - - try { - storeFileName = props.get("trustStore"); - if (!"NONE".equals(storeFileName)) { - if (storeFileName != null) { - storeFile = new File(storeFileName); - fis = getFileInputStream(storeFile); - } else { - String javaHome = props.get("javaHome"); - storeFile = new File(javaHome + sep + "lib" + sep - + "security" + sep + - "jssecacerts"); - if ((fis = getFileInputStream(storeFile)) == null) { - storeFile = new File(javaHome + sep + "lib" + sep - + "security" + sep + - "cacerts"); - fis = getFileInputStream(storeFile); - } - } - - if (fis != null) { - storeFileName = storeFile.getPath(); - } else { - storeFileName = "No File Available, using empty keystore."; - } - } - - defaultTrustStoreType = props.get("trustStoreType"); - defaultTrustStoreProvider = props.get("trustStoreProvider"); - if (debug != null && Debug.isOn(dbgname)) { - System.out.println("trustStore is: " + storeFileName); - System.out.println("trustStore type is : " + - defaultTrustStoreType); - System.out.println("trustStore provider is : " + - defaultTrustStoreProvider); - } - - /* - * Try to initialize trust store. - */ - if (defaultTrustStoreType.length() != 0) { - if (debug != null && Debug.isOn(dbgname)) { - System.out.println("init truststore"); - } - if (defaultTrustStoreProvider.length() == 0) { - ks = KeyStore.getInstance(defaultTrustStoreType); - } else { - ks = KeyStore.getInstance(defaultTrustStoreType, - defaultTrustStoreProvider); - } - char[] passwd = null; - String defaultTrustStorePassword = - props.get("trustStorePasswd"); - if (defaultTrustStorePassword.length() != 0) - passwd = defaultTrustStorePassword.toCharArray(); - - // if trustStore is NONE, fis will be null - ks.load(fis, passwd); - - // Zero out the temporary password storage - if (passwd != null) { - for (int i = 0; i < passwd.length; i++) { - passwd[i] = (char)0; - } - } - } - } finally { - if (fis != null) { - fis.close(); - } + public static final class SimpleFactory extends TrustManagerFactoryImpl { + @Override + X509TrustManager getInstance( + Collection<X509Certificate> trustedCerts) { + return new X509TrustManagerImpl( + Validator.TYPE_SIMPLE, trustedCerts); } - return ks; - } - - public static final class SimpleFactory extends TrustManagerFactoryImpl { - @Override - X509TrustManager getInstance(KeyStore ks) throws KeyStoreException { - return new X509TrustManagerImpl(Validator.TYPE_SIMPLE, ks); - } @Override X509TrustManager getInstance(ManagerFactoryParameters spec) throws InvalidAlgorithmParameterException { @@ -253,13 +145,15 @@ ("SunX509 TrustManagerFactory does not use " + "ManagerFactoryParameters"); } - } + } public static final class PKIXFactory extends TrustManagerFactoryImpl { @Override - X509TrustManager getInstance(KeyStore ks) throws KeyStoreException { - return new X509TrustManagerImpl(Validator.TYPE_PKIX, ks); + X509TrustManager getInstance( + Collection<X509Certificate> trustedCerts) { + return new X509TrustManagerImpl(Validator.TYPE_PKIX, trustedCerts); } + @Override X509TrustManager getInstance(ManagerFactoryParameters spec) throws InvalidAlgorithmParameterException {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.base/share/classes/sun/security/ssl/TrustStoreManager.java Tue Jan 17 15:27:22 2017 +0100 @@ -0,0 +1,395 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.ssl; + +import java.lang.ref.WeakReference; +import java.io.*; +import java.util.*; + +import java.security.*; +import java.security.cert.*; +import java.security.cert.Certificate; + +import sun.security.action.*; +import sun.security.validator.TrustStoreUtil; + +/** + * Collection of static utility methods to manage the default trusted KeyStores + * effectively. + */ +final class TrustStoreManager { + private static final Debug debug = Debug.getInstance("ssl"); + + // A singleton service to manage the default trusted KeyStores effectively. + private static final TrustAnchorManager tam = new TrustAnchorManager(); + + // Restrict instantiation of this class. + private TrustStoreManager() { + // empty + } + + /** + * Return an unmodifiable set of all trusted X509Certificates contained + * in the default trusted KeyStore. + */ + public static Set<X509Certificate> getTrustedCerts() throws Exception { + return tam.getTrustedCerts(TrustStoreDescriptor.createInstance()); + } + + /** + * Return an instance of the default trusted KeyStore. + */ + public static KeyStore getTrustedKeyStore() throws Exception { + return tam.getKeyStore(TrustStoreDescriptor.createInstance()); + } + + /** + * A descriptor of the default trusted KeyStore. + * + * The preference of the default trusted KeyStore is: + * javax.net.ssl.trustStore + * jssecacerts + * cacerts + */ + private static final class TrustStoreDescriptor { + private static final String fileSep = File.separator; + private static final String defaultStorePath = + GetPropertyAction.privilegedGetProperty("java.home") + + fileSep + "lib" + fileSep + "security"; + private static final String defaultStore = + defaultStorePath + fileSep + "cacerts"; + private static final String jsseDefaultStore = + defaultStorePath + fileSep + "jssecacerts"; + + // the trust store name + private final String storeName; + + // the trust store type, JKS/PKCS12 + private final String storeType; + + // the provider of the trust store + private final String storeProvider; + + // the password used for the trust store + private final String storePassword; + + // the File object of the trust store + private final File storeFile; + + // the last modified time of the store + private final long lastModified; + + private TrustStoreDescriptor(String storeName, String storeType, + String storeProvider, String storePassword, + File storeFile, long lastModified) { + this.storeName = storeName; + this.storeType = storeType; + this.storeProvider = storeProvider; + this.storePassword = storePassword; + this.storeFile = storeFile; + this.lastModified = lastModified; + + if (debug != null && Debug.isOn("trustmanager")) { + System.out.println( + "trustStore is: " + storeName + "\n" + + "trustStore type is: " + storeType + "\n" + + "trustStore provider is: " + storeProvider + "\n" + + "the last modified time is: " + (new Date(lastModified))); + } + } + + /** + * Create an instance of TrustStoreDescriptor for the default + * trusted KeyStore. + */ + static TrustStoreDescriptor createInstance() { + return AccessController.doPrivileged(new PrivilegedAction<>() { + + @Override + public TrustStoreDescriptor run() { + // Get the system properties for trust store. + String storePropName = System.getProperty( + "javax.net.ssl.trustStore", jsseDefaultStore); + String storePropType = System.getProperty( + "javax.net.ssl.trustStoreType", + KeyStore.getDefaultType()); + String storePropProvider = System.getProperty( + "javax.net.ssl.trustStoreProvider", ""); + String storePropPassword = System.getProperty( + "javax.net.ssl.trustStorePassword", ""); + + String temporaryName = ""; + File temporaryFile = null; + long temporaryTime = 0L; + if (!"NONE".equals(storePropName)) { + String[] fileNames = + new String[] {storePropName, defaultStore}; + for (String fileName : fileNames) { + File f = new File(fileName); + if (f.isFile() && f.canRead()) { + temporaryName = fileName;; + temporaryFile = f; + temporaryTime = f.lastModified(); + + break; + } + + // Not break, the file is inaccessible. + if (debug != null && + Debug.isOn("trustmanager")) { + System.out.println( + "Inaccessible trust store: " + + storePropName); + } + } + } else { + temporaryName = storePropName; + } + + return new TrustStoreDescriptor( + temporaryName, storePropType, storePropProvider, + storePropPassword, temporaryFile, temporaryTime); + } + }); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + + if (obj instanceof TrustStoreDescriptor) { + TrustStoreDescriptor that = (TrustStoreDescriptor)obj; + return ((this.lastModified == that.lastModified) && + Objects.equals(this.storeName, that.storeName) && + Objects.equals(this.storeType, that.storeType) && + Objects.equals(this.storeProvider, that.storeProvider)); + } + + return false; + } + + + // Please be careful if computing security-sensitive attributes' + // hash code. For example the storePassword should not be computed. + @Override + public int hashCode() { + int result = 17; + + if (storeName != null && !storeName.isEmpty()) { + result = 31 * result + storeName.hashCode(); + } + + if (storeType != null && !storeType.isEmpty()) { + result = 31 * result + storeType.hashCode(); + } + + if (storeProvider != null && !storeProvider.isEmpty()) { + result = 31 * result + storeProvider.hashCode(); + } + + if (storeFile != null) { + result = 31 * result + storeFile.hashCode(); + } + + if (lastModified != 0L) { + result = (int)(31 * result + lastModified); + } + + return result; + } + } + + /** + * The trust anchors manager used to expedite the performance. + * + * This class can be used to provide singleton services to access default + * trust KeyStore more effectively. + */ + private static final class TrustAnchorManager { + // Last trust store descriptor. + private TrustStoreDescriptor descriptor; + + // The key store used for the trust anchors. + // + // Use weak reference so that the heavy loaded KeyStore object can + // be atomically cleared, and reloaded if needed. + private WeakReference<KeyStore> ksRef; + + // The trusted X.509 certificates in the key store. + // + // Use weak reference so that the heavy loaded certificates collection + // objects can be atomically cleared, and reloaded if needed. + private WeakReference<Set<X509Certificate>> csRef; + + private TrustAnchorManager() { + this.descriptor = null; + this.ksRef = new WeakReference<>(null); + this.csRef = new WeakReference<>(null); + } + + /** + * Get the default trusted KeyStore with the specified descriptor. + * + * @return null if the underlying KeyStore is not available. + */ + synchronized KeyStore getKeyStore( + TrustStoreDescriptor descriptor) throws Exception { + + TrustStoreDescriptor temporaryDesc = this.descriptor; + KeyStore ks = ksRef.get(); + if ((ks != null) && descriptor.equals(temporaryDesc)) { + return ks; + } + + // Reload a new key store. + if ((debug != null) && Debug.isOn("trustmanager")) { + System.out.println("Reload the trust store"); + } + + ks = loadKeyStore(descriptor); + this.descriptor = descriptor; + this.ksRef = new WeakReference<>(ks); + + return ks; + } + + /** + * Get trusted certificates in the default trusted KeyStore with + * the specified descriptor. + * + * @return empty collection if the underlying KeyStore is not available. + */ + synchronized Set<X509Certificate> getTrustedCerts( + TrustStoreDescriptor descriptor) throws Exception { + + KeyStore ks = null; + TrustStoreDescriptor temporaryDesc = this.descriptor; + Set<X509Certificate> certs = csRef.get(); + if (certs != null) { + if (descriptor.equals(temporaryDesc)) { + return certs; + } else { + // Use the new descriptor. + this.descriptor = descriptor; + } + } else { + // Try to use the cached store at first. + if (descriptor.equals(temporaryDesc)) { + ks = ksRef.get(); + } else { + // Use the new descriptor. + this.descriptor = descriptor; + } + } + + // Reload the trust store if needed. + if (ks == null) { + if ((debug != null) && Debug.isOn("trustmanager")) { + System.out.println("Reload the trust store"); + } + ks = loadKeyStore(descriptor); + } + + // Reload trust certs from the key store. + if ((debug != null) && Debug.isOn("trustmanager")) { + System.out.println("Reload trust certs"); + } + + certs = loadTrustedCerts(ks); + if ((debug != null) && Debug.isOn("trustmanager")) { + System.out.println("Reloaded " + certs.size() + " trust certs"); + } + + // Note that as ks is a local variable, it is not + // necessary to add it to the ksRef weak reference. + this.csRef = new WeakReference<>(certs); + + return certs; + } + + /** + * Load the the KeyStore as described in the specified descriptor. + */ + private static KeyStore loadKeyStore( + TrustStoreDescriptor descriptor) throws Exception { + if (!"NONE".equals(descriptor.storeName) && + descriptor.storeFile == null) { + + // No file available, no KeyStore available. + if (debug != null && Debug.isOn("trustmanager")) { + System.out.println("No available key store"); + } + + return null; + } + + KeyStore ks; + if (descriptor.storeProvider.isEmpty()) { + ks = KeyStore.getInstance(descriptor.storeType); + } else { + ks = KeyStore.getInstance( + descriptor.storeType, descriptor.storeProvider); + } + + char[] password = null; + if (!descriptor.storePassword.isEmpty()) { + password = descriptor.storePassword.toCharArray(); + } + + if (!"NONE".equals(descriptor.storeName)) { + try (FileInputStream fis = AccessController.doPrivileged( + new OpenFileInputStreamAction(descriptor.storeFile))) { + ks.load(fis, password); + } catch (FileNotFoundException fnfe) { + // No file available, no KeyStore available. + if (debug != null && Debug.isOn("trustmanager")) { + System.out.println( + "Not available key store: " + descriptor.storeName); + } + + return null; + } + } else { + ks.load(null, password); + } + + return ks; + } + + /** + * Load trusted certificates from the specified KeyStore. + */ + private static Set<X509Certificate> loadTrustedCerts(KeyStore ks) { + if (ks == null) { + return Collections.<X509Certificate>emptySet(); + } + + return TrustStoreUtil.getTrustedCerts(ks); + } + } +}
--- a/jdk/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -68,16 +68,21 @@ private static final Debug debug = Debug.getInstance("ssl"); - X509TrustManagerImpl(String validatorType, KeyStore ks) - throws KeyStoreException { + X509TrustManagerImpl(String validatorType, + Collection<X509Certificate> trustedCerts) { + this.validatorType = validatorType; this.pkixParams = null; - if (ks == null) { + + if (trustedCerts == null) { trustedCerts = Collections.<X509Certificate>emptySet(); - } else { - trustedCerts = KeyStores.getTrustedCerts(ks); } - showTrustedCerts(); + + this.trustedCerts = trustedCerts; + + if (debug != null && Debug.isOn("trustmanager")) { + showTrustedCerts(); + } } X509TrustManagerImpl(String validatorType, PKIXBuilderParameters params) { @@ -90,7 +95,10 @@ Validator v = getValidator(Validator.VAR_TLS_SERVER); trustedCerts = v.getTrustedCertificates(); serverValidator = v; - showTrustedCerts(); + + if (debug != null && Debug.isOn("trustmanager")) { + showTrustedCerts(); + } } @Override @@ -305,22 +313,20 @@ } private void showTrustedCerts() { - if (debug != null && Debug.isOn("trustmanager")) { - for (X509Certificate cert : trustedCerts) { - System.out.println("adding as trusted cert:"); - System.out.println(" Subject: " - + cert.getSubjectX500Principal()); - System.out.println(" Issuer: " - + cert.getIssuerX500Principal()); - System.out.println(" Algorithm: " - + cert.getPublicKey().getAlgorithm() - + "; Serial number: 0x" - + cert.getSerialNumber().toString(16)); - System.out.println(" Valid from " - + cert.getNotBefore() + " until " - + cert.getNotAfter()); - System.out.println(); - } + for (X509Certificate cert : trustedCerts) { + System.out.println("adding as trusted cert:"); + System.out.println(" Subject: " + + cert.getSubjectX500Principal()); + System.out.println(" Issuer: " + + cert.getIssuerX500Principal()); + System.out.println(" Algorithm: " + + cert.getPublicKey().getAlgorithm() + + "; Serial number: 0x" + + cert.getSerialNumber().toString(16)); + System.out.println(" Valid from " + + cert.getNotBefore() + " until " + + cert.getNotAfter()); + System.out.println(); } }
--- a/jdk/src/java.base/share/classes/sun/security/validator/KeyStores.java Fri Jan 13 16:49:34 2017 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.security.validator; - -import java.io.*; -import java.util.*; - -import java.security.*; -import java.security.cert.*; -import java.security.cert.Certificate; - -import sun.security.action.*; - -/** - * Collection of static utility methods related to KeyStores. - * - * @author Andreas Sterbenz - */ -public class KeyStores { - - private KeyStores() { - // empty - } - - // in the future, all accesses to the system cacerts keystore should - // go through this class. but not right now. -/* - private static final String javaHome = - (String)AccessController.doPrivileged(new GetPropertyAction("java.home")); - - private static final char SEP = File.separatorChar; - - private static KeyStore caCerts; - - private static KeyStore getKeyStore(String type, String name, - char[] password) throws IOException { - if (type == null) { - type = "JKS"; - } - try { - KeyStore ks = KeyStore.getInstance(type); - FileInputStream in = (FileInputStream)AccessController.doPrivileged - (new OpenFileInputStreamAction(name)); - ks.load(in, password); - return ks; - } catch (GeneralSecurityException e) { - // XXX - throw new IOException(); - } catch (PrivilegedActionException e) { - throw (IOException)e.getCause(); - } - } - - /** - * Return a KeyStore with the contents of the lib/security/cacerts file. - * The file is only opened once per JVM invocation and the contents - * cached subsequently. - * - public static synchronized KeyStore getCaCerts() throws IOException { - if (caCerts != null) { - return caCerts; - } - String name = javaHome + SEP + "lib" + SEP + "security" + SEP + "cacerts"; - caCerts = getKeyStore(null, name, null); - return caCerts; - } -*/ - - /** - * Return a Set with all trusted X509Certificates contained in - * this KeyStore. - */ - public static Set<X509Certificate> getTrustedCerts(KeyStore ks) { - Set<X509Certificate> set = new HashSet<X509Certificate>(); - try { - for (Enumeration<String> e = ks.aliases(); e.hasMoreElements(); ) { - String alias = e.nextElement(); - if (ks.isCertificateEntry(alias)) { - Certificate cert = ks.getCertificate(alias); - if (cert instanceof X509Certificate) { - set.add((X509Certificate)cert); - } - } else if (ks.isKeyEntry(alias)) { - Certificate[] certs = ks.getCertificateChain(alias); - if ((certs != null) && (certs.length > 0) && - (certs[0] instanceof X509Certificate)) { - set.add((X509Certificate)certs[0]); - } - } - } - } catch (KeyStoreException e) { - // ignore - } - return set; - } - -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.base/share/classes/sun/security/validator/TrustStoreUtil.java Tue Jan 17 15:27:22 2017 +0100 @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.validator; + +import java.util.Set; +import java.util.HashSet; +import java.util.Collections; +import java.util.Enumeration; + +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.cert.X509Certificate; +import java.security.cert.Certificate; + +/** + * Collection of static utility methods related to trust anchor KeyStores. + * + * @author Andreas Sterbenz + */ +public final class TrustStoreUtil { + + private TrustStoreUtil() { + // empty + } + + /** + * Return an unmodifiable Set with all trusted X509Certificates contained + * in the specified KeyStore. + */ + public static Set<X509Certificate> getTrustedCerts(KeyStore ks) { + Set<X509Certificate> set = new HashSet<>(); + try { + for (Enumeration<String> e = ks.aliases(); e.hasMoreElements(); ) { + String alias = e.nextElement(); + if (ks.isCertificateEntry(alias)) { + Certificate cert = ks.getCertificate(alias); + if (cert instanceof X509Certificate) { + set.add((X509Certificate)cert); + } + } else if (ks.isKeyEntry(alias)) { + Certificate[] certs = ks.getCertificateChain(alias); + if ((certs != null) && (certs.length > 0) && + (certs[0] instanceof X509Certificate)) { + set.add((X509Certificate)certs[0]); + } + } + } + } catch (KeyStoreException e) { + // ignore + // + // This should be rare, but better to log this in the future. + } + + return Collections.unmodifiableSet(set); + } +}
--- a/jdk/src/java.base/share/classes/sun/security/validator/Validator.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/classes/sun/security/validator/Validator.java Tue Jan 17 15:27:22 2017 +0100 @@ -166,7 +166,7 @@ */ public static Validator getInstance(String type, String variant, KeyStore ks) { - return getInstance(type, variant, KeyStores.getTrustedCerts(ks)); + return getInstance(type, variant, TrustStoreUtil.getTrustedCerts(ks)); } /**
--- a/jdk/src/java.base/share/native/libjli/java.c Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/share/native/libjli/java.c Tue Jan 17 15:27:22 2017 +0100 @@ -1248,6 +1248,7 @@ char *value = NULL; int kind = GetOpt(&argc, &argv, &option, &value); jboolean has_arg = value != NULL && JLI_StrLen(value) > 0; + jboolean has_arg_any_len = value != NULL; /* * Option to set main entry point @@ -1269,7 +1270,7 @@ JLI_StrCCmp(arg, "--class-path=") == 0 || JLI_StrCmp(arg, "-classpath") == 0 || JLI_StrCmp(arg, "-cp") == 0) { - REPORT_ERROR (has_arg, ARG_ERROR1, arg); + REPORT_ERROR (has_arg_any_len, ARG_ERROR1, arg); SetClassPath(value); mode = LM_CLASS; } else if (JLI_StrCmp(arg, "--list-modules") == 0 ||
--- a/jdk/src/java.base/unix/native/libjava/io_util_md.c Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/unix/native/libjava/io_util_md.c Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -226,7 +226,12 @@ if (fstat64(fd, &sb) == 0 && length > sb.st_blocks*512) { RESTARTABLE(fallocate64(fd, 0, 0, length), result); - return result; + // Return on success or if errno is neither EOPNOTSUPP nor ENOSYS + if (result == 0) { + return 0; + } else if (errno != EOPNOTSUPP && errno != ENOSYS) { + return result; + } } #endif RESTARTABLE(ftruncate64(fd, length), result);
--- a/jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -197,14 +197,17 @@ * any blocks which can cause a SIGBUS error if the file is subsequently * memory-mapped. */ - return handle(env, - fallocate64(fdval(env, fdo), 0, 0, size), - "Allocation failed"); -#else + // Return on success or if errno is neither EOPNOTSUPP nor ENOSYS + int result = fallocate64(fdval(env, fdo), 0, 0, size); + if (result == 0) { + return 0; + } else if (errno != EOPNOTSUPP && errno != ENOSYS) { + return handle(env, result, "Allocation failed"); + } +#endif return handle(env, ftruncate64(fdval(env, fdo), size), "Truncation failed"); -#endif } JNIEXPORT jlong JNICALL
--- a/jdk/src/java.sql/share/classes/java/sql/DriverManager.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.sql/share/classes/java/sql/DriverManager.java Tue Jan 17 15:27:22 2017 +0100 @@ -64,7 +64,7 @@ *</ul> * *<P> - * @ImplNote + * @implNote * {@code DriverManager} initialization is done lazily and looks up service * providers using the thread context class loader. The drivers loaded and * available to an application will depend on the thread context class loader of
--- a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/TransformService.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/TransformService.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -275,6 +275,10 @@ dom = true; } Provider p = Security.getProvider(provider); + if (p == null) { + throw new NoSuchProviderException("No such provider: " + + provider); + } Service s = p.getService("TransformService", algorithm); if (s != null) { String value = s.getAttribute("MechanismType");
--- a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLSignatureFactory.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLSignatureFactory.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -305,6 +305,10 @@ } Provider p = Security.getProvider(provider); + if (p == null) { + throw new NoSuchProviderException("No such provider: " + + provider); + } Service s = p.getService("XMLSignatureFactory", mechanismType); if (s != null) { Object obj = null;
--- a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -258,6 +258,10 @@ throw new NoSuchProviderException(); } Provider p = Security.getProvider(provider); + if (p == null) { + throw new NoSuchProviderException("No such provider: " + + provider); + } Service s = p.getService("KeyInfoFactory", mechanismType); if (s != null) { Object obj = null;
--- a/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/GssKrb5Client.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/GssKrb5Client.java Tue Jan 17 15:27:22 2017 +0100 @@ -298,7 +298,11 @@ Boolean.valueOf(integrity)}); } - intToNetworkByteOrder(recvMaxBufSize, gssInToken, 1, 3); + if (privacy || integrity) { + // Last paragraph of RFC 4752 3.1: size ... MUST be 0 if the + // client does not support any security layer + intToNetworkByteOrder(recvMaxBufSize, gssInToken, 1, 3); + } if (authzID != null) { // copy authorization id System.arraycopy(authzID, 0, gssInToken, 4, authzID.length);
--- a/jdk/test/java/lang/Class/getMethods/StarInheritance.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/java/lang/Class/getMethods/StarInheritance.java Tue Jan 17 15:27:22 2017 +0100 @@ -49,7 +49,7 @@ interface C3 extends D3 { void m(); } interface D3 { void m() ; } -// B.m, D.m +// B.m interface A4 extends B4, C4 {} interface B4 extends D4 { void m(); } interface C4 extends D4 {} @@ -92,7 +92,7 @@ Class [] l3 = {B3.class, C3.class}; test(A3.class.getMethods(), new ArrayList(Arrays.asList(l3))); - Class [] l4 = {B4.class, D4.class}; + Class [] l4 = {B4.class}; test(A4.class.getMethods(), new ArrayList(Arrays.asList(l4))); } }
--- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessModeMethodNames.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessModeMethodNames.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,12 +24,15 @@ /* * @test * @run testng VarHandleTestAccessModeMethodNames + * @modules java.base/java.lang.invoke:open */ import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.lang.invoke.VarHandle; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.stream.Stream; import static org.testng.Assert.assertEquals; @@ -43,7 +46,6 @@ toArray(Object[][]::new); } - @Test(dataProvider = "accessModesProvider") public void testMethodName(VarHandle.AccessMode am) { assertEquals(am.methodName(), toMethodName(am.name())); @@ -58,4 +60,22 @@ } return s.toString(); } + + + @Test(dataProvider = "accessModesProvider") + public void testReturnType(VarHandle.AccessMode am) throws Exception { + assertEquals(getReturnType(am.methodName()), getAccessModeReturnType(am)); + } + + private static Class<?> getReturnType(String name) throws Exception { + return VarHandle.class.getMethod(name, Object[].class).getReturnType(); + } + + private static Class<?> getAccessModeReturnType(VarHandle.AccessMode am) throws Exception { + Field field_am_at = VarHandle.AccessMode.class.getDeclaredField("at"); + field_am_at.setAccessible(true); + Field field_at_returnType = field_am_at.getType().getDeclaredField("returnType"); + field_at_returnType.setAccessible(true); + return (Class<?>) field_at_returnType.get(field_am_at.get(am)); + } }
--- a/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java Tue Jan 17 15:27:22 2017 +0100 @@ -36,9 +36,8 @@ import java.util.List; import java.util.Map; import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -55,7 +54,7 @@ for (MethodDesc expected : expectedMethods) { if (expected.isGetMethodReturn()) { try { - Method m = iface.getMethod(expected.name()); + Method m = iface.getMethod(expected.name(), expected.parameterTypes()); if (!assertMatch(expected, m)) fail(failMsg(expected, m, iface)); else @@ -72,26 +71,18 @@ public void testGetMethods(Class<?> iface) { List<Method> foundMethods = filterObjectMethods(iface.getMethods()); MethodDesc[] expectedMethods = iface.getAnnotationsByType(MethodDesc.class); - Set<Method> used = new HashSet<>(); for (MethodDesc expected : expectedMethods) { boolean found = false; - for (Method m : foundMethods) { - if (used.contains(m)) - continue; - - if(expected.name().equals(m.getName()) && - expected.declaringClass() ==m.getDeclaringClass()) { - + if (assertMatch(expected, m)) { found = true; - assertMatch(expected, m); - used.add(m); break; } } - if (! found) - fail("On: "+ iface +"\nDid not find " + toMethodString(expected) + " among " + foundMethods); + if (!found) + fail("On: "+ iface +"\nDid not find " + toMethodString(expected) + + " among " + foundMethods); } assertEquals(foundMethods.size(), expectedMethods.length, "\non: " + iface + @@ -104,6 +95,11 @@ return false; if (expected.declaringClass() != m.getDeclaringClass()) return false; + if (!Arrays.equals(expected.parameterTypes(), m.getParameterTypes())) + return false; + if (expected.returnType() != NotSpecified.class && + expected.returnType() != m.getReturnType()) + return false; if (expected.kind() == MethodKind.ABSTRACT) assertTrue(Modifier.isAbstract(m.getModifiers()), m + " should be ABSTRACT"); @@ -128,8 +124,13 @@ } private String toMethodString(MethodDesc m) { - return m.declaringClass().getSimpleName().toString() + "." + - m.name() + "()"; + return (m.returnType() != NotSpecified.class + ? m.returnType().getSimpleName() + " " + : "") + + m.declaringClass().getSimpleName().toString() + "." + + m.name() + Stream.of(m.parameterTypes()) + .map(cl -> cl.getSimpleName()) + .collect(Collectors.joining(", ", "(", ")")); } private List<String> toMethodStrings(MethodDesc[] m) { @@ -142,11 +143,16 @@ @Repeatable(MethodDescs.class) public @interface MethodDesc { String name(); + Class<?> returnType() default NotSpecified.class; + Class<?>[] parameterTypes() default {}; Class<?> declaringClass(); MethodKind kind() default MethodKind.ABSTRACT; boolean isGetMethodReturn() default false; } + // special type marking a not-specified return type in @MethodDesc + interface NotSpecified {} + @Retention(RetentionPolicy.RUNTIME) public @interface MethodDescs { MethodDesc[] value(); @@ -172,22 +178,18 @@ @MethodDesc(name="nonDefault", declaringClass=Jbis.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=I.class) interface P2 extends Jbis, Jprim {} @MethodDesc(name="nonDefault", declaringClass=Jbis.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=I.class) interface P3 extends Jbis, Jprim, I {} - @MethodDesc(name="nonDefault", declaringClass=I.class, + @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) interface P4 extends I, J {} @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=I.class) interface P5 extends J, I {} @MethodDesc(name="nonDefault", declaringClass=J.class, @@ -198,14 +200,12 @@ isGetMethodReturn=true) interface K1M extends J { void nonDefault(); } - @MethodDesc(name="nonDefault", declaringClass=I.class, - isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) - interface K2 extends I, J {} + @MethodDesc(name="nonDefault", declaringClass=J.class, + isGetMethodReturn=true) + interface K2 extends I, J {} @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=I.class) interface K2O extends J, I {} @MethodDesc(name="nonDefault", declaringClass=K2M.class, @@ -244,21 +244,18 @@ @MethodDesc(name="isDefault", declaringClass=M.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) interface N2 extends M, L {} @MethodDesc(name="isDefault", declaringClass=M.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class, + @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) interface N22 extends L, M {} @MethodDesc(name="isDefault", declaringClass=N2D.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) interface N2D extends M, L { default void isDefault() {}} @@ -277,48 +274,36 @@ @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface O1 extends L, M, N2DN {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface O2 extends M, N2DN, L {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface O3 extends N2DN, L, M {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) abstract class C1 implements L, M, N2DN {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) abstract class C2 implements M, N2DN, L {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) abstract class C3 implements N2DN, L, M {} @@ -345,88 +330,54 @@ @MethodDesc(name="isDefault", declaringClass=R1.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R1 extends L, M, N2DN { void isDefault(); } @MethodDesc(name="isDefault", declaringClass=R2.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R2 extends M, N2DN, L { void isDefault(); } @MethodDesc(name="isDefault", declaringClass=R3.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R3 extends N2DN, L, M { void isDefault(); } - // this one is strange but logical, getMethod finds N2DN first, which is - // default but not the most specific - @MethodDesc(name="isDefault", declaringClass=N2DN.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="isDefault", declaringClass=R1.class) - @MethodDesc(name="nonDefault", declaringClass=L.class, + @MethodDesc(name="isDefault", declaringClass=R1.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, + isGetMethodReturn=true) interface R4 extends L, M, N2DN, R1 {} - // this one is strange but logical, getMethod finds N2DN first, which is - // default but not the most specific - @MethodDesc(name="isDefault", declaringClass=N2DN.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="isDefault", declaringClass=R2.class) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class, + @MethodDesc(name="isDefault", declaringClass=R2.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, + isGetMethodReturn=true) interface R5 extends M, N2DN, R2, L {} - // this one is strange but logical, getMethod finds N2DN first, which is - // default but not the most specific - @MethodDesc(name="isDefault", declaringClass=N2DN.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="isDefault", declaringClass=R3.class) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) + @MethodDesc(name="isDefault", declaringClass=R3.class, + isGetMethodReturn=true) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R6 extends N2DN, R3, L, M {} - // the following three finds the "right" one @MethodDesc(name="isDefault", declaringClass=R1.class, isGetMethodReturn=true) - @MethodDesc(name="isDefault", declaringClass=N2DN.class, - kind=MethodKind.DEFAULT) - @MethodDesc(name="nonDefault", declaringClass=L.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R7 extends L, M, R1, N2DN {} @MethodDesc(name="isDefault", declaringClass=R2.class, isGetMethodReturn=true) - @MethodDesc(name="isDefault", declaringClass=N2DN.class, - kind=MethodKind.DEFAULT) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R8 extends M, R2, N2DN, L {} @MethodDesc(name="isDefault", declaringClass=R3.class, isGetMethodReturn=true) - @MethodDesc(name="isDefault", declaringClass=N2DN.class, - kind=MethodKind.DEFAULT) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R9 extends R3, N2DN, L, M {} @@ -445,51 +396,40 @@ interface Z3 extends Z2, Z1 { void z(); } - @MethodDesc(name="z", declaringClass=Z2.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="z", declaringClass=Z3.class) + @MethodDesc(name="z", declaringClass=Z3.class, + isGetMethodReturn = true) interface Z41 extends Z1, Z2, Z3 { } - @MethodDesc(name="z", declaringClass=Z2.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="z", declaringClass=Z3.class) + @MethodDesc(name="z", declaringClass=Z3.class, + isGetMethodReturn = true) interface Z42 extends Z2, Z3, Z1 { } @MethodDesc(name="z", declaringClass=Z3.class, - isGetMethodReturn=true) - @MethodDesc(name="z", declaringClass=Z2.class, - kind=MethodKind.DEFAULT) + isGetMethodReturn = true) interface Z43 extends Z3, Z1, Z2 { } - @MethodDesc(name="z", declaringClass=Z2.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="z", declaringClass=Z3.class) + @MethodDesc(name="z", declaringClass=Z3.class, + isGetMethodReturn = true) abstract class ZC41 implements Z1, Z2, Z3 { } - @MethodDesc(name="z", declaringClass=Z2.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="z", declaringClass=Z3.class) + @MethodDesc(name="z", declaringClass=Z3.class, + isGetMethodReturn = true) abstract class ZC42 implements Z2, Z3, Z1 { } @MethodDesc(name="z", declaringClass=Z3.class, - isGetMethodReturn=true) - @MethodDesc(name="z", declaringClass=Z2.class, - kind=MethodKind.DEFAULT) + isGetMethodReturn = true) abstract class ZC43 implements Z3, Z1, Z2 { } // More reabstraction + concretization interface X1 { default void x() {} } interface X2 extends X1 { void x(); } - @MethodDesc(name="x", declaringClass=X1.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="x", declaringClass=X2.class) + @MethodDesc(name="x", declaringClass=X2.class, + isGetMethodReturn=true) interface X31 extends X1, X2 {} @MethodDesc(name="x", declaringClass=X2.class, isGetMethodReturn=true) - @MethodDesc(name="x", declaringClass=X1.class, - kind=MethodKind.DEFAULT) interface X32 extends X2, X1 {} @MethodDesc(name="x", declaringClass=X3.class, @@ -524,85 +464,107 @@ interface K extends I, J { void nonDefault(); } - @MethodDesc(name="nonDefault", declaringClass=I.class, + @MethodDesc(name="nonDefault", declaringClass=K.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) - @MethodDesc(name="nonDefault", declaringClass=K.class) abstract class ZZ1 implements I, J, K {} - @MethodDesc(name="nonDefault", declaringClass=I.class, + @MethodDesc(name="nonDefault", declaringClass=K.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) - @MethodDesc(name="nonDefault", declaringClass=K.class) abstract class ZZ2 extends ZZ1 implements K, I, J {} - @MethodDesc(name="nonDefault", declaringClass=I.class, + @MethodDesc(name="nonDefault", declaringClass=K.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) - @MethodDesc(name="nonDefault", declaringClass=K.class) abstract class ZZ3 extends ZZ2 implements J, K, I {} - // bridges - interface B1A { Object m(); } - interface B1B extends B1A { Map m(); } + // bridges... + + interface B1 { Object m(); } + interface B2A extends B1 { Map m(); } + interface B2B extends B1 { HashMap m(); } - @MethodDesc(name="m", declaringClass=B1C.class, + @MethodDesc(name="m", returnType=Object.class, declaringClass=B3A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Map.class, declaringClass=B3A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=HashMap.class, declaringClass=B3A.class, isGetMethodReturn=true) - @MethodDesc(name="m", declaringClass=B1C.class, - kind=MethodKind.DEFAULT) - @MethodDesc(name="m", declaringClass=B1C.class, - kind=MethodKind.DEFAULT) - interface B1C extends B1B { HashMap m(); } + interface B3A extends B2A { HashMap m(); } - @MethodDesc(name="m", declaringClass=B2.class, + @MethodDesc(name="m", returnType=Object.class, declaringClass=B4A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Map.class, declaringClass=B4A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=HashMap.class, declaringClass= B4A.class, + isGetMethodReturn=true) + interface B4A extends B3A { HashMap m(); } + + @MethodDesc(name="m", returnType=Object.class, declaringClass=B4A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Map.class, declaringClass=B4A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=HashMap.class, declaringClass= B4A.class, isGetMethodReturn=true) - @MethodDesc(name="m", declaringClass=B2.class, - kind=MethodKind.DEFAULT) - @MethodDesc(name="m", declaringClass=B2.class, - kind=MethodKind.DEFAULT) - interface B2 extends B1C { HashMap m(); } + interface B5A2 extends B4A, B1 {} - @MethodDesc(name="m", declaringClass=B2.class, //HahsMap + @MethodDesc(name="m", returnType=Object.class, declaringClass=B4A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Map.class, declaringClass=B4A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=HashMap.class, declaringClass= B4A.class, isGetMethodReturn=true) - @MethodDesc(name="m", declaringClass=B2.class, //Map - kind=MethodKind.DEFAULT) - @MethodDesc(name="m", declaringClass=B2.class, //Object - kind=MethodKind.DEFAULT) - interface B3A extends B2, B1A {} + interface B5A4A extends B4A, B3A {} + + // ... + most specific return type for getMethod from two unrelated interfaces - // this one is funny since HashMap isn't a bridge thus not a default - @MethodDesc(name="m", declaringClass=B2.class, //HashMap + @MethodDesc(name="m", returnType=Object.class, declaringClass=B2A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Object.class, declaringClass=B2B.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Map.class, declaringClass=B2A.class) + @MethodDesc(name="m", returnType=HashMap.class, declaringClass=B2B.class, isGetMethodReturn=true) - @MethodDesc(name="m", declaringClass=B2.class, //Map - kind=MethodKind.DEFAULT) - @MethodDesc(name="m", declaringClass=B2.class, //Object - kind=MethodKind.DEFAULT) - @MethodDesc(name="m", declaringClass=B1C.class) //HashMap - interface B3B extends B2, B1C {} + interface B3AB extends B2A, B2B {} + + @MethodDesc(name="m", returnType=Object.class, declaringClass=B2A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Object.class, declaringClass=B2B.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Map.class, declaringClass=B2A.class) + @MethodDesc(name="m", returnType=HashMap.class, declaringClass=B2B.class, + isGetMethodReturn=true) + interface B3BA extends B2B, B2A {} // same name different params type interface A1 { void m(); void m(int i); void m(int i, int j); } interface A2A extends A1 { void m(); void m(int i); void m(int i, int j); } interface A2B extends A1 { void m(); void m(int i); default void m(int i, int j) {} } - @MethodDesc(name="m", declaringClass=A1.class, + @MethodDesc(name="m", parameterTypes = {}, declaringClass=A2A.class, isGetMethodReturn=true) - @MethodDesc(name="m", declaringClass=A1.class) - @MethodDesc(name="m", declaringClass=A1.class) - @MethodDesc(name="m", declaringClass=A2A.class) - @MethodDesc(name="m", declaringClass=A2A.class) - @MethodDesc(name="m", declaringClass=A2A.class) + @MethodDesc(name="m", parameterTypes = {int.class}, declaringClass=A2A.class, + isGetMethodReturn=true) + @MethodDesc(name="m", parameterTypes = {int.class, int.class}, declaringClass=A2A.class, + isGetMethodReturn=true) interface A3A extends A1, A2A {} - @MethodDesc(name="m", declaringClass=A1.class, + @MethodDesc(name="m", parameterTypes = {}, declaringClass=A2B.class, + isGetMethodReturn=true) + @MethodDesc(name="m", parameterTypes = {int.class}, declaringClass=A2B.class, isGetMethodReturn=true) - @MethodDesc(name="m", declaringClass=A1.class) - @MethodDesc(name="m", declaringClass=A2B.class) - @MethodDesc(name="m", declaringClass=A2B.class) - @MethodDesc(name="m", declaringClass=A2B.class, - kind=MethodKind.DEFAULT) + @MethodDesc(name="m", parameterTypes = {int.class, int.class}, declaringClass=A2B.class, + kind = MethodKind.DEFAULT, isGetMethodReturn=true) interface A3B extends A1, A2B {} + // method in directly implemented interface overrides interface method + // inherited by superclass + + interface E { void m(); } + interface F extends E { void m(); } + abstract class G implements E {} + + @MethodDesc(name="m", declaringClass=F.class, isGetMethodReturn=true) + abstract class H extends G implements F {} + @DataProvider public Object[][] getCases() { return CASES; } public static final Class<?>[][] CASES = { @@ -680,12 +642,16 @@ { XC42.class }, { XC43.class }, - { B1C.class }, - { B2.class }, { B3A.class }, - { B3B.class }, + { B4A.class }, + { B5A2.class }, + { B5A4A.class }, + { B3AB.class }, + { B3BA.class }, { A3A.class }, { A3B.class }, + + { H.class }, }; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/reflect/PublicMethods/Case1.results Tue Jan 17 15:27:22 2017 +0100 @@ -0,0 +1,1379 @@ +0,0,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=- +1,0,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[I.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=I.m +1,0,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[I.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=I.m +1,0,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=- +1,0,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[J.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=J.m +1,0,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[I.m, J.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=I.m|E.gM=I.m +1,0,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[J.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=J.m +1,0,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[J.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=J.m +1,0,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[J.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=J.m +1,0,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=- +1,0,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[I.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=I.m +1,0,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[I.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=I.m +1,0,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=- +1,0,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=- +1,0,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=- +1,0,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=- +1,0,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=- +1,0,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java Tue Jan 17 15:27:22 2017 +0100 @@ -0,0 +1,529 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import javax.tools.Diagnostic; +import javax.tools.DiagnosticListener; +import javax.tools.FileObject; +import javax.tools.ForwardingJavaFileManager; +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.SimpleJavaFileObject; +import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; +import javax.tools.ToolProvider; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.UncheckedIOException; +import java.lang.reflect.Method; +import java.net.URI; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static java.util.stream.Collectors.joining; +import static java.util.stream.Collectors.toMap; + +/* + * @test + * @bug 8062389 + * @summary Nearly exhaustive test of Class.getMethod() and Class.getMethods() + * @run main PublicMethodsTest + */ +public class PublicMethodsTest { + + public static void main(String[] args) { + Case c = new Case1(); + + int[] diffs = new int[1]; + try (Stream<Map.Entry<int[], Map<String, String>>> + expected = expectedResults(c)) { + diffResults(c, expected) + .forEach(diff -> { + System.out.println(diff); + diffs[0]++; + }); + } + + if (diffs[0] > 0) { + throw new RuntimeException( + "There were " + diffs[0] + " differences."); + } + } + + // use this to generate .results file for particular case + public static class Generate { + public static void main(String[] args) { + Case c = new Case1(); + dumpResults(generateResults(c)) + .forEach(System.out::println); + } + } + + interface Case { + Pattern PLACEHOLDER_PATTERN = Pattern.compile("\\$\\{(.+?)}"); + + // possible variants of interface method + List<String> INTERFACE_METHODS = List.of( + "", "void m();", "default void m() {}", "static void m() {}" + ); + + // possible variants of class method + List<String> CLASS_METHODS = List.of( + "", "public abstract void m();", + "public void m() {}", "public static void m() {}" + ); + + // template with placeholders parsed with PLACEHOLDER_PATTERN + String template(); + + // map of replacementKey (== PLACEHOLDER_PATTERN captured group #1) -> + // list of possible replacements + Map<String, List<String>> replacements(); + + // ordered list of replacement keys + List<String> replacementKeys(); + + // names of types occurring in the template + List<String> classNames(); + } + + static class Case1 implements Case { + + private static final String TEMPLATE = Stream.of( + "interface I { ${I} }", + "interface J { ${J} }", + "interface K extends I, J { ${K} }", + "abstract class C { ${C} }", + "abstract class D extends C implements I { ${D} }", + "abstract class E extends D implements J, K { ${E} }" + ).collect(joining("\n")); + + private static final Map<String, List<String>> REPLACEMENTS = Map.of( + "I", INTERFACE_METHODS, + "J", INTERFACE_METHODS, + "K", INTERFACE_METHODS, + "C", CLASS_METHODS, + "D", CLASS_METHODS, + "E", CLASS_METHODS + ); + + private static final List<String> REPLACEMENT_KEYS = REPLACEMENTS + .keySet().stream().sorted().collect(Collectors.toList()); + + @Override + public String template() { + return TEMPLATE; + } + + @Override + public Map<String, List<String>> replacements() { + return REPLACEMENTS; + } + + @Override + public List<String> replacementKeys() { + return REPLACEMENT_KEYS; + } + + @Override + public List<String> classNames() { + // just by accident, names of classes are equal to replacement keys + // (this need not be the case in general) + return REPLACEMENT_KEYS; + } + } + + // generate all combinations as a tuple of indexes into lists of + // replacements. The index of the element in int[] tuple represents the index + // of the key in replacementKeys() list. The value of the element in int[] tuple + // represents the index of the replacement string in list of strings in the + // value of the entry of replacements() map with the corresponding key. + static Stream<int[]> combinations(Case c) { + int[] sizes = c.replacementKeys().stream() + .mapToInt(key -> c.replacements().get(key).size()) + .toArray(); + + return Stream.iterate( + new int[sizes.length], + state -> state != null, + state -> { + int[] newState = state.clone(); + for (int i = 0; i < state.length; i++) { + if (++newState[i] < sizes[i]) { + return newState; + } + newState[i] = 0; + } + // wrapped-around + return null; + } + ); + } + + // given the combination of indexes, return the expanded template + static String expandTemplate(Case c, int[] combination) { + + // 1st create a map: key -> replacement string + Map<String, String> map = new HashMap<>(combination.length * 4 / 3 + 1); + for (int i = 0; i < combination.length; i++) { + String key = c.replacementKeys().get(i); + String repl = c.replacements().get(key).get(combination[i]); + map.put(key, repl); + } + + return Case.PLACEHOLDER_PATTERN + .matcher(c.template()) + .replaceAll(match -> map.get(match.group(1))); + } + + /** + * compile expanded template into a ClassLoader that sees compiled classes + */ + static ClassLoader compile(String source) throws CompileException { + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + if (javac == null) { + throw new AssertionError("No Java compiler tool found."); + } + + ErrorsCollector errorsCollector = new ErrorsCollector(); + StandardJavaFileManager standardJavaFileManager = + javac.getStandardFileManager(errorsCollector, Locale.ROOT, + Charset.forName("UTF-8")); + TestFileManager testFileManager = new TestFileManager( + standardJavaFileManager, source); + + JavaCompiler.CompilationTask javacTask; + try { + javacTask = javac.getTask( + null, // use System.err + testFileManager, + errorsCollector, + null, + null, + List.of(testFileManager.getJavaFileForInput( + StandardLocation.SOURCE_PATH, + TestFileManager.TEST_CLASS_NAME, + JavaFileObject.Kind.SOURCE)) + ); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + + javacTask.call(); + + if (errorsCollector.hasError()) { + throw new CompileException(errorsCollector.getErrors()); + } + + return new TestClassLoader(ClassLoader.getSystemClassLoader(), + testFileManager); + } + + static class CompileException extends Exception { + CompileException(List<Diagnostic<?>> diagnostics) { + super(diagnostics.stream() + .map(diag -> diag.toString()) + .collect(Collectors.joining("\n"))); + } + } + + static class TestFileManager + extends ForwardingJavaFileManager<StandardJavaFileManager> { + static final String TEST_CLASS_NAME = "Test"; + + private final String testSource; + private final Map<String, ClassFileObject> classes = new HashMap<>(); + + TestFileManager(StandardJavaFileManager fileManager, String source) { + super(fileManager); + testSource = "public class " + TEST_CLASS_NAME + " {}\n" + + source; // the rest of classes are package-private + } + + @Override + public JavaFileObject getJavaFileForInput(Location location, + String className, + JavaFileObject.Kind kind) + throws IOException { + if (location == StandardLocation.SOURCE_PATH && + kind == JavaFileObject.Kind.SOURCE && + TEST_CLASS_NAME.equals(className)) { + return new SourceFileObject(className, testSource); + } + return super.getJavaFileForInput(location, className, kind); + } + + private static class SourceFileObject extends SimpleJavaFileObject { + private final String source; + + SourceFileObject(String className, String source) { + super( + URI.create("memory:/src/" + + className.replace('.', '/') + ".java"), + Kind.SOURCE + ); + this.source = source; + } + + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return source; + } + } + + @Override + public JavaFileObject getJavaFileForOutput(Location location, + String className, + JavaFileObject.Kind kind, + FileObject sibling) + throws IOException { + if (kind == JavaFileObject.Kind.CLASS) { + ClassFileObject cfo = new ClassFileObject(className); + classes.put(className, cfo); + return cfo; + } + return super.getJavaFileForOutput(location, className, kind, sibling); + } + + private static class ClassFileObject extends SimpleJavaFileObject { + final String className; + ByteArrayOutputStream byteArrayOutputStream; + + ClassFileObject(String className) { + super( + URI.create("memory:/out/" + + className.replace('.', '/') + ".class"), + Kind.CLASS + ); + this.className = className; + } + + @Override + public OutputStream openOutputStream() throws IOException { + return byteArrayOutputStream = new ByteArrayOutputStream(); + } + + byte[] getBytes() { + if (byteArrayOutputStream == null) { + throw new IllegalStateException( + "No class file written for class: " + className); + } + return byteArrayOutputStream.toByteArray(); + } + } + + byte[] getClassBytes(String className) { + ClassFileObject cfo = classes.get(className); + return (cfo == null) ? null : cfo.getBytes(); + } + } + + static class ErrorsCollector implements DiagnosticListener<JavaFileObject> { + private final List<Diagnostic<?>> errors = new ArrayList<>(); + + @Override + public void report(Diagnostic<? extends JavaFileObject> diagnostic) { + if (diagnostic.getKind() == Diagnostic.Kind.ERROR) { + errors.add(diagnostic); + } + } + + boolean hasError() { + return !errors.isEmpty(); + } + + List<Diagnostic<?>> getErrors() { + return errors; + } + } + + static class TestClassLoader extends ClassLoader { + private final TestFileManager fileManager; + + public TestClassLoader(ClassLoader parent, TestFileManager fileManager) { + super(parent); + this.fileManager = fileManager; + } + + @Override + protected Class<?> findClass(String name) throws ClassNotFoundException { + byte[] classBytes = fileManager.getClassBytes(name); + if (classBytes == null) { + throw new ClassNotFoundException(name); + } + return defineClass(name, classBytes, 0, classBytes.length); + } + } + + static Map<String, String> generateResult(Case c, ClassLoader cl) { + return + c.classNames() + .stream() + .map(cn -> { + try { + return Class.forName(cn, false, cl); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Class not found: " + cn, e); + } + }) + .flatMap(clazz -> Stream.of( + Map.entry(clazz.getName() + ".gM", generateGetMethodResult(clazz)), + Map.entry(clazz.getName() + ".gMs", generateGetMethodsResult(clazz)) + )) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + + static String generateGetMethodResult(Class<?> clazz) { + try { + Method m = clazz.getMethod("m"); + return m.getDeclaringClass().getName() + "." + m.getName(); + } catch (NoSuchMethodException e) { + return "-"; + } + } + + static String generateGetMethodsResult(Class<?> clazz) { + return Stream.of(clazz.getMethods()) + .filter(m -> m.getDeclaringClass() != Object.class) + .map(m -> m.getDeclaringClass().getName() + + "." + m.getName()) + .collect(Collectors.joining(", ", "[", "]")); + } + + static Stream<Map.Entry<int[], Map<String, String>>> generateResults(Case c) { + return combinations(c) + .flatMap(comb -> { + String src = expandTemplate(c, comb); + ClassLoader cl; + try { + cl = compile(src); + } catch (CompileException e) { + // ignore uncompilable combinations + return Stream.empty(); + } + // compilation was successful -> generate result + return Stream.of(Map.entry( + comb, + generateResult(c, cl) + )); + }); + } + + static Stream<Map.Entry<int[], Map<String, String>>> expectedResults(Case c) { + try { + BufferedReader r = new BufferedReader(new InputStreamReader( + c.getClass().getResourceAsStream( + c.getClass().getSimpleName() + ".results"), + "UTF-8" + )); + + return parseResults(r.lines()) + .onClose(() -> { + try { + r.close(); + } catch (IOException ioe) { + throw new UncheckedIOException(ioe); + } + }); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + static Stream<Map.Entry<int[], Map<String, String>>> parseResults( + Stream<String> lines + ) { + return lines + .map(l -> l.split(Pattern.quote("#"))) + .map(lkv -> Map.entry( + Stream.of(lkv[0].split(Pattern.quote(","))) + .mapToInt(Integer::parseInt) + .toArray(), + Stream.of(lkv[1].split(Pattern.quote("|"))) + .map(e -> e.split(Pattern.quote("="))) + .collect(toMap(ekv -> ekv[0], ekv -> ekv[1])) + )); + } + + static Stream<String> dumpResults( + Stream<Map.Entry<int[], Map<String, String>>> results + ) { + return results + .map(le -> + IntStream.of(le.getKey()) + .mapToObj(String::valueOf) + .collect(joining(",")) + + "#" + + le.getValue().entrySet().stream() + .map(e -> e.getKey() + "=" + e.getValue()) + .collect(joining("|")) + ); + } + + static Stream<String> diffResults( + Case c, + Stream<Map.Entry<int[], Map<String, String>>> expectedResults + ) { + return expectedResults + .flatMap(exp -> { + int[] comb = exp.getKey(); + Map<String, String> expected = exp.getValue(); + + String src = expandTemplate(c, comb); + ClassLoader cl; + try { + cl = compile(src); + } catch (CompileException ce) { + return Stream.of(src + "\n" + + "got compilation error: " + ce); + } + + Map<String, String> actual = generateResult(c, cl); + if (actual.equals(expected)) { + return Stream.empty(); + } else { + Map<String, String> diff = new HashMap<>(expected); + diff.entrySet().removeAll(actual.entrySet()); + return Stream.of( + diff.entrySet() + .stream() + .map(e -> "expected: " + e.getKey() + ": " + + e.getValue() + "\n" + + " actual: " + e.getKey() + ": " + + actual.get(e.getKey()) + "\n") + .collect(joining("\n", src + "\n\n", "\n")) + ); + } + }); + } +}
--- a/jdk/test/java/nio/channels/AsynchronousSocketChannel/StressLoopback.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/java/nio/channels/AsynchronousSocketChannel/StressLoopback.java Tue Jan 17 15:27:22 2017 +0100 @@ -26,7 +26,7 @@ * @summary Stress test connections through the loopback interface * @run main StressLoopback * @run main/othervm -Djdk.net.useFastTcpLoopback StressLoopback - * @key randomness + * @key randomness intermittent */ import java.nio.ByteBuffer;
--- a/jdk/test/java/rmi/registry/altSecurityManager/AltSecurityManager.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/java/rmi/registry/altSecurityManager/AltSecurityManager.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,8 @@ static final String ACTIVATION = "sun.rmi.server.Activation"; // children should exit in at least this time. - static long TIME_OUT = 15000; + private static final long TIME_OUT = + (long)(15000 * TestLibrary.getTimeoutFactor()); public AltSecurityManager(int port) { if (port <= 0) {
--- a/jdk/test/javax/net/ssl/TLS/TestJSSEClientProtocol.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/javax/net/ssl/TLS/TestJSSEClientProtocol.java Tue Jan 17 15:27:22 2017 +0100 @@ -22,7 +22,7 @@ /* * @test - * @bug 8049429 + * @bug 8049429 8172273 * @modules java.management * jdk.crypto.ec/sun.security.ec * @summary Test that all cipher suites work in all versions and all client @@ -30,6 +30,21 @@ * and all checking is done on the client side. * @compile CipherTestUtils.java JSSEClient.java JSSEServer.java * @run main/othervm + * -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2 + * -DCLIENT_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2 + * -DCIPHER=SSL_RSA_WITH_RC4_128_MD5 + * TestJSSE + * @run main/othervm + * -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2 + * -DCLIENT_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2 + * -DCIPHER=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 + * TestJSSE + * @run main/othervm + * -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2 + * -DCLIENT_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2 + * -DCIPHER=TLS_DHE_RSA_WITH_AES_128_CBC_SHA + * TestJSSE + * @run main/othervm * -DSERVER_PROTOCOL=SSLv3 * -DCLIENT_PROTOCOL=SSLv3 * -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
--- a/jdk/test/javax/net/ssl/TLSv12/DisabledShortRSAKeys.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/javax/net/ssl/TLSv12/DisabledShortRSAKeys.java Tue Jan 17 15:27:22 2017 +0100 @@ -31,7 +31,7 @@ * @bug 7109274 * @summary Consider disabling support for X.509 certificates with RSA keys * less than 1024 bits - * + * @library /javax/net/ssl/templates * @run main/othervm DisabledShortRSAKeys PKIX TLSv1.2 * @run main/othervm DisabledShortRSAKeys SunX509 TLSv1.2 * @run main/othervm DisabledShortRSAKeys PKIX TLSv1.1 @@ -56,20 +56,7 @@ import java.util.Base64; -public class DisabledShortRSAKeys { - - /* - * ============================================================= - * Set the various variables needed for the tests, then - * specify what tests to run on each side. - */ - - /* - * Should we run the client or server in a separate thread? - * Both sides can throw exceptions, but do you have a preference - * as to which side should be the main thread. - */ - static boolean separateServerThread = true; +public class DisabledShortRSAKeys extends SSLSocketTemplate { /* * Where do we find the keystores? @@ -123,81 +110,50 @@ static char passphrase[] = "passphrase".toCharArray(); /* - * Is the server ready to serve? - */ - volatile static boolean serverReady = false; - - /* * Turn on SSL debugging? */ static boolean debug = false; - /* - * Define the server side of the test. - * - * If the server prematurely exits, serverReady will be set to true - * to avoid infinite hangs. - */ - void doServerSide() throws Exception { - SSLContext context = generateSSLContext(null, targetCertStr, - targetPrivateKey); - SSLServerSocketFactory sslssf = context.getServerSocketFactory(); - SSLServerSocket sslServerSocket = - (SSLServerSocket)sslssf.createServerSocket(serverPort); - serverPort = sslServerSocket.getLocalPort(); + @Override + protected SSLContext createClientSSLContext() throws Exception { + return generateSSLContext(trustedCertStr, null, null); + } - /* - * Signal Client, we're ready for his connect. - */ - serverReady = true; + @Override + protected SSLContext createServerSSLContext() throws Exception { + return generateSSLContext(null, targetCertStr, targetPrivateKey); + } - try (SSLSocket sslSocket = (SSLSocket)sslServerSocket.accept()) { - try (InputStream sslIS = sslSocket.getInputStream()) { + @Override + protected void runServerApplication(SSLSocket socket) throws Exception { + try { + try (InputStream sslIS = socket.getInputStream()) { sslIS.read(); } - - throw new Exception( - "RSA keys shorter than 1024 bits should be disabled"); + throw new Exception("RSA keys shorter than 1024 bits should be disabled"); } catch (SSLHandshakeException sslhe) { // the expected exception, ignore } + } - /* - * Define the client side of the test. - * - * If the server prematurely exits, serverReady will be set to true - * to avoid infinite hangs. - */ - void doClientSide() throws Exception { + @Override + protected void runClientApplication(SSLSocket socket) throws Exception { - /* - * Wait for server to get started. - */ - while (!serverReady) { - Thread.sleep(50); - } - - SSLContext context = generateSSLContext(trustedCertStr, null, null); - SSLSocketFactory sslsf = context.getSocketFactory(); - - try (SSLSocket sslSocket = - (SSLSocket)sslsf.createSocket("localhost", serverPort)) { + try { // only enable the target protocol - sslSocket.setEnabledProtocols(new String[] {enabledProtocol}); - + socket.setEnabledProtocols(new String[] { enabledProtocol }); // enable a block cipher - sslSocket.setEnabledCipherSuites( - new String[] {"TLS_DHE_RSA_WITH_AES_128_CBC_SHA"}); + socket.setEnabledCipherSuites( + new String[] { "TLS_DHE_RSA_WITH_AES_128_CBC_SHA" }); - try (OutputStream sslOS = sslSocket.getOutputStream()) { + try (OutputStream sslOS = socket.getOutputStream()) { sslOS.write('B'); sslOS.flush(); } - throw new Exception( - "RSA keys shorter than 1024 bits should be disabled"); + "RSA keys shorter than 1024 bits should be disabled"); } catch (SSLHandshakeException sslhe) { // the expected exception, ignore } @@ -207,16 +163,16 @@ * ============================================================= * The remainder is just support stuff */ - private static String tmAlgorithm; // trust manager - private static String enabledProtocol; // the target protocol + private static String tmAlgorithm; // trust manager + private static String enabledProtocol; // the target protocol private static void parseArguments(String[] args) { - tmAlgorithm = args[0]; - enabledProtocol = args[1]; + tmAlgorithm = args[0]; + enabledProtocol = args[1]; } private static SSLContext generateSSLContext(String trustedCertStr, - String keyCertStr, String keySpecStr) throws Exception { + String keyCertStr, String keySpecStr) throws Exception { // generate certificate from cert string CertificateFactory cf = CertificateFactory.getInstance("X.509"); @@ -239,10 +195,10 @@ if (keyCertStr != null) { // generate the private key. PKCS8EncodedKeySpec priKeySpec = new PKCS8EncodedKeySpec( - Base64.getMimeDecoder().decode(keySpecStr)); + Base64.getMimeDecoder().decode(keySpecStr)); KeyFactory kf = KeyFactory.getInstance("RSA"); RSAPrivateKey priKey = - (RSAPrivateKey)kf.generatePrivate(priKeySpec); + (RSAPrivateKey)kf.generatePrivate(priKeySpec); // generate certificate chain is = new ByteArrayInputStream(keyCertStr.getBytes()); @@ -281,13 +237,6 @@ return ctx; } - - // use any free port by default - volatile int serverPort = 0; - - volatile Exception serverException = null; - volatile Exception clientException = null; - public static void main(String[] args) throws Exception { if (debug) System.setProperty("javax.net.debug", "all"); @@ -300,142 +249,7 @@ /* * Start the tests. */ - new DisabledShortRSAKeys(); + new DisabledShortRSAKeys().run(); } - Thread clientThread = null; - Thread serverThread = null; - - /* - * Primary constructor, used to drive remainder of the test. - * - * Fork off the other side, then do your work. - */ - DisabledShortRSAKeys() throws Exception { - Exception startException = null; - try { - if (separateServerThread) { - startServer(true); - startClient(false); - } else { - startClient(true); - startServer(false); - } - } catch (Exception e) { - startException = e; - } - - /* - * Wait for other side to close down. - */ - if (separateServerThread) { - if (serverThread != null) { - serverThread.join(); - } - } else { - if (clientThread != null) { - clientThread.join(); - } - } - - /* - * When we get here, the test is pretty much over. - * Which side threw the error? - */ - Exception local; - Exception remote; - - if (separateServerThread) { - remote = serverException; - local = clientException; - } else { - remote = clientException; - local = serverException; - } - - Exception exception = null; - - /* - * Check various exception conditions. - */ - if ((local != null) && (remote != null)) { - // If both failed, return the curthread's exception. - local.initCause(remote); - exception = local; - } else if (local != null) { - exception = local; - } else if (remote != null) { - exception = remote; - } else if (startException != null) { - exception = startException; - } - - /* - * If there was an exception *AND* a startException, - * output it. - */ - if (exception != null) { - if (exception != startException && startException != null) { - exception.addSuppressed(startException); - } - throw exception; - } - - // Fall-through: no exception to throw! - } - - void startServer(boolean newThread) throws Exception { - if (newThread) { - serverThread = new Thread() { - public void run() { - try { - doServerSide(); - } catch (Exception e) { - /* - * Our server thread just died. - * - * Release the client, if not active already... - */ - System.err.println("Server died..."); - serverReady = true; - serverException = e; - } - } - }; - serverThread.start(); - } else { - try { - doServerSide(); - } catch (Exception e) { - serverException = e; - } finally { - serverReady = true; - } - } - } - - void startClient(boolean newThread) throws Exception { - if (newThread) { - clientThread = new Thread() { - public void run() { - try { - doClientSide(); - } catch (Exception e) { - /* - * Our client thread just died. - */ - System.err.println("Client died..."); - clientException = e; - } - } - }; - clientThread.start(); - } else { - try { - doClientSide(); - } catch (Exception e) { - clientException = e; - } - } - } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/xml/crypto/dsig/TransformService/UnknownProvider.java Tue Jan 17 15:27:22 2017 +0100 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8172003 + * @summary Test that TransformService.getInstance() throws a + * NoSuchProviderException when provider is unknown + * @run main UnknownProvider + */ + +import javax.xml.crypto.dsig.TransformService; +import javax.xml.crypto.dsig.Transform; +import java.security.NoSuchProviderException; +import java.security.NoSuchAlgorithmException; + +public class UnknownProvider { + + public static void main(String[] args) throws NoSuchAlgorithmException { + try { + TransformService ts = TransformService.getInstance( + Transform.BASE64, "DOM", "SomeProviderThatDoesNotExist"); + } + catch(NoSuchProviderException e) { + // this is expected + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/xml/crypto/dsig/XMLSignatureFactory/UnknownProvider.java Tue Jan 17 15:27:22 2017 +0100 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8172003 + * @summary Test that XMLSignatureFactory.getInstance() throws a + * NoSuchProviderException when provider is unknown + * @run main UnknownProvider + */ + +import javax.xml.crypto.dsig.XMLSignatureFactory; +import java.security.NoSuchProviderException; + +public class UnknownProvider { + + public static void main(String[] args) { + try { + XMLSignatureFactory sf = XMLSignatureFactory.getInstance( + "DOM", "SomeProviderThatDoesNotExist"); + } + catch(NoSuchProviderException e) { + // this is expected + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory/UnknownProvider.java Tue Jan 17 15:27:22 2017 +0100 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8172003 + * @summary Test that KeyInfoFactory.getInstance() throws a + * NoSuchProviderException when provider is unknown + * @run main UnknownProvider + */ + +import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory; +import java.security.NoSuchProviderException; + +public class UnknownProvider { + + public static void main(String[] args) { + try { + KeyInfoFactory fac = KeyInfoFactory.getInstance( + "DOM", "SomeProviderThatDoesNotExist"); + } + catch(NoSuchProviderException e) { + // this is expected + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/lib/testlibrary/ModuleInfoMaker.java Tue Jan 17 15:27:22 2017 +0100 @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +import static org.testng.Assert.assertTrue; + +/** + * Utility class for creating test modules. + */ +public class ModuleInfoMaker { + private static String MODULE_INFO_JAVA = "module-info.java"; + private static Pattern MODULE_PATTERN = + Pattern.compile("module\\s+((?:\\w+\\.)*)"); + private static Pattern PACKAGE_PATTERN = + Pattern.compile("package\\s+(((?:\\w+\\.)*)(?:\\w+))"); + private static Pattern CLASS_PATTERN = + Pattern.compile("(?:public\\s+)?(?:class|enum|interface)\\s+(\\w+)"); + + private final Path dir; + public ModuleInfoMaker(Path dir) { + this.dir = dir; + } + + /** + * Create java source files of the given module + */ + public void writeJavaFiles(String module, String moduleInfoJava, String... contents) + throws IOException + { + Path msrc = dir.resolve(module); + new JavaSource(moduleInfoJava).write(msrc); + for (String c : contents) { + new JavaSource(c).write(msrc); + } + } + + /** + * Compile the module to the given destination. + */ + public void compile(String module, Path dest, String... options) + throws IOException + { + Path msrc = dir.resolve(module); + Stream<String> args = + Stream.concat(Arrays.stream(options), + Stream.of("--module-source-path", + dir.toString())); + assertTrue(CompilerUtils.compile(msrc, dest, args.toArray(String[]::new)), + "Fail to compile " + module); + } + + static class JavaSource { + final String source; + JavaSource(String source) { + this.source = source; + } + + /** + * Writes the source code to a file in a specified directory. + * @param dir the directory + * @throws IOException if there is a problem writing the file + */ + public void write(Path dir) throws IOException { + Path file = dir.resolve(getJavaFileNameFromSource(source)); + Files.createDirectories(file.getParent()); + try (BufferedWriter out = Files.newBufferedWriter(file)) { + out.write(source.replace("\n", System.lineSeparator())); + } + } + + /** + * Extracts the Java file name from the class declaration. + * This method is intended for simple files and uses regular expressions, + * so comments matching the pattern can make the method fail. + */ + static String getJavaFileNameFromSource(String source) { + String packageName = null; + + Matcher matcher = MODULE_PATTERN.matcher(source); + if (matcher.find()) + return MODULE_INFO_JAVA; + + matcher = PACKAGE_PATTERN.matcher(source); + if (matcher.find()) + packageName = matcher.group(1).replace(".", "/"); + + matcher = CLASS_PATTERN.matcher(source); + if (matcher.find()) { + String className = matcher.group(1) + ".java"; + return (packageName == null) ? className : packageName + "/" + className; + } else if (packageName != null) { + return packageName + "/package-info.java"; + } else { + throw new Error("Could not extract the java class " + + "name from the provided source"); + } + } + } +}
--- a/jdk/test/lib/testlibrary/ModuleSourceBuilder.java Fri Jan 13 16:49:34 2017 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -import java.io.BufferedWriter; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Stream; - -import static org.testng.Assert.assertTrue; - -/** - * Utility class for creating test modules. - */ -public class ModuleSourceBuilder { - private static String MODULE_INFO_JAVA = "module-info.java"; - private static Pattern MODULE_PATTERN = - Pattern.compile("module\\s+((?:\\w+\\.)*)"); - private static Pattern PACKAGE_PATTERN = - Pattern.compile("package\\s+(((?:\\w+\\.)*)(?:\\w+))"); - private static Pattern CLASS_PATTERN = - Pattern.compile("(?:public\\s+)?(?:class|enum|interface)\\s+(\\w+)"); - - private final Path dir; - public ModuleSourceBuilder(Path dir) { - this.dir = dir; - } - - /** - * Create java source files of the given module - */ - public void writeJavaFiles(String module, String moduleInfoJava, String... contents) - throws IOException - { - Path msrc = dir.resolve(module); - new JavaSource(moduleInfoJava).write(msrc); - for (String c : contents) { - new JavaSource(c).write(msrc); - } - } - - /** - * Compile the module to the given destination. - */ - public void compile(String module, Path dest, String... options) - throws IOException - { - Path msrc = dir.resolve(module); - Stream<String> args = - Stream.concat(Arrays.stream(options), - Stream.of("--module-source-path", - dir.toString())); - assertTrue(CompilerUtils.compile(msrc, dest, args.toArray(String[]::new)), - "Fail to compile " + module); - } - - static class JavaSource { - final String source; - JavaSource(String source) { - this.source = source; - } - - /** - * Writes the source code to a file in a specified directory. - * @param dir the directory - * @throws IOException if there is a problem writing the file - */ - public void write(Path dir) throws IOException { - Path file = dir.resolve(getJavaFileNameFromSource(source)); - Files.createDirectories(file.getParent()); - try (BufferedWriter out = Files.newBufferedWriter(file)) { - out.write(source.replace("\n", System.lineSeparator())); - } - } - - /** - * Extracts the Java file name from the class declaration. - * This method is intended for simple files and uses regular expressions, - * so comments matching the pattern can make the method fail. - */ - static String getJavaFileNameFromSource(String source) { - String packageName = null; - - Matcher matcher = MODULE_PATTERN.matcher(source); - if (matcher.find()) - return MODULE_INFO_JAVA; - - matcher = PACKAGE_PATTERN.matcher(source); - if (matcher.find()) - packageName = matcher.group(1).replace(".", "/"); - - matcher = CLASS_PATTERN.matcher(source); - if (matcher.find()) { - String className = matcher.group(1) + ".java"; - return (packageName == null) ? className : packageName + "/" + className; - } else if (packageName != null) { - return packageName + "/package-info.java"; - } else { - throw new Error("Could not extract the java class " + - "name from the provided source"); - } - } - } -}
--- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,27 +21,32 @@ * questions. */ -/* - * This test is run using PostThruProxy.sh - */ - import java.io.*; import java.net.*; import java.security.KeyStore; import javax.net.*; import javax.net.ssl.*; -import java.security.cert.*; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; /* - * This test case is written to test the https POST through a proxy. - * There is no proxy authentication done. - * - * PostThruProxy.java -- includes a simple server that serves - * http POST method requests in secure channel, and a client - * that makes https POST request through a proxy. + * @test + * @bug 4423074 + * @modules java.base/sun.net.www + * @summary This test case is written to test the https POST through a proxy. + * There is no proxy authentication done. It includes a simple server + * that serves http POST method requests in secure channel, and a client + * that makes https POST request through a proxy. + * @library /test/lib + * @compile OriginServer.java ProxyTunnelServer.java + * @run main/othervm PostThruProxy */ +public class PostThruProxy { -public class PostThruProxy { + private static final String TEST_SRC = System.getProperty("test.src", "."); + private static final int TIMEOUT = 30000; + /* * Where do we find the keystores? */ @@ -76,14 +81,10 @@ /* * Main method to create the server and client */ - public static void main(String args[]) throws Exception - { - String keyFilename = - args[1] + "/" + pathToStores + - "/" + keyStoreFile; - String trustFilename = - args[1] + "/" + pathToStores + - "/" + trustStoreFile; + public static void main(String args[]) throws Exception { + String keyFilename = TEST_SRC + "/" + pathToStores + "/" + keyStoreFile; + String trustFilename = TEST_SRC + "/" + pathToStores + "/" + + trustStoreFile; System.setProperty("javax.net.ssl.keyStore", keyFilename); System.setProperty("javax.net.ssl.keyStorePassword", passwd); @@ -95,10 +96,9 @@ * setup the server */ try { - ServerSocketFactory ssf = - PostThruProxy.getServerSocketFactory(useSSL); + ServerSocketFactory ssf = getServerSocketFactory(useSSL); ServerSocket ss = ssf.createServerSocket(serverPort); - ss.setSoTimeout(30000); // 30 seconds + ss.setSoTimeout(TIMEOUT); // 30 seconds serverPort = ss.getLocalPort(); new TestServer(ss); } catch (Exception e) { @@ -108,35 +108,29 @@ } // trigger the client try { - doClientSide(args[0]); + doClientSide(); } catch (Exception e) { System.out.println("Client side failed: " + e.getMessage()); throw e; - } + } } private static ServerSocketFactory getServerSocketFactory (boolean useSSL) throws Exception { if (useSSL) { - SSLServerSocketFactory ssf = null; // set up key manager to do server authentication - SSLContext ctx; - KeyManagerFactory kmf; - KeyStore ks; + SSLContext ctx = SSLContext.getInstance("TLS"); + KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); + KeyStore ks = KeyStore.getInstance("JKS"); char[] passphrase = passwd.toCharArray(); - ctx = SSLContext.getInstance("TLS"); - kmf = KeyManagerFactory.getInstance("SunX509"); - ks = KeyStore.getInstance("JKS"); - ks.load(new FileInputStream(System.getProperty( "javax.net.ssl.keyStore")), passphrase); kmf.init(ks, passphrase); ctx.init(kmf.getKeyManagers(), null, null); - ssf = ctx.getServerSocketFactory(); - return ssf; + return ctx.getServerSocketFactory(); } else { return ServerSocketFactory.getDefault(); } @@ -147,7 +141,7 @@ */ static String postMsg = "Testing HTTP post on a https server"; - static void doClientSide(String hostname) throws Exception { + static void doClientSide() throws Exception { HostnameVerifier reservedHV = HttpsURLConnection.getDefaultHostnameVerifier(); try { @@ -162,10 +156,12 @@ */ HttpsURLConnection.setDefaultHostnameVerifier( new NameVerifier()); - URL url = new URL("https://" + hostname+ ":" + serverPort); + URL url = new URL("https://" + getHostname() +":" + serverPort); Proxy p = new Proxy(Proxy.Type.HTTP, pAddr); HttpsURLConnection https = (HttpsURLConnection)url.openConnection(p); + https.setConnectTimeout(TIMEOUT); + https.setReadTimeout(TIMEOUT); https.setDoOutput(true); https.setRequestMethod("POST"); PrintStream ps = null; @@ -190,6 +186,9 @@ if (ps != null) ps.close(); throw e; + } catch (SocketTimeoutException e) { + System.out.println("Client can not get response in time: " + + e.getMessage()); } } finally { HttpsURLConnection.setDefaultHostnameVerifier(reservedHV); @@ -210,4 +209,13 @@ pserver.start(); return new InetSocketAddress("localhost", pserver.getPort()); } + + private static String getHostname() { + try { + OutputAnalyzer oa = ProcessTools.executeCommand("hostname"); + return oa.getOutput().trim(); + } catch (Throwable e) { + throw new RuntimeException("Get hostname failed.", e); + } + } }
--- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh Fri Jan 13 16:49:34 2017 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -#!/bin/sh - -# -# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - - -# -# @test -# @bug 4423074 -# @summary Need to rebase all the duplicated classes from Merlin -# @modules java.base/sun.net.www - -HOSTNAME=`uname -n` -OS=`uname -s` -case "$OS" in - SunOS | Linux | Darwin | AIX ) - PS=":" - FS="/" - ;; - CYGWIN* ) - PS=";" - FS="/" - ;; - Windows* ) - PS=";" - FS="\\" - ;; - * ) - echo "Unrecognized system!" - exit 1; - ;; -esac - -EXTRAOPTS="--add-exports java.base/sun.net.www=ALL-UNNAMED" - -${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} ${EXTRAOPTS} -d . \ - ${TESTSRC}${FS}OriginServer.java \ - ${TESTSRC}${FS}ProxyTunnelServer.java \ - ${TESTSRC}${FS}PostThruProxy.java -${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} ${EXTRAOPTS} \ - PostThruProxy ${HOSTNAME} ${TESTSRC} -exit
--- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,27 +21,31 @@ * questions. */ -/* - * This test is run through PostThruProxyWithAuth.sh - */ - import java.io.*; import java.net.*; import java.security.KeyStore; import javax.net.*; import javax.net.ssl.*; -import java.security.cert.*; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; /* - * This test case is written to test the https POST through a proxy - * with proxy authentication. - * - * PostThruProxyWithAuth.java -- includes a simple server that serves - * http POST method requests in secure channel, and a client - * that makes https POST request through a proxy. + * @test + * @bug 4423074 + * @modules java.base/sun.net.www + * @summary This test case is written to test the https POST through a proxy + * with proxy authentication. It includes a simple server that serves + * http POST method requests in secure channel, and a client that + * makes https POST request through a proxy. + * @library /test/lib + * @compile OriginServer.java ProxyTunnelServer.java + * @run main/othervm -Djdk.http.auth.tunneling.disabledSchemes= PostThruProxyWithAuth */ +public class PostThruProxyWithAuth { -public class PostThruProxyWithAuth { + private static final String TEST_SRC = System.getProperty("test.src", "."); + private static final int TIMEOUT = 30000; /* * Where do we find the keystores? @@ -78,14 +82,10 @@ /* * Main method to create the server and client */ - public static void main(String args[]) throws Exception - { - String keyFilename = - args[1] + "/" + pathToStores + - "/" + keyStoreFile; - String trustFilename = - args[1] + "/" + pathToStores + - "/" + trustStoreFile; + public static void main(String args[]) throws Exception { + String keyFilename = TEST_SRC + "/" + pathToStores + "/" + keyStoreFile; + String trustFilename = TEST_SRC + "/" + pathToStores + "/" + + trustStoreFile; System.setProperty("javax.net.ssl.keyStore", keyFilename); System.setProperty("javax.net.ssl.keyStorePassword", passwd); @@ -97,10 +97,9 @@ * setup the server */ try { - ServerSocketFactory ssf = - PostThruProxyWithAuth.getServerSocketFactory(useSSL); + ServerSocketFactory ssf = getServerSocketFactory(useSSL); ServerSocket ss = ssf.createServerSocket(serverPort); - ss.setSoTimeout(30000); // 30 seconds + ss.setSoTimeout(TIMEOUT); // 30 seconds serverPort = ss.getLocalPort(); new TestServer(ss); } catch (Exception e) { @@ -110,7 +109,7 @@ } // trigger the client try { - doClientSide(args[0]); + doClientSide(); } catch (Exception e) { System.out.println("Client side failed: " + e.getMessage()); @@ -121,24 +120,18 @@ private static ServerSocketFactory getServerSocketFactory (boolean useSSL) throws Exception { if (useSSL) { - SSLServerSocketFactory ssf = null; // set up key manager to do server authentication - SSLContext ctx; - KeyManagerFactory kmf; - KeyStore ks; + SSLContext ctx = SSLContext.getInstance("TLS"); + KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); + KeyStore ks = KeyStore.getInstance("JKS"); char[] passphrase = passwd.toCharArray(); - ctx = SSLContext.getInstance("TLS"); - kmf = KeyManagerFactory.getInstance("SunX509"); - ks = KeyStore.getInstance("JKS"); - ks.load(new FileInputStream(System.getProperty( "javax.net.ssl.keyStore")), passphrase); kmf.init(ks, passphrase); ctx.init(kmf.getKeyManagers(), null, null); - ssf = ctx.getServerSocketFactory(); - return ssf; + return ctx.getServerSocketFactory(); } else { return ServerSocketFactory.getDefault(); } @@ -149,7 +142,7 @@ */ static String postMsg = "Testing HTTP post on a https server"; - static void doClientSide(String hostname) throws Exception { + static void doClientSide() throws Exception { /* * setup up a proxy */ @@ -161,10 +154,12 @@ */ HttpsURLConnection.setDefaultHostnameVerifier( new NameVerifier()); - URL url = new URL("https://" + hostname + ":" + serverPort); + URL url = new URL("https://" + getHostname() + ":" + serverPort); Proxy p = new Proxy(Proxy.Type.HTTP, pAddr); HttpsURLConnection https = (HttpsURLConnection)url.openConnection(p); + https.setConnectTimeout(TIMEOUT); + https.setReadTimeout(TIMEOUT); https.setDoOutput(true); https.setRequestMethod("POST"); PrintStream ps = null; @@ -188,6 +183,9 @@ if (ps != null) ps.close(); throw e; + } catch (SocketTimeoutException e) { + System.out.println("Client can not get response in time: " + + e.getMessage()); } } @@ -221,4 +219,13 @@ "test123".toCharArray()); } } + + private static String getHostname() { + try { + OutputAnalyzer oa = ProcessTools.executeCommand("hostname"); + return oa.getOutput().trim(); + } catch (Throwable e) { + throw new RuntimeException("Get hostname failed.", e); + } + } }
--- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh Fri Jan 13 16:49:34 2017 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -#!/bin/sh - -# -# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - - -# -# @test -# @bug 4423074 -# @summary Need to rebase all the duplicated classes from Merlin -# @modules java.base/sun.net.www - -HOSTNAME=`uname -n` -OS=`uname -s` -case "$OS" in - SunOS | Linux | Darwin | AIX ) - PS=":" - FS="/" - ;; - CYGWIN* ) - PS=";" - FS="/" - ;; - Windows* ) - PS=";" - FS="\\" - ;; - * ) - echo "Unrecognized system!" - exit 1; - ;; -esac - -EXTRAOPTS="--add-exports java.base/sun.net.www=ALL-UNNAMED" -${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} ${EXTRAOPTS} \ - -d . ${TESTSRC}${FS}OriginServer.java \ - ${TESTSRC}${FS}ProxyTunnelServer.java \ - ${TESTSRC}${FS}PostThruProxyWithAuth.java -${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} ${EXTRAOPTS} \ - -Djdk.http.auth.tunneling.disabledSchemes= \ - PostThruProxyWithAuth ${HOSTNAME} ${TESTSRC} -exit
--- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/ProxyTunnelServer.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/ProxyTunnelServer.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,13 +32,14 @@ import java.io.*; import java.net.*; -import javax.net.ssl.*; import javax.net.ServerSocketFactory; import sun.net.www.*; import java.util.Base64; public class ProxyTunnelServer extends Thread { + private static final int TIMEOUT = 30000; + private static ServerSocket ss = null; /* * holds the registered user's username and password @@ -64,8 +65,9 @@ public ProxyTunnelServer() throws IOException { if (ss == null) { - ss = (ServerSocket) ServerSocketFactory.getDefault(). - createServerSocket(0); + ss = (ServerSocket) ServerSocketFactory.getDefault() + .createServerSocket(0); + ss.setSoTimeout(TIMEOUT); } } @@ -86,6 +88,9 @@ try { clientSocket = ss.accept(); processRequests(); + } catch (SocketTimeoutException e) { + System.out.println( + "Proxy can not get response in time: " + e.getMessage()); } catch (Exception e) { System.out.println("Proxy Failed: " + e); e.printStackTrace(); @@ -188,8 +193,8 @@ serverToClient.start(); System.out.println("Proxy: Started tunneling......."); - clientToServer.join(); - serverToClient.join(); + clientToServer.join(TIMEOUT); + serverToClient.join(TIMEOUT); System.out.println("Proxy: Finished tunneling........"); clientToServer.close(); @@ -219,13 +224,11 @@ int BUFFER_SIZE = 400; byte[] buf = new byte[BUFFER_SIZE]; int bytesRead = 0; - int count = 0; // keep track of the amount of data transfer try { while ((bytesRead = input.read(buf)) >= 0) { output.write(buf, 0, bytesRead); output.flush(); - count += bytesRead; } } catch (IOException e) { /* @@ -236,7 +239,7 @@ } } - public void close() { + private void close() { try { if (!sockIn.isClosed()) sockIn.close(); @@ -275,7 +278,7 @@ serverPort = Integer.parseInt(connectInfo.substring(endi+1)); } catch (Exception e) { throw new IOException("Proxy recieved a request: " - + connectStr); + + connectStr, e); } serverInetAddr = InetAddress.getByName(serverName); }
--- a/jdk/test/sun/security/krb5/auto/ReplayCacheTestProc.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/sun/security/krb5/auto/ReplayCacheTestProc.java Tue Jan 17 15:27:22 2017 +0100 @@ -23,7 +23,7 @@ /* * @test - * @bug 7152176 8168518 + * @bug 7152176 8168518 8172017 * @summary More krb5 tests * @library ../../../../java/security/testlibrary/ /test/lib * @run main/othervm/timeout=300 ReplayCacheTestProc @@ -75,19 +75,28 @@ private static String HOST = "localhost"; private static final String SERVICE; + private static long uid; + private static String cwd; static { String tmp = System.getProperty("test.service"); SERVICE = (tmp == null) ? "service" : tmp; + uid = jdk.internal.misc.VM.geteuid(); + // Where should the rcache be saved. KRB5RCACHEDIR is not + // recognized on Solaris (might be supported on Solaris 12), + // and directory name is different when launched by root. + // See manpage krb5envvar(5) on KRB5RCNAME. + if (System.getProperty("os.name").startsWith("SunOS")) { + if (uid == 0) { + cwd = "/var/krb5/rcache/root/"; + } else { + cwd = "/var/krb5/rcache/"; + } + } else { + cwd = System.getProperty("user.dir"); + } } - // Where should the rcache be saved. It seems KRB5RCACHEDIR is not - // recognized on Solaris. Maybe version too low? I see 1.6. - private static String cwd = - System.getProperty("os.name").startsWith("SunOS") ? - "/var/krb5/rcache/" : - System.getProperty("user.dir"); - private static MessageDigest md5, sha256; static { @@ -99,7 +108,6 @@ } } - private static long uid; public static void main0(String[] args) throws Exception { System.setProperty("java.security.krb5.conf", OneKDC.KRB5_CONF); @@ -114,8 +122,6 @@ Ex[] result; int numPerType = 2; // number of acceptors per type - uid = jdk.internal.misc.VM.geteuid(); - KDC kdc = KDC.create(OneKDC.REALM, HOST, 0, true); for (int i=0; i<nc; i++) { kdc.addPrincipal(client(i), OneKDC.PASS);
--- a/jdk/test/sun/security/krb5/auto/SaslBasic.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/sun/security/krb5/auto/SaslBasic.java Tue Jan 17 15:27:22 2017 +0100 @@ -23,14 +23,13 @@ /* * @test - * @bug 7110803 + * @bug 7110803 8170732 * @summary SASL service for multiple hostnames * @compile -XDignore.symbol.file SaslBasic.java - * @run main/othervm SaslBasic bound - * @run main/othervm SaslBasic unbound + * @run main/othervm SaslBasic bound auth-int + * @run main/othervm SaslBasic unbound auth-conf + * @run main/othervm SaslBasic bound auth */ -import com.sun.security.jgss.InquireType; - import java.io.IOException; import java.util.Arrays; import java.util.HashMap; @@ -51,7 +50,7 @@ System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); HashMap clntprops = new HashMap(); - clntprops.put(Sasl.QOP, "auth-conf"); + clntprops.put(Sasl.QOP, args[1]); SaslClient sc = Sasl.createSaslClient( new String[]{"GSSAPI"}, null, "server", name, clntprops, null); @@ -74,9 +73,11 @@ }); byte[] token = new byte[0]; + byte[] lastClientToken = null; while (!sc.isComplete() || !ss.isComplete()) { if (!sc.isComplete()) { token = sc.evaluateChallenge(token); + lastClientToken = token; } if (!ss.isComplete()) { token = ss.evaluateResponse(token); @@ -94,11 +95,20 @@ if (key == null) { throw new Exception("Extended negotiated property not read"); } - byte[] hello = "hello".getBytes(); - token = sc.wrap(hello, 0, hello.length); - token = ss.unwrap(token, 0, token.length); - if (!Arrays.equals(hello, token)) { - throw new Exception("Message altered"); + + if (args[1].equals("auth")) { + // 8170732. These are the maximum size bytes after jgss/krb5 wrap. + if (lastClientToken[17] != 0 || lastClientToken[18] != 0 + || lastClientToken[19] != 0) { + throw new Exception("maximum size for auth must be 0"); + } + } else { + byte[] hello = "hello".getBytes(); + token = sc.wrap(hello, 0, hello.length); + token = ss.unwrap(token, 0, token.length); + if (!Arrays.equals(hello, token)) { + throw new Exception("Message altered"); + } } } }
--- a/jdk/test/sun/security/ssl/SSLContextImpl/BadTSProvider.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/sun/security/ssl/SSLContextImpl/BadTSProvider.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,18 +21,21 @@ * questions. */ +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + /* * @test * @bug 4919147 * @summary Support for token-based KeyStores * @run main/othervm BadTSProvider - * - * SunJSSE does not support dynamic system properties, no way to re-use - * system properties in samevm/agentvm mode. */ import java.io.*; import java.net.*; +import java.security.*; import javax.net.ssl.*; public class BadTSProvider { @@ -179,13 +182,19 @@ // XXX this test must be updated if the exception message changes Throwable cause = se.getCause(); - if (cause instanceof java.security.NoSuchAlgorithmException == false) { + if (!(cause instanceof NoSuchAlgorithmException)) { se.printStackTrace(); throw new Exception("Unexpected exception" + se); } cause = cause.getCause(); - if (cause instanceof java.security.NoSuchProviderException == false) { + if (!(cause instanceof KeyStoreException)) { + se.printStackTrace(); + throw new Exception("Unexpected exception" + se); + } + + cause = cause.getCause(); + if (!(cause instanceof NoSuchProviderException)) { se.printStackTrace(); throw new Exception("Unexpected exception" + se); }
--- a/jdk/test/sun/security/ssl/ServerHandshaker/AnonCipherWithWantClientAuth.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/sun/security/ssl/ServerHandshaker/AnonCipherWithWantClientAuth.java Tue Jan 17 15:27:22 2017 +0100 @@ -31,7 +31,7 @@ * @bug 4392475 * @library /javax/net/ssl/templates * @summary Calling setWantClientAuth(true) disables anonymous suites - * @run main/othervm AnonCipherWithWantClientAuth + * @run main/othervm -Djavax.net.debug=all AnonCipherWithWantClientAuth */ import java.io.InputStream;
--- a/jdk/test/sun/security/validator/EndEntityExtensionCheck.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/sun/security/validator/EndEntityExtensionCheck.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,7 +45,7 @@ import java.util.Date; import java.util.HashSet; import java.util.Set; -import sun.security.validator.KeyStores; +import sun.security.validator.TrustStoreUtil; import sun.security.validator.Validator; @@ -113,7 +113,7 @@ Validator v = Validator.getInstance(Validator.TYPE_SIMPLE, Validator.VAR_TLS_CLIENT, - KeyStores.getTrustedCerts(ks)); + TrustStoreUtil.getTrustedCerts(ks)); try { v.validate(chain); throw new Exception("Chain should not have validated " +
--- a/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java Tue Jan 17 15:27:22 2017 +0100 @@ -27,7 +27,7 @@ * @summary Basic argument validation for --add-exports * @library /lib/testlibrary * @modules jdk.compiler - * @build AddExportsTestWarningError CompilerUtils ModuleSourceBuilder + * @build AddExportsTestWarningError CompilerUtils ModuleInfoMaker * @build jdk.testlibrary.* * @run testng AddExportsTestWarningError */ @@ -59,7 +59,7 @@ @BeforeTest public void setup() throws Exception { - ModuleSourceBuilder builder = new ModuleSourceBuilder(SRC_DIR); + ModuleInfoMaker builder = new ModuleInfoMaker(SRC_DIR); builder.writeJavaFiles("m1", "module m1 { }", "package p1; public class C1 { " +
--- a/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java Tue Jan 17 15:27:22 2017 +0100 @@ -27,7 +27,7 @@ * @summary Basic argument validation for --add-reads * @library /lib/testlibrary * @modules jdk.compiler - * @build AddReadsTestWarningError CompilerUtils ModuleSourceBuilder + * @build AddReadsTestWarningError CompilerUtils ModuleInfoMaker * @build jdk.testlibrary.* * @run testng AddReadsTestWarningError */ @@ -59,7 +59,7 @@ @BeforeTest public void setup() throws Exception { - ModuleSourceBuilder builder = new ModuleSourceBuilder(SRC_DIR); + ModuleInfoMaker builder = new ModuleInfoMaker(SRC_DIR); builder.writeJavaFiles("m1", "module m1 { requires m4; }", "package p1; public class C1 { " +
--- a/jdk/test/tools/launcher/modules/classpath/JavaClassPathTest.java Fri Jan 13 16:49:34 2017 -0500 +++ b/jdk/test/tools/launcher/modules/classpath/JavaClassPathTest.java Tue Jan 17 15:27:22 2017 +0100 @@ -95,19 +95,20 @@ public Object[][] classpath() { return new Object[][]{ // true indicates that class path default to current working directory - { "", "." }, - { "-Djava.class.path", "." }, - { "-Djava.class.path=", "" }, - { "-Djava.class.path=.", "." }, + { List.of(), "." }, + { List.of("-cp", ""), "" }, + { List.of("-cp", "."), "." }, + { List.of("-Djava.class.path"), "." }, + { List.of("-Djava.class.path="), "" }, + { List.of("-Djava.class.path=."), "." }, }; } @Test(dataProvider = "classpath") - public void testUnnamedModule(String option, String expected) throws Throwable { - List<String> args = new ArrayList<>(); - if (!option.isEmpty()) { - args.add(option); - } + public void testUnnamedModule(List<String> options, String expected) + throws Throwable + { + List<String> args = new ArrayList<>(options); args.add(TEST_MAIN); args.add(Boolean.toString(true)); args.add(expected); @@ -195,8 +196,12 @@ } private OutputAnalyzer execute(List<String> options) throws Throwable { - ProcessBuilder pb = - createJavaProcessBuilder(options.toArray(new String[0])); + ProcessBuilder pb = createJavaProcessBuilder( + options.stream() + .map(this::autoQuote) + .toArray(String[]::new) + ); + Map<String,String> env = pb.environment(); // remove CLASSPATH environment variable String value = env.remove("CLASSPATH"); @@ -205,4 +210,16 @@ .errorTo(System.out); } + private static final boolean IS_WINDOWS + = System.getProperty("os.name").startsWith("Windows"); + + /* + * Autoquote empty string argument on Windows + */ + private String autoQuote(String arg) { + if (IS_WINDOWS && arg.isEmpty()) { + return "\"\""; + } + return arg; + } }
--- a/langtools/.hgtags Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/.hgtags Tue Jan 17 15:27:22 2017 +0100 @@ -393,3 +393,4 @@ 586c93260d3b2f91a055b96118b141c05841694f jdk-9+148 4d4cd7cd731c1952d7330ea5bcfda8bd26820fa5 jdk-9+149 e5a42ddaf633fde14b983f740ae0e7e490741fd1 jdk-9+150 +4f348bd05341581df84ff1510d5b3a9b5b488367 jdk-9+151
--- a/langtools/make/intellij/src/idea/LangtoolsIdeaAntLogger.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/make/intellij/src/idea/LangtoolsIdeaAntLogger.java Tue Jan 17 15:27:22 2017 +0100 @@ -84,6 +84,8 @@ JAVAC_WARNING(StringBinaryPredicate.CONTAINS, MSG_WARN, "warning:", "compiler.warn"), /** a javac note */ JAVAC_NOTE(StringBinaryPredicate.CONTAINS, MSG_INFO, "note:", "compiler.note"), + /** a javac raw error (these typically come from a build misconfiguration - such as a bad javac flag) */ + JAVAC_RAW_ERROR(StringBinaryPredicate.STARTS_WITH, MSG_INFO, "javac: "), /** continuation of some javac error message */ JAVAC_NESTED_DIAG(StringBinaryPredicate.STARTS_WITH, MSG_INFO, " "), /** a javac crash */ @@ -126,7 +128,7 @@ enum Task { /** exec task - invoked during compilation */ JAVAC("exec", MessageKind.JAVAC_ERROR, MessageKind.JAVAC_WARNING, MessageKind.JAVAC_NOTE, - MessageKind.JAVAC_NESTED_DIAG, MessageKind.JAVAC_CRASH), + MessageKind.JAVAC_RAW_ERROR, MessageKind.JAVAC_NESTED_DIAG, MessageKind.JAVAC_CRASH), /** jtreg task - invoked during test execution */ JTREG("jtreg", MessageKind.JTREG_TEST_PASSED, MessageKind.JTREG_TEST_FAILED, MessageKind.JTREG_TEST_ERROR, MessageKind.JTREG_TEST_REPORT), /** initial synthetic task when the logger is created */
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java Tue Jan 17 15:27:22 2017 +0100 @@ -3845,20 +3845,26 @@ return bounds.head; } else { // length > 1 int classCount = 0; + List<Type> cvars = List.nil(); List<Type> lowers = List.nil(); for (Type bound : bounds) { if (!bound.isInterface()) { classCount++; Type lower = cvarLowerBound(bound); - if (bound != lower && !lower.hasTag(BOT)) - lowers = insert(lowers, lower); + if (bound != lower && !lower.hasTag(BOT)) { + cvars = cvars.append(bound); + lowers = lowers.append(lower); + } } } if (classCount > 1) { - if (lowers.isEmpty()) + if (lowers.isEmpty()) { return createErrorType(errT); - else - return glbFlattened(union(bounds, lowers), errT); + } else { + // try again with lower bounds included instead of capture variables + List<Type> newBounds = bounds.diff(cvars).appendList(lowers); + return glb(newBounds); + } } } return makeIntersectionType(bounds);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1740,7 +1740,7 @@ accept(ARROW); return token.kind == LBRACE ? - lambdaStatement(args, pos, pos) : + lambdaStatement(args, pos, token.pos) : lambdaExpression(args, pos); }
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Tue Jan 17 15:27:22 2017 +0100 @@ -114,6 +114,7 @@ private final boolean fatalErrors; private final boolean werror; private final boolean showResolveErrors; + private final boolean allowModules; private final JavacFiler filer; private final JavacMessager messager; @@ -178,7 +179,6 @@ private final Enter enter; private final Completer initialCompleter; private final Check chk; - private final ModuleSymbol defaultModule; private final Context context; @@ -230,8 +230,7 @@ chk = Check.instance(context); initProcessorLoader(); - defaultModule = source.allowModules() && options.isUnset("noModules") - ? symtab.unnamedModule : symtab.noModule; + allowModules = source.allowModules() && options.isUnset("noModules"); } public void setProcessors(Iterable<? extends Processor> processors) { @@ -665,7 +664,7 @@ private ArrayList<Pattern> supportedAnnotationPatterns; private ArrayList<String> supportedOptionNames; - ProcessorState(Processor p, Log log, Source source, ProcessingEnvironment env) { + ProcessorState(Processor p, Log log, Source source, boolean allowModules, ProcessingEnvironment env) { processor = p; contributed = false; @@ -676,7 +675,8 @@ supportedAnnotationPatterns = new ArrayList<>(); for (String importString : processor.getSupportedAnnotationTypes()) { - supportedAnnotationPatterns.add(importStringToPattern(importString, + supportedAnnotationPatterns.add(importStringToPattern(allowModules, + importString, processor, log)); } @@ -768,7 +768,8 @@ if (psi.processorIterator.hasNext()) { ProcessorState ps = new ProcessorState(psi.processorIterator.next(), - log, source, JavacProcessingEnvironment.this); + log, source, allowModules, + JavacProcessingEnvironment.this); psi.procStateList.add(ps); return ps; } else @@ -834,7 +835,8 @@ for(TypeElement a : annotationsPresent) { ModuleElement mod = elementUtils.getModuleOf(a); - unmatchedAnnotations.put((mod != null ? mod.getSimpleName() + "/" : "") + a.getQualifiedName().toString(), + String moduleSpec = allowModules && mod != null ? mod.getSimpleName() + "/" : ""; + unmatchedAnnotations.put(moduleSpec + a.getQualifiedName().toString(), a); } @@ -1657,7 +1659,7 @@ * regex matching that string. If the string is not a valid * import-style string, return a regex that won't match anything. */ - private static Pattern importStringToPattern(String s, Processor p, Log log) { + private static Pattern importStringToPattern(boolean allowModules, String s, Processor p, Log log) { String module; String pkg; int slash = s.indexOf('/'); @@ -1672,7 +1674,7 @@ pkg = s.substring(slash + 1); } if (MatchingUtils.isValidImportString(pkg)) { - return Pattern.compile(module + MatchingUtils.validImportStringToPatternString(pkg)); + return Pattern.compile((allowModules ? module : "") + MatchingUtils.validImportStringToPatternString(pkg)); } else { log.warning("proc.malformed.supported.string", s, p.getClass().getName()); return noMatches; // won't match any valid identifier
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Tue Jan 17 15:27:22 2017 +0100 @@ -2558,7 +2558,7 @@ # 0: string compiler.err.intersection.types.in.cast.not.supported.in.source=\ intersection types in cast are not supported in -source {0}\n\ - (use -source 8 or higher to enable default methods) + (use -source 8 or higher to enable intersection types in cast) # 0: string compiler.err.static.intf.methods.not.supported.in.source=\
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java Tue Jan 17 15:27:22 2017 +0100 @@ -105,18 +105,18 @@ // build root set for resolution Set<String> mods = new HashSet<>(roots); - // add default modules to the root set - // unnamed module - if (!initialArchives.isEmpty() || !classpaths.isEmpty() || - roots.isEmpty() || allDefaultModules) { - mods.addAll(systemModulePath.defaultSystemRoots()); - } - if (allSystemModules) { + // add all system modules to the root set for unnamed module or set explicitly + boolean unnamed = !initialArchives.isEmpty() || !classpaths.isEmpty(); + if (allSystemModules || (unnamed && !allDefaultModules)) { systemModulePath.findAll().stream() .map(mref -> mref.descriptor().name()) .forEach(mods::add); } + if (allDefaultModules) { + mods.addAll(systemModulePath.defaultSystemRoots()); + } + this.configuration = Configuration.empty() .resolveRequires(finder, ModuleFinder.of(), mods); @@ -502,6 +502,7 @@ boolean addAllApplicationModules; boolean addAllDefaultModules; boolean addAllSystemModules; + boolean allModules; Runtime.Version version; public Builder() { @@ -550,8 +551,7 @@ * Include all system modules and modules found on modulepath */ public Builder allModules() { - this.addAllSystemModules = true; - this.addAllApplicationModules = true; + this.allModules = true; return this; } @@ -592,19 +592,30 @@ .map(mref -> mref.descriptor().name()) .forEach(rootModules::add); } - if (addAllApplicationModules && appModulePath != null) { + + if ((addAllApplicationModules || allModules) && appModulePath != null) { appModulePath.findAll().stream() .map(mref -> mref.descriptor().name()) .forEach(rootModules::add); } + // no archive is specified for analysis + // add all system modules as root if --add-modules ALL-SYSTEM is specified + if (addAllSystemModules && rootModules.isEmpty() && + initialArchives.isEmpty() && classPaths.isEmpty()) { + systemModulePath.findAll() + .stream() + .map(mref -> mref.descriptor().name()) + .forEach(rootModules::add); + } + return new JdepsConfiguration(systemModulePath, finder, rootModules, classPaths, initialArchives, addAllDefaultModules, - addAllSystemModules, + allModules, version); }
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java Tue Jan 17 15:27:22 2017 +0100 @@ -38,10 +38,10 @@ import java.nio.file.Paths; import java.text.MessageFormat; import java.util.*; +import java.util.function.Function; +import java.util.function.ToIntFunction; import java.util.jar.JarFile; import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; /** * Implementation for the jdeps tool for static class dependency analysis. @@ -314,7 +314,10 @@ }, new Option(true, "-m", "--module") { void process(JdepsTask task, String opt, String arg) throws BadArgs { - task.options.rootModule = arg; + if (!task.options.rootModules.isEmpty()) { + throw new BadArgs("err.option.already.specified", opt); + } + task.options.rootModules.add(arg); task.options.addmods.add(arg); } }, @@ -350,6 +353,7 @@ new Option(true, "--require") { void process(JdepsTask task, String opt, String arg) { task.options.requires.add(arg); + task.options.addmods.add(arg); } }, new Option(true, "-f", "-filter") { @@ -491,11 +495,6 @@ if (options.help || options.version || options.fullVersion) { return EXIT_OK; } - - if (!inputArgs.isEmpty() && options.rootModule != null) { - reportError("err.invalid.arg.for.option", "-m"); - } - if (options.numFilters() > 1) { reportError("err.invalid.filters"); return EXIT_CMDERR; @@ -543,8 +542,8 @@ e.getKey(), e.getValue().toString()))); - // check if any module specified in --require is missing - Stream.concat(options.addmods.stream(), options.requires.stream()) + // check if any module specified in --add-modules, --require, and -m is missing + options.addmods.stream() .filter(mn -> !config.isValidToken(mn)) .forEach(mn -> config.findModule(mn).orElseThrow(() -> new UncheckedBadArgs(new BadArgs("err.module.not.found", mn)))); @@ -620,6 +619,7 @@ protected Command(CommandOption option) { this.option = option; } + /** * Returns true if the command-line options are all valid; * otherwise, returns false. @@ -633,6 +633,10 @@ /** * Includes all modules on system module path and application module path + * + * When a named module is analyzed, it will analyze the dependences + * only. The method should be overridden when this command should + * analyze all modules instead. */ boolean allModules() { return false; @@ -680,6 +684,10 @@ return false; } } + + if (!inputArgs.isEmpty() && !options.rootModules.isEmpty()) { + reportError("err.invalid.arg.for.option", "-m"); + } if (inputArgs.isEmpty() && !options.hasSourcePath()) { showHelp(); return false; @@ -808,23 +816,46 @@ log.println(); if (!options.requires.isEmpty()) log.println(getMessage("inverse.transitive.dependencies.on", - options.requires)); + options.requires)); else log.println(getMessage("inverse.transitive.dependencies.matching", - options.regex != null - ? options.regex.toString() - : "packages " + options.packageNames)); + options.regex != null + ? options.regex.toString() + : "packages " + options.packageNames)); - analyzer.inverseDependences().stream() - .sorted(Comparator.comparing(this::sortPath)) - .forEach(path -> log.println(path.stream() - .map(Archive::getName) - .collect(joining(" <- ")))); + analyzer.inverseDependences() + .stream() + .sorted(comparator()) + .map(this::toInversePath) + .forEach(log::println); return ok; } - private String sortPath(Deque<Archive> path) { - return path.peekFirst().getName(); + private String toInversePath(Deque<Archive> path) { + return path.stream() + .map(Archive::getName) + .collect(joining(" <- ")); + } + + /* + * Returns a comparator for sorting the inversed path, grouped by + * the first module name, then the shortest path and then sort by + * the module names of each path + */ + private Comparator<Deque<Archive>> comparator() { + return Comparator.<Deque<Archive>, String> + comparing(deque -> deque.peekFirst().getName()) + .thenComparingInt(Deque::size) + .thenComparing(this::toInversePath); + } + + /* + * Returns true if --require is specified so that all modules are + * analyzed to find all modules that depend on the modules specified in the + * --require option directly and indirectly + */ + public boolean allModules() { + return options.requires.size() > 0; } } @@ -924,6 +955,9 @@ return new ModuleAnalyzer(config, log, modules).run(); } + /* + * Returns true to analyze all modules + */ public boolean allModules() { return true; } @@ -957,6 +991,10 @@ option); return false; } + + if (!inputArgs.isEmpty() && !options.rootModules.isEmpty()) { + reportError("err.invalid.arg.for.option", "-m"); + } if (inputArgs.isEmpty() && !options.hasSourcePath()) { showHelp(); return false; @@ -971,11 +1009,6 @@ reduced, log).run(); } - - @Override - boolean allModules() { - return true; - } } @@ -1155,7 +1188,7 @@ String systemModulePath = System.getProperty("java.home"); String upgradeModulePath; String modulePath; - String rootModule; + Set<String> rootModules = new HashSet<>(); Set<String> addmods = new HashSet<>(); Runtime.Version multiRelease;
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java Tue Jan 17 15:27:22 2017 +0100 @@ -34,6 +34,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import static com.sun.tools.jdeps.Analyzer.NOT_FOUND; @@ -109,9 +110,7 @@ private void printDependences() { // find use of JDK internals Map<Module, Set<String>> jdkinternals = new HashMap<>(); - deps.keySet().stream() - .filter(source -> !source.getModule().isNamed()) - .map(deps::get) + dependenceStream() .flatMap(map -> map.entrySet().stream()) .filter(e -> e.getValue().size() > 0) .forEach(e -> jdkinternals.computeIfAbsent(e.getKey().getModule(), @@ -124,11 +123,10 @@ Module root = new RootModule("root"); builder.addModule(root); // find named module dependences - deps.keySet().stream() - .filter(source -> !source.getModule().isNamed()) - .map(deps::get) + dependenceStream() .flatMap(map -> map.keySet().stream()) - .filter(m -> m.getModule().isNamed()) + .filter(m -> m.getModule().isNamed() + && !configuration.rootModules().contains(m)) .map(Archive::getModule) .forEach(m -> builder.addEdge(root, m)); @@ -167,6 +165,16 @@ }); } + /* + * Returns a stream of dependence map from an Archive to the set of JDK + * internal APIs being used. + */ + private Stream<Map<Archive, Set<String>>> dependenceStream() { + return deps.keySet().stream() + .filter(source -> !source.getModule().isNamed() + || configuration.rootModules().contains(source)) + .map(deps::get); + } private class RootModule extends Module { final ModuleDescriptor descriptor;
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties Tue Jan 17 15:27:22 2017 +0100 @@ -194,6 +194,7 @@ err.invalid.options={0} cannot be used with {1} option err.module.not.found=module not found: {0} err.root.module.not.set=root module set empty +err.option.already.specified={0} option specified more than once. err.filter.not.specified=--package (-p), --regex (-e), --require option must be specified err.multirelease.option.exists={0} is not a multi-release jar file, but the --multi-release option is set err.multirelease.option.notfound={0} is a multi-release jar file, but the --multi-release option is not set
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Tue Jan 17 15:27:22 2017 +0100 @@ -47,7 +47,9 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; @@ -185,10 +187,7 @@ private IOContext input = null; private boolean regenerateOnDeath = true; private boolean live = false; - private boolean feedbackInitialized = false; - private String commandLineFeedbackMode = null; - private List<String> remoteVMOptions = new ArrayList<>(); - private List<String> compilerOptions = new ArrayList<>(); + private Options options; SourceCodeAnalysis analysis; JShell state = null; @@ -198,7 +197,6 @@ private boolean debug = false; public boolean testPrompt = false; - private String cmdlineClasspath = null; private String defaultStartup = null; private String startup = null; private String executionControlSpec = null; @@ -221,6 +219,16 @@ static final Pattern BUILTIN_FILE_PATTERN = Pattern.compile("\\w+"); static final String BUILTIN_FILE_PATH_FORMAT = "jrt:/jdk.jshell/jdk/jshell/tool/resources/%s.jsh"; + // match anything followed by whitespace + private static final Pattern OPTION_PRE_PATTERN = + Pattern.compile("\\s*(\\S+\\s+)*?"); + // match a (possibly incomplete) option flag with optional double-dash and/or internal dashes + private static final Pattern OPTION_PATTERN = + Pattern.compile(OPTION_PRE_PATTERN.pattern() + "(?<dd>-??)(?<flag>-([a-z][a-z\\-]*)?)"); + // match an option flag and a (possibly missing or incomplete) value + private static final Pattern OPTION_VALUE_PATTERN = + Pattern.compile(OPTION_PATTERN.pattern() + "\\s+(?<val>\\S*)"); + // Tool id (tid) mapping: the three name spaces NameSpace mainNamespace; NameSpace startNamespace; @@ -229,7 +237,278 @@ // Tool id (tid) mapping: the current name spaces NameSpace currentNameSpace; - Map<Snippet,SnippetInfo> mapSnippet; + Map<Snippet, SnippetInfo> mapSnippet; + + // Kinds of compiler/runtime init options + private enum OptionKind { + CLASS_PATH("--class-path", true), + MODULE_PATH("--module-path", true), + ADD_MODULES("--add-modules", false), + ADD_EXPORTS("--add-exports", false), + TO_COMPILER("-C", false, false, true, false), + TO_REMOTE_VM("-R", false, false, false, true),; + final String optionFlag; + final boolean onlyOne; + final boolean passFlag; + final boolean toCompiler; + final boolean toRemoteVm; + + private OptionKind(String optionFlag, boolean onlyOne) { + this(optionFlag, onlyOne, true, true, true); + } + + private OptionKind(String optionFlag, boolean onlyOne, boolean passFlag, + boolean toCompiler, boolean toRemoteVm) { + this.optionFlag = optionFlag; + this.onlyOne = onlyOne; + this.passFlag = passFlag; + this.toCompiler = toCompiler; + this.toRemoteVm = toRemoteVm; + } + + } + + // compiler/runtime init option values + private static class Options { + + private Map<OptionKind, List<String>> optMap = new HashMap<>(); + + private String[] selectOptions(Predicate<Entry<OptionKind, List<String>>> pred) { + return optMap.entrySet().stream() + .filter(pred) + .flatMap(e -> e.getValue().stream()) + .toArray(String[]::new); + } + + String[] remoteVmOptions() { + return selectOptions(e -> e.getKey().toRemoteVm); + } + + String[] compilerOptions() { + return selectOptions(e -> e.getKey().toCompiler); + } + + String[] commonOptions() { + return selectOptions(e -> e.getKey().passFlag); + } + + void addAll(OptionKind kind, Collection<String> vals) { + optMap.computeIfAbsent(kind, k -> new ArrayList<>()) + .addAll(vals); + } + + void override(Options newer) { + newer.optMap.entrySet().stream() + .forEach(e -> { + if (e.getKey().onlyOne) { + // Only one allowed, override last + optMap.put(e.getKey(), e.getValue()); + } else { + // Additive + addAll(e.getKey(), e.getValue()); + } + }); + } + } + + // base option parsing of /env, /reload, and /reset and command-line options + private class OptionParserBase { + + final OptionParser parser = new OptionParser(); + private final OptionSpec<String> argClassPath = parser.accepts("class-path").withRequiredArg(); + private final OptionSpec<String> argModulePath = parser.accepts("module-path").withRequiredArg(); + private final OptionSpec<String> argAddModules = parser.accepts("add-modules").withRequiredArg(); + private final OptionSpec<String> argAddExports = parser.accepts("add-exports").withRequiredArg(); + private final NonOptionArgumentSpec<String> argNonOptions = parser.nonOptions(); + + private Options opts = new Options(); + private List<String> nonOptions; + private boolean failed = false; + + List<String> nonOptions() { + return nonOptions; + } + + void msg(String key, Object... args) { + errormsg(key, args); + } + + Options parse(String[] args) throws OptionException { + try { + OptionSet oset = parser.parse(args); + nonOptions = oset.valuesOf(argNonOptions); + return parse(oset); + } catch (OptionException ex) { + if (ex.options().isEmpty()) { + msg("jshell.err.opt.invalid", stream(args).collect(joining(", "))); + } else { + boolean isKnown = parser.recognizedOptions().containsKey(ex.options().iterator().next()); + msg(isKnown + ? "jshell.err.opt.arg" + : "jshell.err.opt.unknown", + ex.options() + .stream() + .collect(joining(", "))); + } + return null; + } + } + + Options parse(OptionSet options) { + addOptions(OptionKind.CLASS_PATH, options.valuesOf(argClassPath)); + addOptions(OptionKind.MODULE_PATH, options.valuesOf(argModulePath)); + addOptions(OptionKind.ADD_MODULES, options.valuesOf(argAddModules)); + addOptions(OptionKind.ADD_EXPORTS, options.valuesOf(argAddExports).stream() + .map(mp -> mp.contains("=") ? mp : mp + "=ALL-UNNAMED") + .collect(toList()) + ); + + return failed ? null : opts; + } + + void addOptions(OptionKind kind, Collection<String> vals) { + if (!vals.isEmpty()) { + if (kind.onlyOne && vals.size() > 1) { + msg("jshell.err.opt.one", kind.optionFlag); + failed = true; + return; + } + if (kind.passFlag) { + vals = vals.stream() + .flatMap(mp -> Stream.of(kind.optionFlag, mp)) + .collect(toList()); + } + opts.addAll(kind, vals); + } + } + } + + // option parsing for /reload (adds -restore -quiet) + private class OptionParserReload extends OptionParserBase { + + private final OptionSpecBuilder argRestore = parser.accepts("restore"); + private final OptionSpecBuilder argQuiet = parser.accepts("quiet"); + + private boolean restore = false; + private boolean quiet = false; + + boolean restore() { + return restore; + } + + boolean quiet() { + return quiet; + } + + @Override + Options parse(OptionSet options) { + if (options.has(argRestore)) { + restore = true; + } + if (options.has(argQuiet)) { + quiet = true; + } + return super.parse(options); + } + } + + // option parsing for command-line + private class OptionParserCommandLine extends OptionParserBase { + + private final OptionSpec<String> argStart = parser.accepts("startup").withRequiredArg(); + private final OptionSpecBuilder argNoStart = parser.acceptsAll(asList("n", "no-startup")); + private final OptionSpec<String> argFeedback = parser.accepts("feedback").withRequiredArg(); + private final OptionSpec<String> argExecution = parser.accepts("execution").withRequiredArg(); + private final OptionSpecBuilder argQ = parser.accepts("q"); + private final OptionSpecBuilder argS = parser.accepts("s"); + private final OptionSpecBuilder argV = parser.accepts("v"); + private final OptionSpec<String> argR = parser.accepts("R").withRequiredArg(); + private final OptionSpec<String> argC = parser.accepts("C").withRequiredArg(); + private final OptionSpecBuilder argHelp = parser.acceptsAll(asList("h", "help")); + private final OptionSpecBuilder argVersion = parser.accepts("version"); + private final OptionSpecBuilder argFullVersion = parser.accepts("full-version"); + private final OptionSpecBuilder argX = parser.accepts("X"); + + private String feedbackMode = null; + private String initialStartup = null; + + String feedbackMode() { + return feedbackMode; + } + + String startup() { + return initialStartup; + } + + @Override + void msg(String key, Object... args) { + startmsg(key, args); + } + + @Override + Options parse(OptionSet options) { + if (options.has(argHelp)) { + printUsage(); + return null; + } + if (options.has(argX)) { + printUsageX(); + return null; + } + if (options.has(argVersion)) { + cmdout.printf("jshell %s\n", version()); + return null; + } + if (options.has(argFullVersion)) { + cmdout.printf("jshell %s\n", fullVersion()); + return null; + } + if ((options.valuesOf(argFeedback).size() + + (options.has(argQ) ? 1 : 0) + + (options.has(argS) ? 1 : 0) + + (options.has(argV) ? 1 : 0)) > 1) { + msg("jshell.err.opt.feedback.one"); + return null; + } else if (options.has(argFeedback)) { + feedbackMode = options.valueOf(argFeedback); + } else if (options.has("q")) { + feedbackMode = "concise"; + } else if (options.has("s")) { + feedbackMode = "silent"; + } else if (options.has("v")) { + feedbackMode = "verbose"; + } + if (options.has(argStart)) { + List<String> sts = options.valuesOf(argStart); + if (options.has("no-startup")) { + startmsg("jshell.err.opt.startup.conflict"); + return null; + } + StringBuilder sb = new StringBuilder(); + for (String fn : sts) { + String s = readFile(fn, "--startup"); + if (s == null) { + return null; + } + sb.append(s); + } + initialStartup = sb.toString(); + } else if (options.has(argNoStart)) { + initialStartup = ""; + } else { + initialStartup = prefs.get(STARTUP_KEY); + if (initialStartup == null) { + initialStartup = defaultStartup(); + } + } + if (options.has(argExecution)) { + executionControlSpec = options.valueOf(argExecution); + } + addOptions(OptionKind.TO_REMOTE_VM, options.valuesOf(argR)); + addOptions(OptionKind.TO_COMPILER, options.valuesOf(argC)); + return super.parse(options); + } + } /** * Is the input/output currently interactive @@ -464,43 +743,45 @@ } public void start(String[] args) throws Exception { - List<String> loadList = processCommandArgs(args); - if (loadList == null) { + OptionParserCommandLine commandLineArgs = new OptionParserCommandLine(); + options = commandLineArgs.parse(args); + if (options == null) { // Abort return; } - try (IOContext in = new ConsoleIOContext(this, cmdin, console)) { - start(in, loadList); - } - } - - private void start(IOContext in, List<String> loadList) { - // If startup hasn't been set by command line, set from retained/default - if (startup == null) { - startup = prefs.get(STARTUP_KEY); - if (startup == null) { - startup = defaultStartup(); - } - } - + startup = commandLineArgs.startup(); + // initialize editor settings configEditor(); - - resetState(); // Initialize - + // initialize JShell instance + resetState(); // Read replay history from last jshell session into previous history String prevReplay = prefs.get(REPLAY_RESTORE_KEY); if (prevReplay != null) { replayableHistoryPrevious = Arrays.asList(prevReplay.split(RECORD_SEPARATOR)); } - - for (String loadFile : loadList) { + // load snippet/command files given on command-line + for (String loadFile : commandLineArgs.nonOptions()) { runFile(loadFile, "jshell"); } + // if we survived that... + if (regenerateOnDeath) { + // initialize the predefined feedback modes + initFeedback(commandLineArgs.feedbackMode()); + } + // check again, as feedback setting could have failed + if (regenerateOnDeath) { + // if we haven't died, and the feedback mode wants fluff, print welcome + if (feedback.shouldDisplayCommandFluff()) { + hardmsg("jshell.msg.welcome", version()); + } + // execute from user input + try (IOContext in = new ConsoleIOContext(this, cmdin, console)) { + start(in); + } + } + } - if (regenerateOnDeath && feedback.shouldDisplayCommandFluff()) { - hardmsg("jshell.msg.welcome", version()); - } - + private void start(IOContext in) { try { while (regenerateOnDeath) { if (!live) { @@ -530,144 +811,6 @@ return editor = BUILT_IN_EDITOR; } - /** - * Process the command line arguments. - * Set options. - * @param args the command line arguments - * @return the list of files to be loaded - */ - private List<String> processCommandArgs(String[] args) { - OptionParser parser = new OptionParser(); - OptionSpec<String> cp = parser.accepts("class-path").withRequiredArg(); - OptionSpec<String> mpath = parser.accepts("module-path").withRequiredArg(); - OptionSpec<String> amods = parser.accepts("add-modules").withRequiredArg(); - OptionSpec<String> st = parser.accepts("startup").withRequiredArg(); - parser.acceptsAll(asList("n", "no-startup")); - OptionSpec<String> fb = parser.accepts("feedback").withRequiredArg(); - OptionSpec<String> ec = parser.accepts("execution").withRequiredArg(); - parser.accepts("q"); - parser.accepts("s"); - parser.accepts("v"); - OptionSpec<String> r = parser.accepts("R").withRequiredArg(); - OptionSpec<String> c = parser.accepts("C").withRequiredArg(); - parser.acceptsAll(asList("h", "help")); - parser.accepts("version"); - parser.accepts("full-version"); - - parser.accepts("X"); - OptionSpec<String> addExports = parser.accepts("add-exports").withRequiredArg(); - - NonOptionArgumentSpec<String> loadFileSpec = parser.nonOptions(); - - OptionSet options; - try { - options = parser.parse(args); - } catch (OptionException ex) { - if (ex.options().isEmpty()) { - startmsg("jshell.err.opt.invalid", stream(args).collect(joining(", "))); - } else { - boolean isKnown = parser.recognizedOptions().containsKey(ex.options().iterator().next()); - startmsg(isKnown - ? "jshell.err.opt.arg" - : "jshell.err.opt.unknown", - ex.options() - .stream() - .collect(joining(", "))); - } - return null; - } - - if (options.has("help")) { - printUsage(); - return null; - } - if (options.has("X")) { - printUsageX(); - return null; - } - if (options.has("version")) { - cmdout.printf("jshell %s\n", version()); - return null; - } - if (options.has("full-version")) { - cmdout.printf("jshell %s\n", fullVersion()); - return null; - } - if (options.has(cp)) { - List<String> cps = options.valuesOf(cp); - if (cps.size() > 1) { - startmsg("jshell.err.opt.one", "--class-path"); - return null; - } - cmdlineClasspath = cps.get(0); - } - if (options.has(st)) { - List<String> sts = options.valuesOf(st); - if (options.has("no-startup")) { - startmsg("jshell.err.opt.startup.conflict"); - return null; - } - StringBuilder sb = new StringBuilder(); - for (String fn : sts) { - String s = readFile(fn, "--startup"); - if (s == null) { - return null; - } - sb.append(s); - } - startup = sb.toString(); - } else if (options.has("no-startup")) { - startup = ""; - } - if ((options.valuesOf(fb).size() + - (options.has("q") ? 1 : 0) + - (options.has("s") ? 1 : 0) + - (options.has("v") ? 1 : 0)) > 1) { - startmsg("jshell.err.opt.feedback.one"); - return null; - } else if (options.has(fb)) { - commandLineFeedbackMode = options.valueOf(fb); - } else if (options.has("q")) { - commandLineFeedbackMode = "concise"; - } else if (options.has("s")) { - commandLineFeedbackMode = "silent"; - } else if (options.has("v")) { - commandLineFeedbackMode = "verbose"; - } - if (options.has(r)) { - remoteVMOptions.addAll(options.valuesOf(r)); - } - if (options.has(c)) { - compilerOptions.addAll(options.valuesOf(c)); - } - if (options.has(mpath)) { - compilerOptions.add("--module-path"); - compilerOptions.addAll(options.valuesOf(mpath)); - remoteVMOptions.add("--module-path"); - remoteVMOptions.addAll(options.valuesOf(mpath)); - } - if (options.has(amods)) { - compilerOptions.add("--add-modules"); - compilerOptions.addAll(options.valuesOf(amods)); - remoteVMOptions.add("--add-modules"); - remoteVMOptions.addAll(options.valuesOf(amods)); - } - if (options.has(ec)) { - executionControlSpec = options.valueOf(ec); - } - - if (options.has(addExports)) { - List<String> exports = options.valuesOf(addExports).stream() - .map(mp -> mp + "=ALL-UNNAMED") - .flatMap(mp -> Stream.of("--add-exports", mp)) - .collect(toList()); - remoteVMOptions.addAll(exports); - compilerOptions.addAll(exports); - } - - return options.valuesOf(loadFileSpec); - } - private void printUsage() { cmdout.print(getResourceString("help.usage")); } @@ -734,8 +877,8 @@ .idGenerator((sn, i) -> (currentNameSpace == startNamespace || state.status(sn).isActive()) ? currentNameSpace.tid(sn) : errorNamespace.tid(sn)) - .remoteVMOptions(remoteVMOptions.stream().toArray(String[]::new)) - .compilerOptions(compilerOptions.stream().toArray(String[]::new)); + .remoteVMOptions(options.remoteVmOptions()) + .compilerOptions(options.compilerOptions()); if (executionControlSpec != null) { builder.executionEngine(executionControlSpec); } @@ -748,15 +891,6 @@ }); analysis = state.sourceCodeAnalysis(); live = true; - if (!feedbackInitialized) { - // One time per run feedback initialization - feedbackInitialized = true; - initFeedback(); - } - - if (cmdlineClasspath != null) { - state.addToClasspath(cmdlineClasspath); - } startUpRun(startup); currentNameSpace = mainNamespace; @@ -767,7 +901,7 @@ } //where -- one-time per run initialization of feedback modes - private void initFeedback() { + private void initFeedback(String initMode) { // No fluff, no prefix, for init failures MessageHandler initmh = new InitMessageHandler(); // Execute the feedback initialization code in the resource file @@ -782,12 +916,11 @@ prefs.remove(MODE_KEY); } } - if (commandLineFeedbackMode != null) { + if (initMode != null) { // The feedback mode to use was specified on the command line, use it - if (!setFeedback(initmh, new ArgTokenizer("--feedback", commandLineFeedbackMode))) { + if (!setFeedback(initmh, new ArgTokenizer("--feedback", initMode))) { regenerateOnDeath = false; } - commandLineFeedbackMode = null; } else { String fb = prefs.get(FEEDBACK_KEY); if (fb != null) { @@ -1016,6 +1149,13 @@ this.alternatives = alternatives; } + // Add more options to an existing provider + public FixedCompletionProvider(FixedCompletionProvider base, String... alternatives) { + List<String> l = new ArrayList<>(Arrays.asList(base.alternatives)); + l.addAll(Arrays.asList(alternatives)); + this.alternatives = l.toArray(new String[l.size()]); + } + @Override public List<Suggestion> completionSuggestions(String input, int cursor, int[] anchor) { List<Suggestion> result = new ArrayList<>(); @@ -1037,11 +1177,20 @@ private static final CompletionProvider SNIPPET_HISTORY_OPTION_COMPLETION_PROVIDER = new FixedCompletionProvider("-all", "-start ", "-history"); private static final CompletionProvider SAVE_OPTION_COMPLETION_PROVIDER = new FixedCompletionProvider("-all ", "-start ", "-history "); private static final CompletionProvider SNIPPET_OPTION_COMPLETION_PROVIDER = new FixedCompletionProvider("-all", "-start " ); - private static final CompletionProvider RELOAD_OPTIONS_COMPLETION_PROVIDER = new FixedCompletionProvider("-restore ", "-quiet "); - private static final CompletionProvider RESTORE_COMPLETION_PROVIDER = new FixedCompletionProvider("-restore"); - private static final CompletionProvider QUIET_COMPLETION_PROVIDER = new FixedCompletionProvider("-quiet"); + private static final FixedCompletionProvider COMMAND_LINE_LIKE_OPTIONS_COMPLETION_PROVIDER = new FixedCompletionProvider( + "-class-path ", "-module-path ", "-add-modules ", "-add-exports "); + private static final CompletionProvider RELOAD_OPTIONS_COMPLETION_PROVIDER = new FixedCompletionProvider( + COMMAND_LINE_LIKE_OPTIONS_COMPLETION_PROVIDER, + "-restore ", "-quiet "); private static final CompletionProvider SET_MODE_OPTIONS_COMPLETION_PROVIDER = new FixedCompletionProvider("-command", "-quiet", "-delete"); private static final CompletionProvider FILE_COMPLETION_PROVIDER = fileCompletions(p -> true); + private static final Map<String, CompletionProvider> ARG_OPTIONS = new HashMap<>(); + static { + ARG_OPTIONS.put("-class-path", classPathCompletion()); + ARG_OPTIONS.put("-module-path", fileCompletions(Files::isDirectory)); + ARG_OPTIONS.put("-add-modules", EMPTY_COMPLETION_PROVIDER); + ARG_OPTIONS.put("-add-exports", EMPTY_COMPLETION_PROVIDER); + } private final Map<String, Command> commands = new LinkedHashMap<>(); private void registerCommand(Command cmd) { commands.put(cmd.command, cmd); @@ -1167,32 +1316,70 @@ }; } - private static CompletionProvider reloadCompletion() { + // command-line-like option completion -- options with values + private static CompletionProvider optionCompletion(CompletionProvider provider) { return (code, cursor, anchor) -> { - CompletionProvider provider; - int pastSpace = code.indexOf(' ') + 1; // zero if no space - if (pastSpace == 0) { - provider = RELOAD_OPTIONS_COMPLETION_PROVIDER; - } else { - switch (code.substring(0, pastSpace - 1)) { - case "-quiet": - provider = RESTORE_COMPLETION_PROVIDER; - break; - case "-restore": - provider = QUIET_COMPLETION_PROVIDER; - break; - default: - provider = EMPTY_COMPLETION_PROVIDER; - break; + Matcher ovm = OPTION_VALUE_PATTERN.matcher(code); + if (ovm.matches()) { + String flag = ovm.group("flag"); + List<CompletionProvider> ps = ARG_OPTIONS.entrySet().stream() + .filter(es -> es.getKey().startsWith(flag)) + .map(es -> es.getValue()) + .collect(toList()); + if (ps.size() == 1) { + int pastSpace = ovm.start("val"); + List<Suggestion> result = ps.get(0).completionSuggestions( + ovm.group("val"), cursor - pastSpace, anchor); + anchor[0] += pastSpace; + return result; } } - List<Suggestion> result = provider.completionSuggestions( - code.substring(pastSpace), cursor - pastSpace, anchor); - anchor[0] += pastSpace; - return result; + Matcher om = OPTION_PATTERN.matcher(code); + if (om.matches()) { + int pastSpace = om.start("flag"); + List<Suggestion> result = provider.completionSuggestions( + om.group("flag"), cursor - pastSpace, anchor); + if (!om.group("dd").isEmpty()) { + result = result.stream() + .map(sug -> new Suggestion() { + @Override + public String continuation() { + return "-" + sug.continuation(); + } + + @Override + public boolean matchesType() { + return false; + } + }) + .collect(toList()); + --pastSpace; + } + anchor[0] += pastSpace; + return result; + } + Matcher opp = OPTION_PRE_PATTERN.matcher(code); + if (opp.matches()) { + int pastSpace = opp.end(); + List<Suggestion> result = provider.completionSuggestions( + "", cursor - pastSpace, anchor); + anchor[0] += pastSpace; + return result; + } + return Collections.emptyList(); }; } + // /reload command completion + private static CompletionProvider reloadCompletion() { + return optionCompletion(RELOAD_OPTIONS_COMPLETION_PROVIDER); + } + + // /env command completion + private static CompletionProvider envCompletion() { + return optionCompletion(COMMAND_LINE_LIKE_OPTIONS_COMPLETION_PROVIDER); + } + private static CompletionProvider orMostSpecificCompletion( CompletionProvider left, CompletionProvider right) { return (code, cursor, anchor) -> { @@ -1286,16 +1473,15 @@ registerCommand(new Command("/exit", arg -> cmdExit(), EMPTY_COMPLETION_PROVIDER)); + registerCommand(new Command("/env", + arg -> cmdEnv(arg), + envCompletion())); registerCommand(new Command("/reset", - arg -> cmdReset(), - EMPTY_COMPLETION_PROVIDER)); + arg -> cmdReset(arg), + envCompletion())); registerCommand(new Command("/reload", this::cmdReload, reloadCompletion())); - registerCommand(new Command("/classpath", - this::cmdClasspath, - classPathCompletion(), - CommandKind.REPLAY)); registerCommand(new Command("/history", arg -> cmdHistory(), EMPTY_COMPLETION_PROVIDER)); @@ -1344,6 +1530,9 @@ registerCommand(new Command("shortcuts", "help.shortcuts", CommandKind.HELP_SUBJECT)); + registerCommand(new Command("context", + "help.context", + CommandKind.HELP_SUBJECT)); commandCompletions = new ContinuousCompletionProvider( commands.values().stream() @@ -1692,17 +1881,6 @@ hard(stset); } - boolean cmdClasspath(String arg) { - if (arg.isEmpty()) { - errormsg("jshell.err.classpath.arg"); - return false; - } else { - state.addToClasspath(toPathResolvingUserHome(arg).toString()); - fluffmsg("jshell.msg.classpath", arg); - return true; - } - } - boolean cmdDebug(String arg) { if (arg.isEmpty()) { debug = !debug; @@ -2228,7 +2406,6 @@ } - // Read a built-in file from resources or null String getResource(String name) { if (BUILTIN_FILE_PATTERN.matcher(name).matches()) { try { @@ -2266,20 +2443,22 @@ return defaultStartup; } - private boolean cmdReset() { + private boolean cmdReset(String rawargs) { + if (!parseCommandLineLikeFlags(rawargs, new OptionParserBase())) { + return false; + } live = false; fluffmsg("jshell.msg.resetting.state"); return true; } private boolean cmdReload(String rawargs) { - ArgTokenizer at = new ArgTokenizer("/reload", rawargs.trim()); - at.allowedOptions("-restore", "-quiet"); - if (!checkOptionsAndRemainingInput(at)) { + OptionParserReload ap = new OptionParserReload(); + if (!parseCommandLineLikeFlags(rawargs, ap)) { return false; } Iterable<String> history; - if (at.hasOption("-restore")) { + if (ap.restore()) { if (replayableHistoryPrevious == null) { errormsg("jshell.err.reload.no.previous"); return false; @@ -2290,13 +2469,57 @@ history = replayableHistory; fluffmsg("jshell.err.reload.restarting.state"); } - boolean echo = !at.hasOption("-quiet"); + return doReload(history, !ap.quiet()); + } + + private boolean cmdEnv(String rawargs) { + if (rawargs.trim().isEmpty()) { + // No arguments, display current settings (as option flags) + StringBuilder sb = new StringBuilder(); + for (String a : options.commonOptions()) { + sb.append( + a.startsWith("-") + ? sb.length() > 0 + ? "\n " + : " " + : " "); + sb.append(a); + } + if (sb.length() > 0) { + rawout(prefix(sb.toString())); + } + return false; + } + if (!parseCommandLineLikeFlags(rawargs, new OptionParserBase())) { + return false; + } + fluffmsg("jshell.msg.set.restore"); + return doReload(replayableHistory, false); + } + + private boolean doReload(Iterable<String> history, boolean echo) { resetState(); run(new ReloadIOContext(history, echo ? cmdout : null)); return true; } + private boolean parseCommandLineLikeFlags(String rawargs, OptionParserBase ap) { + String[] args = Arrays.stream(rawargs.split("\\s+")) + .filter(s -> !s.isEmpty()) + .toArray(String[]::new); + Options opts = ap.parse(args); + if (opts == null) { + return false; + } + if (!ap.nonOptions().isEmpty()) { + errormsg("jshell.err.unexpected.at.end", ap.nonOptions(), rawargs); + return false; + } + options.override(opts); + return true; + } + private boolean cmdSave(String rawargs) { ArgTokenizer at = new ArgTokenizer("/save", rawargs.trim()); at.allowedOptions("-all", "-start", "-history");
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties Tue Jan 17 15:27:22 2017 +0100 @@ -52,6 +52,7 @@ jshell.err.no.such.command.or.snippet.id = No such command or snippet id: {0} jshell.err.command.ambiguous = Command: ''{0}'' is ambiguous: {1} +jshell.msg.set.restore = Setting new options and restoring state. jshell.msg.set.editor.set = Editor set to: {0} jshell.msg.set.editor.retain = Editor setting retained: {0} jshell.err.no.builtin.editor = Built-in editor not available. @@ -319,21 +320,25 @@ Save any work before using this command help.reset.summary = reset jshell -help.reset.args = +help.reset.args = \ +[-class-path <path>] [-module-path <path>] [-add-modules <modules>]... help.reset =\ Reset the jshell tool code and execution state:\n\t\ * All entered code is lost.\n\t\ * Start-up code is re-executed.\n\t\ * The execution state is restarted.\n\t\ - * The classpath is cleared.\n\ Tool settings are maintained, as set with: /set ...\n\ -Save any work before using this command +Save any work before using this command.\n\ +The /reset command accepts context options, see:\n\n\t\ + /help context\n\ + help.reload.summary = reset and replay relevant history -- current or previous (-restore) -help.reload.args = [-restore] [-quiet] +help.reload.args = \ +[-restore] [-quiet] [-class-path <path>] [-module-path <path>]... help.reload =\ Reset the jshell tool code and execution state then replay each valid snippet\n\ -and any /drop or /classpath commands in the order they were entered.\n\ +and any /drop commands in the order they were entered.\n\ \n\ /reload\n\t\ Reset and replay the valid history since jshell was entered, or\n\t\ @@ -345,12 +350,31 @@ command was executed. This can thus be used to restore a previous\n\t\ jshell tool session.\n\n\ /reload [-restore] -quiet\n\t\ - With the '-quiet' argument the replay is not shown. Errors will display. + With the '-quiet' argument the replay is not shown. Errors will display.\n\ +\n\ +Each of the above accepts context options, see:\n\n\t\ + /help context\n\ +\n\ +For example:\n\n\t\ + /reload -add-modules com.greetings -restore -help.classpath.summary = add a path to the classpath -help.classpath.args = <path> -help.classpath =\ -Append a additional path to the classpath. +help.env.summary = view or change the evaluation context +help.env.args = \ +[-class-path <path>] [-module-path <path>] [-add-modules <modules>] ... +help.env =\ +View or change the evaluation context. The evaluation context is the class path,\n\ +module path, etc.\n\ +/env\n\t\ + Show the evaluation context displayed as context options.\n\n\ +/env [-class-path <path>] [-module-path <path>] [-add-modules <modules>] ...\n\t\ + With at least one option set, sets the evaluation context. If snippets\n\t\ + have been defined, the execution state is reset with the new\n\t\ + evaluation context and the snippets will be replayed -- the replay is not\n\t\ + shown, however, errors will display. This is equivalent to: /reload -quiet\n\t\ + For details of context options, see:\n\n\t\t\ + /help context\n\n\t\ + For example:\n\n\t\t\ + /env -add-modules com.greetings help.history.summary = history of what you have typed help.history.args = @@ -473,6 +497,37 @@ possible fully qualified names based on the content of the specified classpath.\n\t\t\ The "<fix-shortcut>" is either Alt-F1 or Alt-Enter, depending on the platform. +help.context.summary = the evaluation context options for /env /reload and /reset +help.context =\ +These options configure the evaluation context, they can be specified when\n\ +jshell is started: on the command-line, or restarted with the commands /env,\n\ +/reload, or /reset.\n\ +\n\ +They are:\n\t\ + --class-path <class search path of directories and zip/jar files>\n\t\t\ + A list of directories, JAR archives,\n\t\t\ + and ZIP archives to search for class files.\n\t\t\ + The list is separated with the path separator\n\t\t\ + (a : on unix/linux/mac, and ; on windows).\n\t\ + --module-path <module path>...\n\t\t\ + A list of directories, each directory\n\t\t\ + is a directory of modules.\n\t\t\ + The list is separated with the path separator\n\t\t\ + (a : on unix/linux/mac, and ; on windows).\n\t\ + --add-modules <modulename>[,<modulename>...]\n\t\t\ + root modules to resolve in addition to the initial module.\n\t\t\ + <modulename> can also be ALL-DEFAULT, ALL-SYSTEM,\n\t\t\ + ALL-MODULE-PATH.\n\t\ + --add-exports <module>/<package>=<target-module>(,<target-module>)*\n\t\t\ + updates <module> to export <package> to <target-module>,\n\t\t\ + regardless of module declaration.\n\t\t\ + <target-module> can be ALL-UNNAMED to export to all\n\t\t\ + unnamed modules. In jshell, if the <target-module> is not\n\t\t\ + specified (no =) then ALL-UNNAMED is used.\n\ +\n\ +On the command-line these options must have two dashes, e.g.: --module-path\n\ +On jshell commands they can have one or two dashes, e.g.: -module-path\n\ + help.set._retain = \ The '-retain' option saves a setting so that it is used in future sessions.\n\ The -retain option can be used on the following forms of /set:\n\n\t\
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java Tue Jan 17 15:27:22 2017 +0100 @@ -161,6 +161,10 @@ @Override public Diag diag(Diagnostic<? extends JavaFileObject> d) { SourceMemoryJavaFileObject smjfo = (SourceMemoryJavaFileObject) d.getSource(); + if (smjfo == null) { + // Handle failure that doesn't preserve mapping + return new StringSourceHandler().diag(d); + } OuterWrap w = (OuterWrap) smjfo.getOrigin(); return w.wrapDiag(d); }
--- a/langtools/test/ProblemList.txt Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/ProblemList.txt Tue Jan 17 15:27:22 2017 +0100 @@ -1,6 +1,6 @@ ########################################################################### # -# Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -36,17 +36,14 @@ # # jshell -jdk/jshell/EditorPadTest.java 8161276 windows-all Test set-up cannot press buttons -jdk/jshell/ToolBasicTest.java 8139873 generic-all JShell tests failing -jdk/jshell/ExternalEditorTest.java 8170108 generic-all jdk/jshell/ToolFormatTest.java 8170216 solaris-sparcv9 jdk/jshell/ReplaceTest.java 8170216 solaris-sparcv9 +jdk/jshell/UserInputTest.java 8169536 generic-all ########################################################################### # # javac -tools/javac/Paths/AbsolutePathTest.java 8055768 generic-all ToolBox does not close opened files tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java 8057679 generic-all clarify error messages trying to annotate scoping tools/javac/annotations/typeAnnotations/failures/CantAnnotateScoping.java 8057679 generic-all clarify error messages trying to annotate scoping tools/javac/annotations/typeAnnotations/failures/CantAnnotateStaticClass2.java 8057679 generic-all clarify error messages trying to annotate scoping
--- a/langtools/test/jdk/jshell/CommandCompletionTest.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/jdk/jshell/CommandCompletionTest.java Tue Jan 17 15:27:22 2017 +0100 @@ -23,7 +23,7 @@ /* * @test - * @bug 8144095 8164825 8169818 8153402 + * @bug 8144095 8164825 8169818 8153402 8165405 * @summary Test Command Completion * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -138,7 +138,7 @@ @Test public void testEdit() { test(false, new String[]{"--no-startup"}, - a -> assertCompletion(a, "/e|", false, "/edit ", "/exit "), + a -> assertCompletion(a, "/e|", false, "/edit ", "/env ", "/exit "), a -> assertCompletion(a, "/ed|", false, "/edit "), a -> assertClass(a, "class cTest {}", "class", "cTest"), a -> assertMethod(a, "int mTest() { return 0; }", "()I", "mTest"), @@ -158,15 +158,17 @@ public void testHelp() { testNoStartUp( a -> assertCompletion(a, "/help |", false, - "/! ", "/-<n> ", "/<id> ", "/? ", "/classpath ", "/drop ", - "/edit ", "/exit ", "/help ", "/history ", "/imports ", + "/! ", "/-<n> ", "/<id> ", "/? ", "/drop ", + "/edit ", "/env ", "/exit ", + "/help ", "/history ", "/imports ", "/list ", "/methods ", "/open ", "/reload ", "/reset ", - "/save ", "/set ", "/types ", "/vars ", "intro ", "shortcuts "), + "/save ", "/set ", "/types ", "/vars ", "context ", "intro ", "shortcuts "), a -> assertCompletion(a, "/? |", false, - "/! ", "/-<n> ", "/<id> ", "/? ", "/classpath ", "/drop ", - "/edit ", "/exit ", "/help ", "/history ", "/imports ", + "/! ", "/-<n> ", "/<id> ", "/? ", "/drop ", + "/edit ", "/env ", "/exit ", + "/help ", "/history ", "/imports ", "/list ", "/methods ", "/open ", "/reload ", "/reset ", - "/save ", "/set ", "/types ", "/vars ", "intro ", "shortcuts "), + "/save ", "/set ", "/types ", "/vars ", "context ", "intro ", "shortcuts "), a -> assertCompletion(a, "/help /s|", false, "/save ", "/set "), a -> assertCompletion(a, "/help /set |", false, @@ -177,17 +179,63 @@ @Test public void testReload() { + String[] ropts = new String[] { "-add-exports ", "-add-modules ", + "-class-path ", "-module-path ", "-quiet ", "-restore " }; + String[] dropts = new String[] { "--add-exports ", "--add-modules ", + "--class-path ", "--module-path ", "--quiet ", "--restore " }; testNoStartUp( - a -> assertCompletion(a, "/reload |", false, "-quiet ", "-restore "), - a -> assertCompletion(a, "/reload -restore |", false, "-quiet"), - a -> assertCompletion(a, "/reload -quiet |", false, "-restore"), - a -> assertCompletion(a, "/reload -restore -quiet |", false) + a -> assertCompletion(a, "/reloa |", false, ropts), + a -> assertCompletion(a, "/relo |", false, ropts), + a -> assertCompletion(a, "/reload -|", false, ropts), + a -> assertCompletion(a, "/reload --|", false, dropts), + a -> assertCompletion(a, "/reload -restore |", false, ropts), + a -> assertCompletion(a, "/reload -restore --|", false, dropts), + a -> assertCompletion(a, "/reload -rest|", false, "-restore "), + a -> assertCompletion(a, "/reload --r|", false, "--restore "), + a -> assertCompletion(a, "/reload -q|", false, "-quiet "), + a -> assertCompletion(a, "/reload -add|", false, "-add-exports ", "-add-modules "), + a -> assertCompletion(a, "/reload -class-path . -quiet |", false, ropts) + ); + } + + @Test + public void testEnv() { + String[] ropts = new String[] { "-add-exports ", "-add-modules ", + "-class-path ", "-module-path " }; + String[] dropts = new String[] { "--add-exports ", "--add-modules ", + "--class-path ", "--module-path " }; + testNoStartUp( + a -> assertCompletion(a, "/env |", false, ropts), + a -> assertCompletion(a, "/env -|", false, ropts), + a -> assertCompletion(a, "/env --|", false, dropts), + a -> assertCompletion(a, "/env --a|", false, "--add-exports ", "--add-modules "), + a -> assertCompletion(a, "/env -add-|", false, "-add-exports ", "-add-modules "), + a -> assertCompletion(a, "/env -class-path . |", false, ropts), + a -> assertCompletion(a, "/env -class-path . --|", false, dropts) + ); + } + + @Test + public void testReset() { + String[] ropts = new String[] { "-add-exports ", "-add-modules ", + "-class-path ", "-module-path " }; + String[] dropts = new String[] { "--add-exports ", "--add-modules ", + "--class-path ", "--module-path " }; + testNoStartUp( + a -> assertCompletion(a, "/reset |", false, ropts), + a -> assertCompletion(a, "/res -m|", false, "-module-path "), + a -> assertCompletion(a, "/res -module-|", false, "-module-path "), + a -> assertCompletion(a, "/res --m|", false, "--module-path "), + a -> assertCompletion(a, "/res --module-|", false, "--module-path "), + a -> assertCompletion(a, "/reset -add|", false, "-add-exports ", "-add-modules "), + a -> assertCompletion(a, "/rese -class-path . |", false, ropts), + a -> assertCompletion(a, "/rese -class-path . --|", false, dropts) ); } @Test public void testVarsMethodsTypes() { - test(false, new String[]{"--no-startup"}, + testNoStartUp( a -> assertCompletion(a, "/v|", false, "/vars "), a -> assertCompletion(a, "/m|", false, "/methods "), a -> assertCompletion(a, "/t|", false, "/types "), @@ -245,9 +293,6 @@ @Test public void testClassPath() throws IOException { - testNoStartUp( - a -> assertCompletion(a, "/classp|", false, "/classpath ") - ); Compiler compiler = new Compiler(); Path outDir = compiler.getPath("testClasspathCompletion"); Files.createDirectories(outDir); @@ -259,8 +304,13 @@ compiler.jar(outDir, jarName, "pkg/A.class"); compiler.getPath(outDir).resolve(jarName); List<String> paths = listFiles(outDir, CLASSPATH_FILTER); + String[] pathArray = paths.toArray(new String[paths.size()]); testNoStartUp( - a -> assertCompletion(a, "/classpath " + outDir + "/|", false, paths.toArray(new String[paths.size()])) + a -> assertCompletion(a, "/env -class-path " + outDir + "/|", false, pathArray), + a -> assertCompletion(a, "/env --class-path " + outDir + "/|", false, pathArray), + a -> assertCompletion(a, "/env -clas " + outDir + "/|", false, pathArray), + a -> assertCompletion(a, "/env --class-p " + outDir + "/|", false, pathArray), + a -> assertCompletion(a, "/env --module-path . --class-p " + outDir + "/|", false, pathArray) ); } @@ -275,7 +325,7 @@ .collect(Collectors.toList()); } testNoStartUp( - a -> assertCompletion(a, "/classpath ~/|", false, completions.toArray(new String[completions.size()])) + a -> assertCompletion(a, "/env --class-path ~/|", false, completions.toArray(new String[completions.size()])) ); }
--- a/langtools/test/jdk/jshell/ToolBasicTest.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/jdk/jshell/ToolBasicTest.java Tue Jan 17 15:27:22 2017 +0100 @@ -23,7 +23,7 @@ /* * @test - * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953 8080347 8154714 8166649 8167643 8170162 8172102 + * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953 8080347 8154714 8166649 8167643 8170162 8172102 8165405 * @summary Tests for Basic tests for REPL tool * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -263,7 +263,8 @@ compiler.compile(outDir, "package pkg; public class A { public String toString() { return \"A\"; } }"); Path classpath = compiler.getPath(outDir); test( - (a) -> assertCommand(a, "/classpath " + classpath, String.format("| Path '%s' added to classpath", classpath)), + (a) -> assertCommand(a, "/env --class-path " + classpath, + "| Setting new options and restoring state."), (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A") ); test(new String[] { "--class-path", classpath.toString() }, @@ -279,7 +280,8 @@ compiler.jar(outDir, jarName, "pkg/A.class"); Path jarPath = compiler.getPath(outDir).resolve(jarName); test( - (a) -> assertCommand(a, "/classpath " + jarPath, String.format("| Path '%s' added to classpath", jarPath)), + (a) -> assertCommand(a, "/env --class-path " + jarPath, + "| Setting new options and restoring state."), (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A") ); test(new String[] { "--class-path", jarPath.toString() },
--- a/langtools/test/jdk/jshell/ToolReloadTest.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/jdk/jshell/ToolReloadTest.java Tue Jan 17 15:27:22 2017 +0100 @@ -24,7 +24,7 @@ /* * @test * @key intermittent - * @bug 8081845 8147898 8143955 + * @bug 8081845 8147898 8143955 8165405 * @summary Tests for /reload in JShell tool * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -70,8 +70,8 @@ compiler.compile(outDir, prog.apply("A")); Path classpath = compiler.getPath(outDir); test( - (a) -> assertCommand(a, "/classpath " + classpath, - String.format("| Path '%s' added to classpath", classpath)), + (a) -> assertCommand(a, "/env --class-path " + classpath, + "| Setting new options and restoring state."), (a) -> assertMethod(a, "String foo() { return (new pkg.A()).toString(); }", "()String", "foo"), (a) -> assertVariable(a, "String", "v", "foo()", "\"A\""), @@ -79,7 +79,6 @@ if (!a) compiler.compile(outDir, prog.apply("Aprime")); assertCommand(a, "/reload", "| Restarting and restoring state.\n" + - "-: /classpath " + classpath + "\n" + "-: String foo() { return (new pkg.A()).toString(); }\n" + "-: String v = foo();\n"); },
--- a/langtools/test/jdk/jshell/ToolSimpleTest.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/jdk/jshell/ToolSimpleTest.java Tue Jan 17 15:27:22 2017 +0100 @@ -23,7 +23,7 @@ /* * @test - * @bug 8153716 8143955 8151754 8150382 8153920 8156910 8131024 8160089 8153897 8167128 8154513 8170015 8170368 8172102 + * @bug 8153716 8143955 8151754 8150382 8153920 8156910 8131024 8160089 8153897 8167128 8154513 8170015 8170368 8172102 8172103 8165405 * @summary Simple jshell tool tests * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -196,7 +196,7 @@ @Test public void testEmptyClassPath() { - test(after -> assertCommand(after, "/classpath", "| The /classpath command requires a path argument.")); + test(after -> assertCommand(after, "/env --class-path", "| Argument to class-path missing.")); } @Test @@ -606,6 +606,13 @@ } @Test + public void testWrapSourceHandlerDiagCrash() { + test(new String[]{"--add-exports", "jdk.javadoc/ALL-UNNAMED"}, + (a) -> assertCommand(a, "1+1", "$1 ==> 2") + ); + } + + @Test public void test8156910() { test( (a) -> assertCommandOutputContains(a, "System.out.println(\"%5d\", 10);", "%5d"),
--- a/langtools/test/jdk/jshell/UserInputTest.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/jdk/jshell/UserInputTest.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ * @summary Verify that the user's code can read System.in * @build KullaTesting TestingInputStream * @run testng UserInputTest + * @key intermittent */ import java.io.IOException;
--- a/langtools/test/tools/doclint/tidy/util/Main.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/doclint/tidy/util/Main.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -154,6 +154,11 @@ errs += Integer.valueOf(m.group(2)); if (m.group(3) != null) overflow++; + } else if ((m = countPattern2.matcher(line)).matches()) { + warns += Integer.valueOf(m.group(1)); + errs += Integer.valueOf(m.group(2)); + if (m.group(3) != null) + overflow++; } else if ((m = guardPattern.matcher(line)).matches()) { boolean found = false; for (Pattern p: patterns) { @@ -183,6 +188,7 @@ Pattern okPattern = Pattern.compile("No warnings or errors were found."); Pattern countPattern = Pattern.compile("([0-9]+) warnings, ([0-9]+) errors were found!.*?(Not all warnings/errors were shown.)?"); + Pattern countPattern2 = Pattern.compile("Tidy found ([0-9]+) warning[s]? and ([0-9]+) error[s]?!.*?(Not all warnings/errors were shown.)?"); Pattern cssPattern = Pattern.compile("You are recommended to use CSS.*"); Pattern guardPattern = Pattern.compile("line [0-9]+ column [0-9]+ - (Error|Warning):.*"); @@ -221,7 +227,11 @@ Pattern.compile(".*Warning: trimming empty <.*>"), Pattern.compile(".*Warning: unescaped & or unknown entity \".*\""), Pattern.compile(".*Warning: unescaped & which should be written as &"), - Pattern.compile(".*Warning: using <br> in place of <p>") + Pattern.compile(".*Warning: using <br> in place of <p>"), + Pattern.compile(".*Warning: <.*> element removed from HTML5"), + Pattern.compile(".*Warning: <.*> attribute \".*\" not allowed for HTML5"), + Pattern.compile(".*Warning: The summary attribute on the <table> element is obsolete in HTML5"), + Pattern.compile(".*Warning: replacing invalid UTF-8 bytes \\(char. code U\\+.*\\)") }; int files;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/inference/CaptureGLB1.java Tue Jan 17 15:27:22 2017 +0100 @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8144066 + * @summary GLB of two lower-bounded capture variables, bounded by related array types + * @compile CaptureGLB1.java + */ + +public class CaptureGLB1 { + + interface A<T> { } + + Exception[] bar(A<? super Exception[]> x, A<? super Throwable[]> y){ + return foo(x, y); + } + + <T> T foo(A<? super T> x, A<? super T> y){ + return null; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/inference/CaptureGLB2.java Tue Jan 17 15:27:22 2017 +0100 @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8144066 + * @summary GLB of two lower-bounded capture variables, bounded by related wildcard-parameterized types + * @compile CaptureGLB2.java + */ + +public class CaptureGLB2 { + + interface A<T> { } + + Class<?> bar(A<? super Class<? extends Exception>> x, A<? super Class<? extends Throwable>> y){ + return foo(x, y); + } + + <T> T foo(A<? super T> x, A<? super T> y){ + return null; + } +}
--- a/langtools/test/tools/javac/lambda/MostSpecific09.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/lambda/MostSpecific09.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,6 +1,6 @@ /* * @test /nodynamiccopyright/ - * @bug 8029718 + * @bug 8029718 8065800 * @summary Should always use lambda body structure to disambiguate overload resolution * @compile/fail/ref=MostSpecific09.out -XDrawDiagnostics --should-stop:at=ATTR --debug:verboseResolution=applicable,success MostSpecific09.java */
--- a/langtools/test/tools/javac/lambda/MostSpecific09.out Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/lambda/MostSpecific09.out Tue Jan 17 15:27:22 2017 +0100 @@ -2,16 +2,16 @@ MostSpecific09.java:26:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.I), null)} MostSpecific09.java:27:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.J), null)} MostSpecific09.java:27:32: compiler.note.verbose.resolve.multi: println, java.io.PrintStream, 1, BASIC, java.lang.String, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, println(java.lang.Object), null),(compiler.misc.applicable.method.found: 1, println(java.lang.String), null)} -MostSpecific09.java:28:13: compiler.err.lambda.body.neither.value.nor.void.compatible -MostSpecific09.java:28:9: compiler.err.cant.apply.symbols: kindname.method, foo, @682,{(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.I), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.missing.ret.val: java.lang.String)))),(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.J), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.unexpected.ret.val)))} +MostSpecific09.java:28:20: compiler.err.lambda.body.neither.value.nor.void.compatible +MostSpecific09.java:28:9: compiler.err.cant.apply.symbols: kindname.method, foo, @690,{(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.I), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.missing.ret.val: java.lang.String)))),(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.J), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.unexpected.ret.val)))} MostSpecific09.java:28:43: compiler.note.verbose.resolve.multi: println, java.io.PrintStream, 1, BASIC, java.lang.String, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, println(java.lang.Object), null),(compiler.misc.applicable.method.found: 1, println(java.lang.String), null)} MostSpecific09.java:29:9: compiler.err.ref.ambiguous: foo, kindname.method, foo(MostSpecific09.I), MostSpecific09, kindname.method, foo(MostSpecific09.J), MostSpecific09 MostSpecific09.java:29:28: compiler.note.verbose.resolve.multi: <init>, java.lang.RuntimeException, 0, BASIC, compiler.misc.no.args, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, java.lang.RuntimeException(), null)} MostSpecific09.java:30:9: compiler.err.ref.ambiguous: foo, kindname.method, foo(MostSpecific09.I), MostSpecific09, kindname.method, foo(MostSpecific09.J), MostSpecific09 MostSpecific09.java:32:9: compiler.err.ref.ambiguous: foo, kindname.method, foo(MostSpecific09.I), MostSpecific09, kindname.method, foo(MostSpecific09.J), MostSpecific09 MostSpecific09.java:33:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.I), null)} -MostSpecific09.java:42:13: compiler.err.lambda.body.neither.value.nor.void.compatible -MostSpecific09.java:42:9: compiler.err.cant.apply.symbols: kindname.method, foo, @1131,{(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.I), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.missing.ret.val: java.lang.String)))),(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.J), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.unexpected.ret.val)))} +MostSpecific09.java:42:20: compiler.err.lambda.body.neither.value.nor.void.compatible +MostSpecific09.java:42:9: compiler.err.cant.apply.symbols: kindname.method, foo, @1139,{(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.I), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.missing.ret.val: java.lang.String)))),(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.J), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.unexpected.ret.val)))} MostSpecific09.java:46:23: compiler.note.verbose.resolve.multi: println, java.io.PrintStream, 1, BASIC, java.lang.String, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, println(java.lang.Object), null),(compiler.misc.applicable.method.found: 1, println(java.lang.String), null)} MostSpecific09.java:49:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.J), null)} MostSpecific09.java:56:25: compiler.note.verbose.resolve.multi: <init>, Bar, 0, BASIC, compiler.misc.no.args, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, Bar(), null)}
--- a/langtools/test/tools/javac/lambda/MostSpecific10.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/lambda/MostSpecific10.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,13 @@ * @test * @bug 8034223 * @summary Structural most-specific logic for lambdas, method refs, parens, and conditionals - * @compile MostSpecific10.java */ -class MostSpecific10 { + +public class MostSpecific10 { + + public static void main(String[] args) { + new MostSpecific10().test(true); + } interface GetInt { int get(); @@ -38,7 +42,9 @@ } void m(GetInt getter) {} - void m(GetInteger getter) {} + void m(GetInteger getter) { + throw new AssertionError("Less-specific method invocation: " + getter.getClass()); + } void test(boolean cond) { m(() -> 23);
--- a/langtools/test/tools/javac/lambda/MostSpecific11.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/lambda/MostSpecific11.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,14 +25,19 @@ * @test * @bug 8034223 * @summary Return type Object is not more specific than return type String - * @compile MostSpecific11.java */ -class MostSpecific11 { +public class MostSpecific11 { + + public static void main(String[] args) { + new MostSpecific11().test(); + } interface I { Object run(); } interface J { String run(); } - void m(I arg) {} + void m(I arg) { + throw new RuntimeException("Less-specific method invocation."); + } void m(J arg) {} void test() {
--- a/langtools/test/tools/javac/lambda/MostSpecific15.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/lambda/MostSpecific15.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,18 @@ * @test * @bug 8143852 * @summary Rename functional interface method type parameters during most specific test - * @compile MostSpecific15.java */ -class MostSpecific15 { +public class MostSpecific15 { + public static void main(String[] args) { + new MostSpecific15().test(); + } + interface F1 { <X> Object apply(X arg); } interface F2 { <Y> String apply(Y arg); } - static void m1(F1 f) {} + static void m1(F1 f) { + throw new AssertionError("Less-specific method invocation."); + } static void m1(F2 f) {} static String foo(Object in) { return "a"; } @@ -39,5 +44,4 @@ void test() { m1(MostSpecific15::foo); } - -} \ No newline at end of file +}
--- a/langtools/test/tools/javac/lambda/MostSpecific17.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/lambda/MostSpecific17.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,12 @@ * @test * @bug 8143852 * @summary Rename functional interface method type parameters during most specific test - * @compile MostSpecific17.java */ -class MostSpecific17 { +public class MostSpecific17 { + + public static void main(String[] args) { + new MostSpecific17().test(); + } interface A<T> {} interface B<T> extends A<T> {} @@ -35,7 +38,9 @@ interface F1 { <X> A<? super X> apply(Object arg); } interface F2 { <Y> B<? super Y> apply(Object arg); } - static void m1(F1 f) {} + static void m1(F1 f) { + throw new AssertionError("Less-specific method invocation."); + } static void m1(F2 f) {} static B<Object> foo(Object in) { return null; } @@ -43,5 +48,4 @@ void test() { m1(MostSpecific17::foo); } - -} \ No newline at end of file +}
--- a/langtools/test/tools/javac/lambda/MostSpecific18.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/lambda/MostSpecific18.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,18 @@ * @test * @bug 8143852 * @summary Test that generic function interface method bounds are the same - * @compile MostSpecific18.java */ -class MostSpecific18 { +public class MostSpecific18 { + public static void main(String[] args) { + new MostSpecific18().test(); + } + interface F1 { <X extends Number> Object apply(X arg); } interface F2 { <Y extends Number> String apply(Y arg); } - static void m1(F1 f) {} + static void m1(F1 f) { + throw new AssertionError("Less-specific method invocation."); + } static void m1(F2 f) {} static String foo(Object in) { return "a"; } @@ -39,5 +44,4 @@ void test() { m1(MostSpecific18::foo); } - -} \ No newline at end of file +}
--- a/langtools/test/tools/javac/lambda/MostSpecific20.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/lambda/MostSpecific20.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,18 @@ * @test * @bug 8143852 * @summary Test that generic function interface method bounds are the same - * @compile MostSpecific20.java */ -class MostSpecific20 { +public class MostSpecific20 { + public static void main(String[] args) { + new MostSpecific20().test(); + } + interface F1 { <X extends Iterable<X>> Object apply(X arg); } interface F2 { <Y extends Iterable<Y>> String apply(Y arg); } - static void m1(F1 f) {} + static void m1(F1 f) { + throw new AssertionError("Less-specific method invocation."); + } static void m1(F2 f) {} static String foo(Object in) { return "a"; } @@ -39,5 +44,4 @@ void test() { m1(MostSpecific20::foo); } - -} \ No newline at end of file +}
--- a/langtools/test/tools/javac/lambda/MostSpecific22.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/lambda/MostSpecific22.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,19 @@ * @test * @bug 8143852 * @summary Most specific inference constraints derived from both functional interface method parameters and tparam bounds - * @compile MostSpecific22.java */ -class MostSpecific22 { + +public class MostSpecific22 { + public static void main(String[] args) { + new MostSpecific22().test(); + } + interface F1<T> { <X extends T> Object apply(T arg); } interface F2 { <Y extends Number> String apply(Number arg); } - static <T> T m1(F1<T> f) { return null; } + static <T> T m1(F1<T> f) { + throw new AssertionError("Less-specific method invocation."); + } static Object m1(F2 f) { return null; } static String foo(Object in) { return "a"; } @@ -40,4 +46,4 @@ m1(MostSpecific22::foo); } -} \ No newline at end of file +}
--- a/langtools/test/tools/javac/lambda/MostSpecific27.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/lambda/MostSpecific27.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,18 @@ * @test * @bug 8143852 * @summary Most specific inference constraints derived from intersection bound - * @compile MostSpecific27.java */ -class MostSpecific27 { +public class MostSpecific27 { + public static void main(String[] args) { + new MostSpecific27().test(); + } + interface F1<T> { <X extends Iterable<T> & Runnable> Object apply(T arg); } interface F2 { <Y extends Iterable<Number> & Runnable> String apply(Number arg); } - static <T> T m1(F1<T> f) { return null; } + static <T> T m1(F1<T> f) { + throw new AssertionError("Less-specific method invocation."); + } static Object m1(F2 f) { return null; } static String foo(Object in) { return "a"; } @@ -40,4 +45,4 @@ m1(MostSpecific27::foo); } -} \ No newline at end of file +}
--- a/langtools/test/tools/javac/lambda/MostSpecific29.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/lambda/MostSpecific29.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,15 +25,20 @@ * @test * @bug 8144767 * @summary Correct most-specific test when wildcards appear in functional interface type - * @compile MostSpecific29.java */ -class MostSpecific29 { +public class MostSpecific29 { + + public static void main(String[] args) { + new MostSpecific29().test(); + } interface Pred<T> { boolean test(T arg); } interface Fun<T,R> { R apply(T arg); } static void m1(Pred<? super Integer> f) {} - static void m1(Fun<Integer, Boolean> f) {} + static void m1(Fun<Integer, Boolean> f) { + throw new AssertionError("Less-specific method invocation."); + } void test() { m1((Integer n) -> true);
--- a/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java Tue Jan 17 15:27:22 2017 +0100 @@ -1,33 +1,9 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test + * @test /nodynamiccopyright/ * @bug 8024947 * @summary javac should issue the potentially ambiguous overload warning only * where the problem appears * @compile/fail/ref=PotentiallyAmbiguousWarningTest.out -XDrawDiagnostics -Werror -Xlint:overloads PotentiallyAmbiguousWarningTest.java - * @compile PotentiallyAmbiguousWarningTest.java */ import java.util.function.*;
--- a/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.out Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.out Tue Jan 17 15:27:22 2017 +0100 @@ -1,9 +1,9 @@ -PotentiallyAmbiguousWarningTest.java:39:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.Consumer<java.lang.Integer>), PotentiallyAmbiguousWarningTest.I1, foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.I1 -PotentiallyAmbiguousWarningTest.java:45:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.Consumer<java.lang.Integer>), PotentiallyAmbiguousWarningTest.C1, foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.C1 -PotentiallyAmbiguousWarningTest.java:55:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.J1, foo(java.util.function.Consumer<java.lang.Integer>), PotentiallyAmbiguousWarningTest.I2 -PotentiallyAmbiguousWarningTest.java:72:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.D1, foo(java.util.function.Consumer<java.lang.Integer>), PotentiallyAmbiguousWarningTest.C2 -PotentiallyAmbiguousWarningTest.java:78:21: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.C3, foo(java.util.function.Consumer<java.lang.Integer>), PotentiallyAmbiguousWarningTest.C3 -PotentiallyAmbiguousWarningTest.java:95:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.Consumer<java.lang.Integer>), PotentiallyAmbiguousWarningTest.J2, foo(T), PotentiallyAmbiguousWarningTest.I5 +PotentiallyAmbiguousWarningTest.java:15:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.Consumer<java.lang.Integer>), PotentiallyAmbiguousWarningTest.I1, foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.I1 +PotentiallyAmbiguousWarningTest.java:21:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.Consumer<java.lang.Integer>), PotentiallyAmbiguousWarningTest.C1, foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.C1 +PotentiallyAmbiguousWarningTest.java:31:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.J1, foo(java.util.function.Consumer<java.lang.Integer>), PotentiallyAmbiguousWarningTest.I2 +PotentiallyAmbiguousWarningTest.java:48:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.D1, foo(java.util.function.Consumer<java.lang.Integer>), PotentiallyAmbiguousWarningTest.C2 +PotentiallyAmbiguousWarningTest.java:54:21: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.C3, foo(java.util.function.Consumer<java.lang.Integer>), PotentiallyAmbiguousWarningTest.C3 +PotentiallyAmbiguousWarningTest.java:71:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.Consumer<java.lang.Integer>), PotentiallyAmbiguousWarningTest.J2, foo(T), PotentiallyAmbiguousWarningTest.I5 - compiler.err.warnings.and.werror 1 error 6 warnings
--- a/langtools/test/tools/javac/modules/AnnotationProcessing.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/javac/modules/AnnotationProcessing.java Tue Jan 17 15:27:22 2017 +0100 @@ -23,7 +23,7 @@ /** * @test - * @bug 8133884 8162711 8133896 + * @bug 8133884 8162711 8133896 8172158 * @summary Verify that annotation processing works. * @library /tools/lib * @modules @@ -979,6 +979,38 @@ } } + @Test + public void testDisambiguateAnnotationsNoModules(Path base) throws Exception { + Path classes = base.resolve("classes"); + + Files.createDirectories(classes); + + Path src = base.resolve("src"); + + tb.writeJavaFiles(src, + "package api; public @interface A {}", + "package api; public @interface B {}", + "package impl; import api.*; @A @B public class T {}"); + + List<String> log = new JavacTask(tb) + .options("-processor", SelectAnnotationATestAP.class.getName() + "," + SelectAnnotationBTestAP.class.getName(), + "-source", "8", "-target", "8") + .outdir(classes) + .files(findJavaFiles(src)) + .run() + .writeAll() + .getOutputLines(OutputKind.STDERR); + + List<String> expected = Arrays.asList("SelectAnnotationATestAP", + "SelectAnnotationBTestAP", + "SelectAnnotationATestAP", + "SelectAnnotationBTestAP"); + + if (!expected.equals(log)) { + throw new AssertionError("Output does not match; output: " + log); + } + } + @SupportedAnnotationTypes("m2x/api.A") public static final class SelectAnnotationATestAP extends AbstractProcessor {
--- a/langtools/test/tools/jdeps/listdeps/ListModuleDeps.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/jdeps/listdeps/ListModuleDeps.java Tue Jan 17 15:27:22 2017 +0100 @@ -83,6 +83,28 @@ )); } + @DataProvider(name = "jdkModules") + public Object[][] jdkModules() { + return new Object[][]{ + {"jdk.compiler", new String[]{ + "java.base/sun.reflect.annotation", + "java.compiler", + } + }, + }; + } + + @Test(dataProvider = "jdkModules") + public void testJDKModule(String moduleName, String[] expected) { + JdepsRunner jdeps = JdepsRunner.run( + "--list-deps", "-m", moduleName + ); + String[] output = Arrays.stream(jdeps.output()) + .map(s -> s.trim()) + .toArray(String[]::new); + assertEquals(output, expected); + } + @Test(dataProvider = "listdeps") public void testListDeps(Path classes, String[] expected) { JdepsRunner jdeps = JdepsRunner.run(
--- a/langtools/test/tools/jdeps/modules/CheckModuleTest.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/jdeps/modules/CheckModuleTest.java Tue Jan 17 15:27:22 2017 +0100 @@ -57,6 +57,7 @@ private static final Set<String> modules = Set.of("unsafe", "mIV", "mV", "mVI", "mVII", "mVIII"); private static final String JAVA_BASE = "java.base"; + private static final String JAVA_COMPILER = "java.compiler"; /** * Compiles classes used by the test @@ -73,6 +74,8 @@ return new Object[][] { { JAVA_BASE, new ModuleMetaData(JAVA_BASE) }, + { JAVA_COMPILER, new ModuleMetaData(JAVA_BASE) + }, }; };
--- a/langtools/test/tools/jdeps/modules/InverseDeps.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/jdeps/modules/InverseDeps.java Tue Jan 17 15:27:22 2017 +0100 @@ -26,7 +26,9 @@ * @summary Tests split packages * @library ../lib * @build CompilerUtils JdepsUtil - * @modules jdk.jdeps/com.sun.tools.jdeps + * @modules java.logging + * jdk.jdeps/com.sun.tools.jdeps + * jdk.unsupported * @run testng InverseDeps */ @@ -87,6 +89,44 @@ } } } + @DataProvider(name = "jdkModules") + public Object[][] jdkModules() { + return new Object[][]{ + // --require and a subset of dependences + { "jdk.compiler", new String[][] { + new String[] {"jdk.compiler", "jdk.jshell"}, + new String[] {"jdk.compiler", "jdk.rmic"}, + new String[] {"jdk.compiler", "jdk.javadoc", "jdk.rmic"}, + } + }, + { "java.compiler", new String[][] { + new String[] {"java.compiler", "jdk.jshell"}, + new String[] {"java.compiler", "jdk.compiler", "jdk.jshell"}, + new String[] {"java.compiler", "jdk.compiler", "jdk.rmic"}, + new String[] {"java.compiler", "jdk.compiler", "jdk.javadoc", "jdk.rmic"}, + new String[] {"java.compiler", "java.se", "java.se.ee"}, + } + }, + }; + } + + @Test(dataProvider = "jdkModules") + public void testJDKModule(String moduleName, String[][] expected) throws Exception { + // this invokes the jdeps launcher so that all system modules are observable + JdepsRunner jdeps = JdepsRunner.run( + "--inverse", "--require", moduleName + ); + List<String> output = Arrays.stream(jdeps.output()) + .map(s -> s.trim()) + .collect(Collectors.toList()); + + // verify the dependences + assertTrue(Arrays.stream(expected) + .map(path -> Arrays.stream(path) + .collect(Collectors.joining(" <- "))) + .anyMatch(output::contains)); + } + @DataProvider(name = "testrequires") public Object[][] expected1() {
--- a/langtools/test/tools/jdeps/modules/SplitPackage.java Fri Jan 13 16:49:34 2017 -0500 +++ b/langtools/test/tools/jdeps/modules/SplitPackage.java Tue Jan 17 15:27:22 2017 +0100 @@ -63,10 +63,15 @@ @Test public void runTest() throws Exception { + // split package detected if java.annotation.common is in the root set + runTest(JAVA_ANNOTATIONS_COMMON, SPLIT_PKG_NAME); + runTest("ALL-SYSTEM", SPLIT_PKG_NAME); + // default + runTest(null, SPLIT_PKG_NAME); + // Test jdeps classes - runTest(null); - // Test jdeps --add-modules - runTest(JAVA_ANNOTATIONS_COMMON, SPLIT_PKG_NAME); + runTest("ALL-DEFAULT"); + } private void runTest(String root, String... splitPackages) throws Exception {
--- a/make/CopyImportModules.gmk Fri Jan 13 16:49:34 2017 -0500 +++ b/make/CopyImportModules.gmk Tue Jan 17 15:27:22 2017 +0100 @@ -67,14 +67,17 @@ # or risk invalidating the build output from external changes. ifeq ($(filter $(OUTPUT_ROOT)/%, $(LIBS_DIR)), ) LINK_MACRO := install-file + LOG_ACTION := Copying else LINK_MACRO := link-file-relative + LOG_ACTION := Creating symlink endif $(eval $(call SetupCopyFiles, LINK_LIBS, \ SRC := $(LIBS_DIR), \ DEST := $(JDK_OUTPUTDIR)/lib, \ FILES := $(filter-out %$(SHARED_LIBRARY_SUFFIX), $(call CacheFind, $(LIBS_DIR))), \ MACRO := $(LINK_MACRO), \ + LOG_ACTION := $(LOG_ACTION), \ )) TARGETS += $(COPY_LIBS) $(LINK_LIBS) endif
--- a/make/Main.gmk Fri Jan 13 16:49:34 2017 -0500 +++ b/make/Main.gmk Tue Jan 17 15:27:22 2017 +0100 @@ -630,13 +630,12 @@ # in javadoc. java.desktop-gensrc-jdk: java.base-gensrc - # The annotation processing for jdk.vm.ci needs java.base classes from the - # current JDK. - jdk.vm.ci-gensrc-hotspot: java.base-java - - # The annotation processing for jdk.vm.compiler needs classes from the current JDK. - jdk.vm.compiler-gensrc-hotspot: java.base-java java.management-java \ - jdk.management-java jdk.vm.ci-java jdk.unsupported-java + # The annotation processing for jdk.vm.ci and jdk.vm.compiler needs classes + # from the current JDK. + jdk.vm.ci-gensrc-hotspot: $(addsuffix -java, \ + $(call FindTransitiveDepsForModule, jdk.vm.ci)) + jdk.vm.compiler-gensrc-hotspot: $(addsuffix -java, \ + $(call FindTransitiveDepsForModule, jdk.vm.compiler)) # For jdk.vm.compiler, the gensrc step is generating a module-info.java.extra # file to be processed by the gensrc-moduleinfo target.
--- a/make/ModuleWrapper.gmk Fri Jan 13 16:49:34 2017 -0500 +++ b/make/ModuleWrapper.gmk Tue Jan 17 15:27:22 2017 +0100 @@ -76,6 +76,7 @@ $(filter $(SUPPORT_OUTPUTDIR)/modules_libs/$(MODULE)/%, \ $(TARGETS))), \ MACRO := link-file-relative, \ + LOG_ACTION := Creating symlink, \ )) endif
--- a/make/common/MakeBase.gmk Fri Jan 13 16:49:34 2017 -0500 +++ b/make/common/MakeBase.gmk Tue Jan 17 15:27:22 2017 +0100 @@ -694,8 +694,9 @@ # 2 : Dest file # 3 : Variable to add targets to # 4 : Macro to call for copy operation + # 5 : Action text to log $2: $1 - $$(call LogInfo, Copying $$(patsubst $(OUTPUT_ROOT)/%,%,$$@)) + $$(call LogInfo, $(strip $5) $$(patsubst $(OUTPUT_ROOT)/%,%,$$@)) $$($$(strip $4)) $3 += $2 @@ -721,6 +722,7 @@ # Default is 'install-file' # NAME_MACRO : Optionally supply a macro that rewrites the target file name # based on the source file name +# LOG_ACTION : Optionally specify a different action text for log messages SetupCopyFiles = $(NamedParamsMacroTemplate) define SetupCopyFilesBody @@ -737,6 +739,10 @@ $1_NAME_MACRO := identity endif + ifeq ($$($1_LOG_ACTION), ) + $1_LOG_ACTION := Copying + endif + # Remove any trailing slash from SRC and DEST $1_SRC := $$(patsubst %/,%,$$($1_SRC)) $1_DEST := $$(patsubst %/,%,$$($1_DEST)) @@ -744,7 +750,7 @@ $$(foreach f, $$(patsubst $$($1_SRC)/%,%,$$($1_FILES)), \ $$(eval $$(call AddFileToCopy, $$($1_SRC)/$$f, \ $$($1_DEST)/$$(call $$(strip $$($1_NAME_MACRO)),$$(if $$($1_FLATTEN),$$(notdir $$f),$$f)), \ - $1, $$($1_MACRO)))) + $1, $$($1_MACRO), $$($1_LOG_ACTION)))) endef
--- a/nashorn/.hgtags Fri Jan 13 16:49:34 2017 -0500 +++ b/nashorn/.hgtags Tue Jan 17 15:27:22 2017 +0100 @@ -384,3 +384,4 @@ 0a4bc2f049132ddc20985565bb41b2be8a458dda jdk-9+148 c281306d33d83c92e0d870ace385d5f99678d7e7 jdk-9+149 ace1d994bca775d6545a4c874ae73d1dfc9ec18b jdk-9+150 +2a0437036a64853334e538044eb68d2df70075fa jdk-9+151
--- a/nashorn/README Fri Jan 13 16:49:34 2017 -0500 +++ b/nashorn/README Tue Jan 17 15:27:22 2017 +0100 @@ -24,33 +24,33 @@ You can clone Nashorn Mercurial forest using this command: - hg fclone http://hg.openjdk.java.net/nashorn/jdk8 nashorn~jdk8 + hg fclone http://hg.openjdk.java.net/nashorn/jdk9 nashorn~jdk9 To update your copy of the forest (fwith the latest code: - (cd nashorn~jdk8 ; hg fpull) + (cd nashorn~jdk9 ; hg fpull) Or just the nashorn subdirectory with - (cd nashorn~jdk8/nashorn ; hg pull -u) + (cd nashorn~jdk9/nashorn ; hg pull -u) To learn about Mercurial in detail, please visit http://hgbook.red-bean.com. - How to build? -To build Nashorn, you need to install JDK 8. You may use the Nashorn +To build Nashorn, you need to install JDK 9. You may use the Nashorn forest build (recommended) or down load from java.net. You will need to set JAVA_HOME environmental variable to point to your JDK installation directory. - cd nashorn~jdk8/nashorn/make + cd nashorn~jdk9/nashorn/make ant clean; ant - How to run? Use the jjs script (see RELESE_README): - cd nashorn~jdk8/nashorn + cd nashorn~jdk9/nashorn sh bin/jjs <your .js file> Nashorn supports javax.script API. It is possible to drop nashorn.jar in @@ -64,7 +64,7 @@ Comprehensive development documentation is found in the Nashorn JavaDoc. You can build it using: - cd nashorn~jdk8/nashorn/make + cd nashorn~jdk9/nashorn/make ant javadoc after which you can view the generated documentation at dist/javadoc/index.html. @@ -90,7 +90,7 @@ test/script/external/test262 a symbolic link to that directory. After you've done this, you can run the ECMA-262 tests using: - cd nashorn~jdk8/nashorn/make + cd nashorn~jdk9/nashorn/make ant test262 Ant target to get/update external test suites: @@ -101,7 +101,7 @@ These tests take time, so we have a parallelized runner for them that takes advantage of all processor cores on the computer: - cd nashorn~jdk8/nashorn/make + cd nashorn~jdk9/nashorn/make ant test262parallel - How to write your own test?
--- a/nashorn/RELEASE_README Fri Jan 13 16:49:34 2017 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -The Nashorn repo is in the process of being migrated to OpenJDK and as such is -incomplete in several areas. - -- The build system is not fully integrated. When complete, Nashorn will be -installed in its proper location in the JRE. - -- Once integrated, the correct version of the JDK will be wrapped around -Nashorn. In the meantime, ensure you use JDK8 b68 or later. - -- The jjs tool has not been implemented in binary form yet. Use "sh bin/jjs" -(or bin/jjs.bat on windows) in the interm. - -- The Dynalink component is not fully integrated into Nashorn as yet, but will -be when details are finalized. - -- And, finally Nashorn is still in development. To stay up to date, subscribe -to nashorn-dev@openjdk.java.net at - - http://mail.openjdk.java.net/mailman/listinfo/nashorn-dev. -
--- a/nashorn/make/build.xml Fri Jan 13 16:49:34 2017 -0500 +++ b/nashorn/make/build.xml Tue Jan 17 15:27:22 2017 +0100 @@ -267,7 +267,7 @@ <!-- generate javadoc for Nashorn classes --> <target name="javadoc" depends="jar"> - <javadoc destdir="${dist.javadoc.dir}" use="yes" overview="${nashorn.module.src.dir}/overview.html" + <javadoc destdir="${dist.javadoc.dir}" use="yes" windowtitle="${nashorn.product.name} ${nashorn.version}" additionalparam="-quiet" failonerror="true" useexternalfile="true"> <arg value="--module-source-path"/> @@ -285,7 +285,7 @@ <!-- generate javadoc only for nashorn extension api classes --> <target name="nashornapi" depends="jar"> <mkdir dir="${dist.nashornapi.javadoc.dir}"/> - <javadoc destdir="${dist.nashornapi.javadoc.dir}" use="yes" overview="${nashorn.module.src.dir}/overview.html" + <javadoc destdir="${dist.nashornapi.javadoc.dir}" use="yes" extdirs="${nashorn.ext.path}" windowtitle="${nashorn.product.name} ${nashorn.version}" additionalparam="-quiet" failonerror="true" useexternalfile="true"> <arg value="--module-source-path"/>
--- a/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/package-info.java Fri Jan 13 16:49:34 2017 -0500 +++ b/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/package-info.java Tue Jan 17 15:27:22 2017 +0100 @@ -82,197 +82,6 @@ */ /** - * <p> - * Dynalink is a library for dynamic linking of high-level operations on objects. - * These operations include "read a property", - * "write a property", "invoke a function" and so on. Dynalink is primarily - * useful for implementing programming languages where at least some expressions - * have dynamic types (that is, types that can not be decided statically), and - * the operations on dynamic types are expressed as - * {@link java.lang.invoke.CallSite call sites}. These call sites will be - * linked to appropriate target {@link java.lang.invoke.MethodHandle method handles} - * at run time based on actual types of the values the expressions evaluated to. - * These can change between invocations, necessitating relinking the call site - * multiple times to accommodate new types; Dynalink handles all that and more. - * <p> - * Dynalink supports implementation of programming languages with object models - * that differ (even radically) from the JVM's class-based model and have their - * custom type conversions. - * <p> - * Dynalink is closely related to, and relies on, the {@link java.lang.invoke} - * package. - * <p> - * - * While {@link java.lang.invoke} provides a low level API for dynamic linking - * of {@code invokedynamic} call sites, it does not provide a way to express - * higher level operations on objects, nor methods that implement them. These - * operations are the usual ones in object-oriented environments: property - * access, access of elements of collections, invocation of methods and - * constructors (potentially with multiple dispatch, e.g. link- and run-time - * equivalents of Java overloaded method resolution). These are all functions - * that are normally desired in a language on the JVM. If a language is - * statically typed and its type system matches that of the JVM, it can - * accomplish this with use of the usual invocation, field access, etc. - * instructions (e.g. {@code invokevirtual}, {@code getfield}). However, if the - * language is dynamic (hence, types of some expressions are not known until - * evaluated at run time), or its object model or type system don't match - * closely that of the JVM, then it should use {@code invokedynamic} call sites - * instead and let Dynalink manage them. - * <h2>Example</h2> - * Dynalink is probably best explained by an example showing its use. Let's - * suppose you have a program in a language where you don't have to declare the - * type of an object and you want to access a property on it: - * <pre> - * var color = obj.color; - * </pre> - * If you generated a Java class to represent the above one-line program, its - * bytecode would look something like this: - * <pre> - * aload 2 // load "obj" on stack - * invokedynamic "GET:PROPERTY:color"(Object)Object // invoke property getter on object of unknown type - * astore 3 // store the return value into local variable "color" - * </pre> - * In order to link the {@code invokedynamic} instruction, we need a bootstrap - * method. A minimalist bootstrap method with Dynalink could look like this: - * <pre> - * import java.lang.invoke.*; - * import jdk.dynalink.*; - * import jdk.dynalink.support.*; - * - * class MyLanguageRuntime { - * private static final DynamicLinker dynamicLinker = new DynamicLinkerFactory().createLinker(); - * - * public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) { - * return dynamicLinker.link( - * new SimpleRelinkableCallSite( - * new CallSiteDescriptor(lookup, parseOperation(name), type))); - * } - * - * private static Operation parseOperation(String name) { - * ... - * } - * } - * </pre> - * There are several objects of significance in the above code snippet: - * <ul> - * <li>{@link jdk.dynalink.DynamicLinker} is the main object in Dynalink, it - * coordinates the linking of call sites to method handles that implement the - * operations named in them. It is configured and created using a - * {@link jdk.dynalink.DynamicLinkerFactory}.</li> - * <li>When the bootstrap method is invoked, it needs to create a - * {@link java.lang.invoke.CallSite} object. In Dynalink, these call sites need - * to additionally implement the {@link jdk.dynalink.RelinkableCallSite} - * interface. "Relinkable" here alludes to the fact that if the call site - * encounters objects of different types at run time, its target will be changed - * to a method handle that can perform the operation on the newly encountered - * type. {@link jdk.dynalink.support.SimpleRelinkableCallSite} and - * {@link jdk.dynalink.support.ChainedCallSite} (not used in the above example) - * are two implementations already provided by the library.</li> - * <li>Dynalink uses {@link jdk.dynalink.CallSiteDescriptor} objects to - * preserve the parameters to the bootstrap method: the lookup and the method type, - * as it will need them whenever it needs to relink a call site.</li> - * <li>Dynalink uses {@link jdk.dynalink.Operation} objects to express - * dynamic operations. It does not prescribe how would you encode the operations - * in your call site, though. That is why in the above example the - * {@code parseOperation} function is left empty, and you would be expected to - * provide the code to parse the string {@code "GET:PROPERTY:color"} - * in the call site's name into a named property getter operation object as - * {@code StandardOperation.GET.withNamespace(StandardNamespace.PROPERTY).named("color")}. - * </ul> - * <p>What can you already do with the above setup? {@code DynamicLinkerFactory} - * by default creates a {@code DynamicLinker} that can link Java objects with the - * usual Java semantics. If you have these three simple classes: - * <pre> - * public class A { - * public String color; - * public A(String color) { this.color = color; } - * } - * - * public class B { - * private String color; - * public B(String color) { this.color = color; } - * public String getColor() { return color; } - * } - * - * public class C { - * private int color; - * public C(int color) { this.color = color; } - * public int getColor() { return color; } - * } - * </pre> - * and you somehow create their instances and pass them to your call site in your - * programming language: - * <pre> - * for each(var obj in [new A("red"), new B("green"), new C(0x0000ff)]) { - * print(obj.color); - * } - * </pre> - * then on first invocation, Dynalink will link the {@code .color} getter - * operation to a field getter for {@code A.color}, on second invocation it will - * relink it to {@code B.getColor()} returning a {@code String}, and finally on - * third invocation it will relink it to {@code C.getColor()} returning an {@code int}. - * The {@code SimpleRelinkableCallSite} we used above only remembers the linkage - * for the last encountered type (it implements what is known as a <i>monomorphic - * inline cache</i>). Another already provided implementation, - * {@link jdk.dynalink.support.ChainedCallSite} will remember linkages for - * several different types (it is a <i>polymorphic inline cache</i>) and is - * probably a better choice in serious applications. - * <h2>Dynalink and bytecode creation</h2> - * {@code CallSite} objects are usually created as part of bootstrapping - * {@code invokedynamic} instructions in bytecode. Hence, Dynalink is typically - * used as part of language runtimes that compile programs into Java - * {@code .class} bytecode format. Dynalink does not address the aspects of - * either creating bytecode classes or loading them into the JVM. That said, - * Dynalink can also be used without bytecode compilation (e.g. in language - * interpreters) by creating {@code CallSite} objects explicitly and associating - * them with representations of dynamic operations in the interpreted program - * (e.g. a typical representation would be some node objects in a syntax tree). - * <h2>Available operations</h2> - * Dynalink defines several standard operations in its - * {@link jdk.dynalink.StandardOperation} class. The linker for Java - * objects can link all of these operations, and you are encouraged to at - * minimum support and use these operations in your language too. The - * standard operations {@code GET} and {@code SET} need to be combined with - * at least one {@link jdk.dynalink.Namespace} to be useful, e.g. to express a - * property getter, you'd use {@code StandardOperation.GET.withNamespace(StandardNamespace.PROPERTY)}. - * Dynalink defines three standard namespaces in the {@link jdk.dynalink.StandardNamespace} class. - * To associate a fixed name with an operation, you can use - * {@link jdk.dynalink.NamedOperation} as in the previous example: - * {@code StandardOperation.GET.withNamespace(StandardNamespace.PROPERTY).named("color")} - * expresses a getter for the property named "color". - * <h2>Operations on multiple namespaces</h2> - * Some languages might not have separate namespaces on objects for - * properties, elements, and methods, and a source language construct might - * address several of them at once. Dynalink supports specifying multiple - * {@link jdk.dynalink.Namespace} objects with {@link jdk.dynalink.NamespaceOperation}. - * <h2>Language-specific linkers</h2> - * Languages that define their own object model different than the JVM - * class-based model and/or use their own type conversions will need to create - * their own language-specific linkers. See the {@link jdk.dynalink.linker} - * package and specifically the {@link jdk.dynalink.linker.GuardingDynamicLinker} - * interface to get started. - * <h2>Dynalink and Java objects</h2> - * The {@code DynamicLinker} objects created by {@code DynamicLinkerFactory} by - * default contain an internal instance of - * {@code BeansLinker}, which is a language-specific linker - * that implements the usual Java semantics for all of the above operations and - * can link any Java object that no other language-specific linker has managed - * to link. This way, all language runtimes have built-in interoperability with - * ordinary Java objects. See {@link jdk.dynalink.beans.BeansLinker} for details - * on how it links the various operations. - * <h2>Cross-language interoperability</h2> - * A {@code DynamicLinkerFactory} can be configured with a - * {@link jdk.dynalink.DynamicLinkerFactory#setClassLoader(ClassLoader) class - * loader}. It will try to instantiate all - * {@link jdk.dynalink.linker.GuardingDynamicLinkerExporter} classes visible to - * that class loader and compose the linkers they provide into the - * {@code DynamicLinker} it creates. This allows for interoperability between - * languages: if you have two language runtimes A and B deployed in your JVM and - * they export their linkers through the above mechanism, language runtime A - * will have a language-specific linker instance from B and vice versa inside - * their {@code DynamicLinker} objects. This means that if an object from - * language runtime B gets passed to code from language runtime A, the linker - * from B will get a chance to link the call site in A when it encounters the - * object from B. + * Contains interfaces and classes that are used to link an {@code invokedynamic} call site. */ package jdk.dynalink;
--- a/nashorn/src/jdk.dynalink/share/classes/module-info.java Fri Jan 13 16:49:34 2017 -0500 +++ b/nashorn/src/jdk.dynalink/share/classes/module-info.java Tue Jan 17 15:27:22 2017 +0100 @@ -24,7 +24,198 @@ */ /** - * Dynalink + * <p> + * Dynalink is a library for dynamic linking of high-level operations on objects. + * These operations include "read a property", + * "write a property", "invoke a function" and so on. Dynalink is primarily + * useful for implementing programming languages where at least some expressions + * have dynamic types (that is, types that can not be decided statically), and + * the operations on dynamic types are expressed as + * {@link java.lang.invoke.CallSite call sites}. These call sites will be + * linked to appropriate target {@link java.lang.invoke.MethodHandle method handles} + * at run time based on actual types of the values the expressions evaluated to. + * These can change between invocations, necessitating relinking the call site + * multiple times to accommodate new types; Dynalink handles all that and more. + * <p> + * Dynalink supports implementation of programming languages with object models + * that differ (even radically) from the JVM's class-based model and have their + * custom type conversions. + * <p> + * Dynalink is closely related to, and relies on, the {@link java.lang.invoke} + * package. + * <p> + * + * While {@link java.lang.invoke} provides a low level API for dynamic linking + * of {@code invokedynamic} call sites, it does not provide a way to express + * higher level operations on objects, nor methods that implement them. These + * operations are the usual ones in object-oriented environments: property + * access, access of elements of collections, invocation of methods and + * constructors (potentially with multiple dispatch, e.g. link- and run-time + * equivalents of Java overloaded method resolution). These are all functions + * that are normally desired in a language on the JVM. If a language is + * statically typed and its type system matches that of the JVM, it can + * accomplish this with use of the usual invocation, field access, etc. + * instructions (e.g. {@code invokevirtual}, {@code getfield}). However, if the + * language is dynamic (hence, types of some expressions are not known until + * evaluated at run time), or its object model or type system don't match + * closely that of the JVM, then it should use {@code invokedynamic} call sites + * instead and let Dynalink manage them. + * <h2>Example</h2> + * Dynalink is probably best explained by an example showing its use. Let's + * suppose you have a program in a language where you don't have to declare the + * type of an object and you want to access a property on it: + * <pre> + * var color = obj.color; + * </pre> + * If you generated a Java class to represent the above one-line program, its + * bytecode would look something like this: + * <pre> + * aload 2 // load "obj" on stack + * invokedynamic "GET:PROPERTY:color"(Object)Object // invoke property getter on object of unknown type + * astore 3 // store the return value into local variable "color" + * </pre> + * In order to link the {@code invokedynamic} instruction, we need a bootstrap + * method. A minimalist bootstrap method with Dynalink could look like this: + * <pre> + * import java.lang.invoke.*; + * import jdk.dynalink.*; + * import jdk.dynalink.support.*; + * + * class MyLanguageRuntime { + * private static final DynamicLinker dynamicLinker = new DynamicLinkerFactory().createLinker(); + * + * public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) { + * return dynamicLinker.link( + * new SimpleRelinkableCallSite( + * new CallSiteDescriptor(lookup, parseOperation(name), type))); + * } + * + * private static Operation parseOperation(String name) { + * ... + * } + * } + * </pre> + * There are several objects of significance in the above code snippet: + * <ul> + * <li>{@link jdk.dynalink.DynamicLinker} is the main object in Dynalink, it + * coordinates the linking of call sites to method handles that implement the + * operations named in them. It is configured and created using a + * {@link jdk.dynalink.DynamicLinkerFactory}.</li> + * <li>When the bootstrap method is invoked, it needs to create a + * {@link java.lang.invoke.CallSite} object. In Dynalink, these call sites need + * to additionally implement the {@link jdk.dynalink.RelinkableCallSite} + * interface. "Relinkable" here alludes to the fact that if the call site + * encounters objects of different types at run time, its target will be changed + * to a method handle that can perform the operation on the newly encountered + * type. {@link jdk.dynalink.support.SimpleRelinkableCallSite} and + * {@link jdk.dynalink.support.ChainedCallSite} (not used in the above example) + * are two implementations already provided by the library.</li> + * <li>Dynalink uses {@link jdk.dynalink.CallSiteDescriptor} objects to + * preserve the parameters to the bootstrap method: the lookup and the method type, + * as it will need them whenever it needs to relink a call site.</li> + * <li>Dynalink uses {@link jdk.dynalink.Operation} objects to express + * dynamic operations. It does not prescribe how would you encode the operations + * in your call site, though. That is why in the above example the + * {@code parseOperation} function is left empty, and you would be expected to + * provide the code to parse the string {@code "GET:PROPERTY:color"} + * in the call site's name into a named property getter operation object as + * {@code StandardOperation.GET.withNamespace(StandardNamespace.PROPERTY).named("color")}. + * </ul> + * <p>What can you already do with the above setup? {@code DynamicLinkerFactory} + * by default creates a {@code DynamicLinker} that can link Java objects with the + * usual Java semantics. If you have these three simple classes: + * <pre> + * public class A { + * public String color; + * public A(String color) { this.color = color; } + * } + * + * public class B { + * private String color; + * public B(String color) { this.color = color; } + * public String getColor() { return color; } + * } + * + * public class C { + * private int color; + * public C(int color) { this.color = color; } + * public int getColor() { return color; } + * } + * </pre> + * and you somehow create their instances and pass them to your call site in your + * programming language: + * <pre> + * for each(var obj in [new A("red"), new B("green"), new C(0x0000ff)]) { + * print(obj.color); + * } + * </pre> + * then on first invocation, Dynalink will link the {@code .color} getter + * operation to a field getter for {@code A.color}, on second invocation it will + * relink it to {@code B.getColor()} returning a {@code String}, and finally on + * third invocation it will relink it to {@code C.getColor()} returning an {@code int}. + * The {@code SimpleRelinkableCallSite} we used above only remembers the linkage + * for the last encountered type (it implements what is known as a <i>monomorphic + * inline cache</i>). Another already provided implementation, + * {@link jdk.dynalink.support.ChainedCallSite} will remember linkages for + * several different types (it is a <i>polymorphic inline cache</i>) and is + * probably a better choice in serious applications. + * <h2>Dynalink and bytecode creation</h2> + * {@code CallSite} objects are usually created as part of bootstrapping + * {@code invokedynamic} instructions in bytecode. Hence, Dynalink is typically + * used as part of language runtimes that compile programs into Java + * {@code .class} bytecode format. Dynalink does not address the aspects of + * either creating bytecode classes or loading them into the JVM. That said, + * Dynalink can also be used without bytecode compilation (e.g. in language + * interpreters) by creating {@code CallSite} objects explicitly and associating + * them with representations of dynamic operations in the interpreted program + * (e.g. a typical representation would be some node objects in a syntax tree). + * <h2>Available operations</h2> + * Dynalink defines several standard operations in its + * {@link jdk.dynalink.StandardOperation} class. The linker for Java + * objects can link all of these operations, and you are encouraged to at + * minimum support and use these operations in your language too. The + * standard operations {@code GET} and {@code SET} need to be combined with + * at least one {@link jdk.dynalink.Namespace} to be useful, e.g. to express a + * property getter, you'd use {@code StandardOperation.GET.withNamespace(StandardNamespace.PROPERTY)}. + * Dynalink defines three standard namespaces in the {@link jdk.dynalink.StandardNamespace} class. + * To associate a fixed name with an operation, you can use + * {@link jdk.dynalink.NamedOperation} as in the previous example: + * {@code StandardOperation.GET.withNamespace(StandardNamespace.PROPERTY).named("color")} + * expresses a getter for the property named "color". + * <h2>Operations on multiple namespaces</h2> + * Some languages might not have separate namespaces on objects for + * properties, elements, and methods, and a source language construct might + * address several of them at once. Dynalink supports specifying multiple + * {@link jdk.dynalink.Namespace} objects with {@link jdk.dynalink.NamespaceOperation}. + * <h2>Language-specific linkers</h2> + * Languages that define their own object model different than the JVM + * class-based model and/or use their own type conversions will need to create + * their own language-specific linkers. See the {@link jdk.dynalink.linker} + * package and specifically the {@link jdk.dynalink.linker.GuardingDynamicLinker} + * interface to get started. + * <h2>Dynalink and Java objects</h2> + * The {@code DynamicLinker} objects created by {@code DynamicLinkerFactory} by + * default contain an internal instance of + * {@code BeansLinker}, which is a language-specific linker + * that implements the usual Java semantics for all of the above operations and + * can link any Java object that no other language-specific linker has managed + * to link. This way, all language runtimes have built-in interoperability with + * ordinary Java objects. See {@link jdk.dynalink.beans.BeansLinker} for details + * on how it links the various operations. + * <h2>Cross-language interoperability</h2> + * A {@code DynamicLinkerFactory} can be configured with a + * {@link jdk.dynalink.DynamicLinkerFactory#setClassLoader(ClassLoader) class + * loader}. It will try to instantiate all + * {@link jdk.dynalink.linker.GuardingDynamicLinkerExporter} classes visible to + * that class loader and compose the linkers they provide into the + * {@code DynamicLinker} it creates. This allows for interoperability between + * languages: if you have two language runtimes A and B deployed in your JVM and + * they export their linkers through the above mechanism, language runtime A + * will have a language-specific linker instance from B and vice versa inside + * their {@code DynamicLinker} objects. This means that if an object from + * language runtime B gets passed to code from language runtime A, the linker + * from B will get a chance to link the call site in A when it encounters the + * object from B. */ module jdk.dynalink { requires java.logging;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java Fri Jan 13 16:49:34 2017 -0500 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java Tue Jan 17 15:27:22 2017 +0100 @@ -24,7 +24,71 @@ */ /** - * Nashorn +<p> +Nashorn is a runtime environment for programs written in ECMAScript 5.1. +</p> +<h1>Usage</h1> +The recommended way to use Nashorn is through the <a href="http://jcp.org/en/jsr/detail?id=223" target="_top">JSR-223 +"Scripting for the Java Platform"</a> APIs found in the {@link javax.script} package. Usually, you'll obtain a +{@link javax.script.ScriptEngine} instance for Nashorn using: +<pre> +import javax.script.*; +... +ScriptEngine nashornEngine = new ScriptEngineManager().getEngineByName("nashorn"); +</pre> +and then use it just as you would any other JSR-223 script engine. See +<a href="jdk/nashorn/api/scripting/package-summary.html">{@code jdk.nashorn.api.scripting}</a> package +for details. +<h1>Compatibility</h1> +Nashorn is 100% compliant with the <a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm" +target="_top">ECMA-262 Standard, Edition 5.1</a>. It requires a Java Virtual Machine that implements the +<a href="http://jcp.org/en/jsr/detail?id=292" target="_top">JSR-292 "Supporting Dynamically Typed Languages on the Java +Platform"</a> specification (often referred to as "invokedynamic"), as well as the already mentioned JSR-223. +<h1>Interoperability with the Java platform</h1> +In addition to being a 100% ECMAScript 5.1 runtime, Nashorn provides features for interoperability of the ECMAScript +programs with the Java platform. In general, any Java object put into the script engine's context will be visible from +the script. In terms of the standard, such Java objects are not considered "native objects", but rather "host objects", +as defined in section 4.3.8. This distinction allows certain semantical differences in handling them compared to native +objects. For most purposes, Java objects behave just as native objects do: you can invoke their methods, get and set +their properties. In most cases, though, you can't add arbitrary properties to them, nor can you remove existing +properties. +<h2>Java collection handling</h2> +Native Java arrays and {@link java.util.List}s support indexed access to their elements through the property accessors, +and {@link java.util.Map}s support both property and element access through both dot and square-bracket property +accessors, with the difference being that dot operator gives precedence to object properties (its fields and properties +defined as {@code getXxx} and {@code setXxx} methods) while the square bracket operator gives precedence to map +elements. Native Java arrays expose the {@code length} property. +<h2>ECMAScript primitive types</h2> +ECMAScript primitive types for number, string, and boolean are represented with {@link java.lang.Number}, +{@link java.lang.CharSequence}, and {@link java.lang.Boolean} objects. While the most often used number type is +{@link java.lang.Double} and the most often used string type is {@link java.lang.String}, don't rely on it as various +internal optimizations cause other subclasses of {@code Number} and internal implementations of {@code CharSequence} to +be used. +<h2>Type conversions</h2> +When a method on a Java object is invoked, the arguments are converted to the formal parameter types of the Java method +using all allowed ECMAScript conversions. This can be surprising, as in general, conversions from string to number will +succeed according to Standard's section 9.3 "ToNumber" and so on; string to boolean, number to boolean, Object to +number, Object to string all work. Note that if the Java method's declared parameter type is {@code java.lang.Object}, +Nashorn objects are passed without any conversion whatsoever; specifically if the JavaScript value being passed is of +primitive string type, you can only rely on it being a {@code java.lang.CharSequence}, and if the value is a number, you +can only rely on it being a {@code java.lang.Number}. If the Java method declared parameter type is more specific (e.g. +{@code java.lang.String} or {@code java.lang.Double}), then Nashorn will of course ensure the required type is passed. +<h2>SAM types</h2> +As a special extension when invoking Java methods, ECMAScript function objects can be passed in place of an argument +whose Java type is so-called "single abstract method" or "SAM" type. While this name usually covers single-method +interfaces, Nashorn is a bit more versatile, and it recognizes a type as a SAM type if all its abstract methods are +overloads of the same name, and it is either an interface, or it is an abstract class with +a no-arg constructor. The type itself must be public, while the constructor and the methods can be either public or +protected. If there are multiple abstract overloads of the same name, the single function will serve as the shared +implementation for all of them, <em>and additionally it will also override any non-abstract methods of the same name</em>. +This is done to be consistent with the fact that ECMAScript does not have the concept of overloaded methods. +<h2>The {@code Java} object</h2> +Nashorn exposes a non-standard global object named {@code Java} that is the primary API entry point into Java +platform-specific functionality. You can use it to create instances of Java classes, convert from Java arrays to native +arrays and back, and so on. +<h2>Other non-standard built-in objects</h2> +In addition to {@code Java}, Nashorn also exposes some other non-standard built-in objects: +{@code JSAdapter}, {@code JavaImporter}, {@code Packages} */ module jdk.scripting.nashorn { requires java.logging; @@ -47,4 +111,3 @@ provides jdk.dynalink.linker.GuardingDynamicLinkerExporter with jdk.nashorn.api.linker.NashornLinkerExporter; } -
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/overview.html Fri Jan 13 16:49:34 2017 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,113 +0,0 @@ -<!-- - Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. - DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - - This code is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License version 2 only, as - published by the Free Software Foundation. Oracle designates this - particular file as subject to the "Classpath" exception as provided - by Oracle in the LICENSE file that accompanied this code. - - This code is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - version 2 for more details (a copy is included in the LICENSE file that - accompanied this code). - - You should have received a copy of the GNU General Public License version - 2 along with this work; if not, write to the Free Software Foundation, - Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - - Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - or visit www.oracle.com if you need additional information or have any - questions. ---> -<body> -<p> -Nashorn is a runtime environment for programs written in ECMAScript 5.1. -</p> -<h1>Usage</h1> -<p> -The recommended way to use Nashorn is through the <a href="http://jcp.org/en/jsr/detail?id=223" target="_top">JSR-223 -"Scripting for the Java Platform"</a> APIs found in the {@link javax.script} package. Usually, you'll obtain a -{@link javax.script.ScriptEngine} instance for Nashorn using: -<pre> -import javax.script.*; -... -ScriptEngine nashornEngine = new ScriptEngineManager().getEngineByName("nashorn"); -</pre> -and then use it just as you would any other JSR-223 script engine. See -<a href="jdk/nashorn/api/scripting/package-summary.html">{@code jdk.nashorn.api.scripting}</a> package -for details. -<p> -<h1>Compatibility</h1> -Nashorn is 100% compliant with the <a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm" -target="_top">ECMA-262 Standard, Edition 5.1</a>. It requires a Java Virtual Machine that implements the -<a href="http://jcp.org/en/jsr/detail?id=292" target="_top">JSR-292 "Supporting Dynamically Typed Languages on the Java -Platform"</a> specification (often referred to as "invokedynamic"), as well as the already mentioned JSR-223. -<h1>Interoperability with the Java platform</h1> -<p> -In addition to being a 100% ECMAScript 5.1 runtime, Nashorn provides features for interoperability of the ECMAScript -programs with the Java platform. In general, any Java object put into the script engine's context will be visible from -the script. In terms of the standard, such Java objects are not considered "native objects", but rather "host objects", -as defined in section 4.3.8. This distinction allows certain semantical differences in handling them compared to native -objects. For most purposes, Java objects behave just as native objects do: you can invoke their methods, get and set -their properties. In most cases, though, you can't add arbitrary properties to them, nor can you remove existing -properties. -<p> -<h2>Java collection handling</h2> -<p> -Native Java arrays and {@link java.util.List}s support indexed access to their elements through the property accessors, -and {@link java.util.Map}s support both property and element access through both dot and square-bracket property -accessors, with the difference being that dot operator gives precedence to object properties (its fields and properties -defined as {@code getXxx} and {@code setXxx} methods) while the square bracket operator gives precedence to map -elements. Native Java arrays expose the {@code length} property. -<p> -<h2>ECMAScript primitive types</h2> -<p> -ECMAScript primitive types for number, string, and boolean are represented with {@link java.lang.Number}, -{@link java.lang.CharSequence}, and {@link java.lang.Boolean} objects. While the most often used number type is -{@link java.lang.Double} and the most often used string type is {@link java.lang.String}, don't rely on it as various -internal optimizations cause other subclasses of {@code Number} and internal implementations of {@code CharSequence} to -be used. -<p> -<h2>Type conversions</h2> -<p> -When a method on a Java object is invoked, the arguments are converted to the formal parameter types of the Java method -using all allowed ECMAScript conversions. This can be surprising, as in general, conversions from string to number will -succeed according to Standard's section 9.3 "ToNumber" and so on; string to boolean, number to boolean, Object to -number, Object to string all work. Note that if the Java method's declared parameter type is {@code java.lang.Object}, -Nashorn objects are passed without any conversion whatsoever; specifically if the JavaScript value being passed is of -primitive string type, you can only rely on it being a {@code java.lang.CharSequence}, and if the value is a number, you -can only rely on it being a {@code java.lang.Number}. If the Java method declared parameter type is more specific (e.g. -{@code java.lang.String} or {@code java.lang.Double}), then Nashorn will of course ensure the required type is passed. -<p> -<h2>SAM types</h2> -<p> -As a special extension when invoking Java methods, ECMAScript function objects can be passed in place of an argument -whose Java type is so-called "single abstract method" or "SAM" type. While this name usually covers single-method -interfaces, Nashorn is a bit more versatile, and it recognizes a type as a SAM type if all its abstract methods are -overloads of the same name, and it is either an interface, or it is an abstract class with -a no-arg constructor. The type itself must be public, while the constructor and the methods can be either public or -protected. If there are multiple abstract overloads of the same name, the single function will serve as the shared -implementation for all of them, <em>and additionally it will also override any non-abstract methods of the same name</em>. -This is done to be consistent with the fact that ECMAScript does not have the concept of overloaded methods. -<p> -<h2>The {@code Java} object</h2> -Nashorn exposes a non-standard global object named {@code Java} that is the primary API entry point into Java -platform-specific functionality. You can use it to create instances of Java classes, convert from Java arrays to native -arrays and back, and so on. The methods on the objects are directly implemented by public static methods on the class -<a href="jdk/nashorn/internal/objects/NativeJava.html">{@code NativeJava}</a>, see that class for details on what -functionality is available. -<h2>Representations of Java types</h2> -The method <a href="jdk/nashorn/internal/objects/NativeJava.html#type(java.lang.Object,%20java.lang.Object)"> -{@code Java.type(typeName)}</a> takes a name of a type, and returns an object representing a Java type. You can -use that object to both create new instances of Java classes, as well as to access static fields and methods on them. -The type object is distinct from the {@code java.lang.Class} object, which represents the reflective run-time type -identity and doesn't carry i.e. static members. Again, see the link for {@code NativeJava} above for details. -<h2>Other non-standard built-in objects</h2> -In addition to {@code Java}, Nashorn also exposes some other non-standard built-in objects: -<a href="jdk/nashorn/internal/objects/NativeJSAdapter.html">{@code JSAdapter}</a>, -<a href="jdk/nashorn/internal/objects/NativeJavaImporter.html">{@code JavaImporter}</a>, -<a href="jdk/nashorn/internal/runtime/NativeJavaPackage.html">{@code Packages}.</a> -</body>