Merge
authorduke
Wed, 05 Jul 2017 19:07:19 +0200
changeset 19242 51714f9f4323
parent 19241 1317035e27c5 (current diff)
parent 19240 45992754c3b7 (diff)
child 19244 06fb07bb9897
Merge
corba/src/share/classes/com/sun/corba/se/impl/copyobject/JavaInputStream.sjava
corba/src/share/classes/com/sun/corba/se/impl/copyobject/JavaOutputStream.sjava
corba/src/share/classes/com/sun/corba/se/impl/interceptors/ThreadCurrentStack.sjava
corba/src/share/classes/com/sun/corba/se/impl/orbutil/DefineWrapper.sjava
corba/src/share/classes/com/sun/corba/se/impl/presentation/rmi/IDLNameTranslatorImpl_save.sjava
corba/src/share/classes/com/sun/corba/se/impl/presentation/rmi/IDLTypesUtil_save.sjava
corba/src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalClientRequestImpl.sjava
corba/src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalClientResponseImpl.sjava
corba/src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalServerRequestImpl.sjava
corba/src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalServerResponseImpl.sjava
corba/src/share/classes/com/sun/corba/se/impl/transport/BufferConnectionImpl.sjava
hotspot/test/runtime/7196045/Test7196045.java
hotspot/test/runtime/8000968/Test8000968.sh
jdk/test/java/lang/System/MacJNUEncoding/ExpectedEncoding.java
jdk/test/java/lang/System/MacJNUEncoding/MacJNUEncoding.sh
--- a/.hgtags-top-repo	Thu Aug 08 10:10:37 2013 -0700
+++ b/.hgtags-top-repo	Wed Jul 05 19:07:19 2017 +0200
@@ -223,3 +223,4 @@
 59dc9da813794c924a0383c2a6241af94defdfed jdk8-b99
 d2dcb110e9dbaf9903c05b211df800e78e4b394e jdk8-b100
 9f74a220677dc265a724515d8e2617548cef62f1 jdk8-b101
+5eb3c1dc348f72a7f84f7d9d07834e8bbe09a799 jdk8-b102
--- a/corba/.hgtags	Thu Aug 08 10:10:37 2013 -0700
+++ b/corba/.hgtags	Wed Jul 05 19:07:19 2017 +0200
@@ -223,3 +223,4 @@
 3f67804ab61303782df57e54989ef5e0e4629beb jdk8-b99
 8d492f1dfd1b131a4c7886ee6b59528609f7e4fe jdk8-b100
 a013024b07475782f1fa8e196e950b34b4077663 jdk8-b101
+528c7e76eaeee022817ee085668459bc97cf5665 jdk8-b102
--- a/corba/src/share/classes/com/sun/corba/se/impl/copyobject/JavaInputStream.sjava	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,528 +0,0 @@
-/*
- * Copyright (c) 2004, 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 com.sun.corba.se.impl.encoding;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.nio.ByteBuffer;
-
-import org.omg.CORBA.TypeCode;
-import org.omg.CORBA.Principal;
-import org.omg.CORBA.Any;
-
-import com.sun.org.omg.SendingContext.CodeBase;
-
-import com.sun.corba.se.pept.protocol.MessageMediator;
-
-import com.sun.corba.se.spi.logging.CORBALogDomains;
-import com.sun.corba.se.spi.orb.ORB;
-import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
-import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
-
-import com.sun.corba.se.impl.logging.ORBUtilSystemException;
-import com.sun.corba.se.impl.encoding.CodeSetConversion;
-import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry;
-
-/**
- * This is delegates to the real implementation.
- *
- * NOTE:
- *
- * Before using the stream for valuetype unmarshaling, one must call
- * performORBVersionSpecificInit().
- */
-public abstract class CDRInputStream
-    extends org.omg.CORBA_2_3.portable.InputStream
-    implements com.sun.corba.se.impl.encoding.MarshalInputStream,
-               org.omg.CORBA.DataInputStream, org.omg.CORBA.portable.ValueInputStream
-{
-    protected CorbaMessageMediator messageMediator;
-    private CDRInputStreamBase impl;
-
-    // We can move this out somewhere later.  For now, it serves its purpose
-    // to create a concrete CDR delegate based on the GIOP version.
-    private static class InputStreamFactory {
-        
-        public static CDRInputStreamBase newInputStream(ORB orb, GIOPVersion version)
-        {
-            switch(version.intValue()) {
-                case GIOPVersion.VERSION_1_0:
-                    return new CDRInputStream_1_0();
-                case GIOPVersion.VERSION_1_1:
-                    return new CDRInputStream_1_1();
-                case GIOPVersion.VERSION_1_2:
-                    return new CDRInputStream_1_2();
-                default:
-		    ORBUtilSystemException wrapper = ORBUtilSystemException.get( orb,
-			CORBALogDomains.RPC_ENCODING ) ;
-		    throw wrapper.unsupportedGiopVersion( version ) ;
-            }
-        }
-    }
-
-    // Required for the case when a ClientResponseImpl is
-    // created with a SystemException due to a dead server/closed
-    // connection with no warning.  Note that the stream will
-    // not be initialized in this case.
-    // 
-    // Probably also required by ServerRequestImpl.
-    // 
-    // REVISIT.
-    public CDRInputStream() {
-    }
-
-    public CDRInputStream(CDRInputStream is) {
-        impl = is.impl.dup();
-        impl.setParent(this);
-    }
-
-    public CDRInputStream(org.omg.CORBA.ORB orb,
-                          ByteBuffer byteBuffer,
-                          int size,
-                          boolean littleEndian,
-                          GIOPVersion version,
-                          BufferManagerRead bufMgr)
-    {
-        impl = InputStreamFactory.newInputStream( (ORB)orb, version);
-
-        impl.init(orb, byteBuffer, size, littleEndian, bufMgr);
-
-        impl.setParent(this);
-    }
-
-    // org.omg.CORBA.portable.InputStream
-    public final boolean read_boolean() {
-        return impl.read_boolean();
-    }
-
-    public final char read_char() {
-        return impl.read_char();
-    }
-
-    public final char read_wchar() {
-        return impl.read_wchar();
-    }
-
-    public final byte read_octet() {
-        return impl.read_octet();
-    }
-
-    public final short read_short() {
-        return impl.read_short();
-    }
-
-    public final short read_ushort() {
-        return impl.read_ushort();
-    }
-
-    public final int read_long() {
-        return impl.read_long();
-    }
-
-    public final int read_ulong() {
-        return impl.read_ulong();
-    }
-
-    public final long read_longlong() {
-        return impl.read_longlong();
-    }
-
-    public final long read_ulonglong() {
-        return impl.read_ulonglong();
-    }
-
-    public final float read_float() {
-        return impl.read_float();
-    }
-
-    public final double read_double() {
-        return impl.read_double();
-    }
-
-    public final String read_string() {
-        return impl.read_string();
-    }
-
-    public final String read_wstring() {
-        return impl.read_wstring();
-    }
-
-    public final void read_boolean_array(boolean[] value, int offset, int length) {
-        impl.read_boolean_array(value, offset, length);
-    }
-
-    public final void read_char_array(char[] value, int offset, int length) {
-        impl.read_char_array(value, offset, length);
-    }
-
-    public final void read_wchar_array(char[] value, int offset, int length) {
-        impl.read_wchar_array(value, offset, length);
-    }
-
-    public final void read_octet_array(byte[] value, int offset, int length) {
-        impl.read_octet_array(value, offset, length);
-    }
-
-    public final void read_short_array(short[] value, int offset, int length) {
-        impl.read_short_array(value, offset, length);
-    }
-
-    public final void read_ushort_array(short[] value, int offset, int length) {
-        impl.read_ushort_array(value, offset, length);
-    }
-
-    public final void read_long_array(int[] value, int offset, int length) {
-        impl.read_long_array(value, offset, length);
-    }
-
-    public final void read_ulong_array(int[] value, int offset, int length) {
-        impl.read_ulong_array(value, offset, length);
-    }
-
-    public final void read_longlong_array(long[] value, int offset, int length) {
-        impl.read_longlong_array(value, offset, length);
-    }
-
-    public final void read_ulonglong_array(long[] value, int offset, int length) {
-        impl.read_ulonglong_array(value, offset, length);
-    }
-
-    public final void read_float_array(float[] value, int offset, int length) {
-        impl.read_float_array(value, offset, length);
-    }
-
-    public final void read_double_array(double[] value, int offset, int length) {
-        impl.read_double_array(value, offset, length);
-    }
-
-    public final org.omg.CORBA.Object read_Object() {
-        return impl.read_Object();
-    }
-
-    public final TypeCode read_TypeCode() {
-        return impl.read_TypeCode();
-    }
-    public final Any read_any() {
-        return impl.read_any();
-    }
-
-    public final Principal read_Principal() {
-        return impl.read_Principal();
-    }
-
-    public final int read() throws java.io.IOException {
-        return impl.read();
-    }
-
-    public final java.math.BigDecimal read_fixed() {
-        return impl.read_fixed();
-    }
-
-    public final org.omg.CORBA.Context read_Context() {
-        return impl.read_Context();
-    }
-
-    public final org.omg.CORBA.Object read_Object(java.lang.Class clz) {
-        return impl.read_Object(clz);
-    }
-
-    public final org.omg.CORBA.ORB orb() {
-        return impl.orb();
-    }
-
-    // org.omg.CORBA_2_3.portable.InputStream
-    public final java.io.Serializable read_value() {
-        return impl.read_value();
-    }
-
-    public final java.io.Serializable read_value(java.lang.Class clz) {
-        return impl.read_value(clz);
-    }
-
-    public final java.io.Serializable read_value(org.omg.CORBA.portable.BoxedValueHelper factory) {
-        return impl.read_value(factory);
-    }
-
-    public final java.io.Serializable read_value(java.lang.String rep_id) {
-        return impl.read_value(rep_id);
-    }
-
-    public final java.io.Serializable read_value(java.io.Serializable value) {
-        return impl.read_value(value);
-    }
-
-    public final java.lang.Object read_abstract_interface() {
-        return impl.read_abstract_interface();
-    }
-
-    public final java.lang.Object read_abstract_interface(java.lang.Class clz) {
-        return impl.read_abstract_interface(clz);
-    }
-    // com.sun.corba.se.impl.encoding.MarshalInputStream
-
-    public final void consumeEndian() {
-        impl.consumeEndian();
-    }
-
-    public final int getPosition() {
-        return impl.getPosition();
-    }
-
-    // org.omg.CORBA.DataInputStream
-
-    public final java.lang.Object read_Abstract () {
-        return impl.read_Abstract();
-    }
-
-    public final java.io.Serializable read_Value () {
-        return impl.read_Value();
-    }
-
-    public final void read_any_array (org.omg.CORBA.AnySeqHolder seq, int offset, int length) {
-        impl.read_any_array(seq, offset, length);
-    }
-
-    public final void read_boolean_array (org.omg.CORBA.BooleanSeqHolder seq, int offset, int length) {
-        impl.read_boolean_array(seq, offset, length);
-    }
-
-    public final void read_char_array (org.omg.CORBA.CharSeqHolder seq, int offset, int length) {
-        impl.read_char_array(seq, offset, length);
-    }
-
-    public final void read_wchar_array (org.omg.CORBA.WCharSeqHolder seq, int offset, int length) {
-        impl.read_wchar_array(seq, offset, length);
-    }
-
-    public final void read_octet_array (org.omg.CORBA.OctetSeqHolder seq, int offset, int length) {
-        impl.read_octet_array(seq, offset, length);
-    }
-
-    public final void read_short_array (org.omg.CORBA.ShortSeqHolder seq, int offset, int length) {
-        impl.read_short_array(seq, offset, length);
-    }
-
-    public final void read_ushort_array (org.omg.CORBA.UShortSeqHolder seq, int offset, int length) {
-        impl.read_ushort_array(seq, offset, length);
-    }
-
-    public final void read_long_array (org.omg.CORBA.LongSeqHolder seq, int offset, int length) {
-        impl.read_long_array(seq, offset, length);
-    }
-
-    public final void read_ulong_array (org.omg.CORBA.ULongSeqHolder seq, int offset, int length) {
-        impl.read_ulong_array(seq, offset, length);
-    }
-
-    public final void read_ulonglong_array (org.omg.CORBA.ULongLongSeqHolder seq, int offset, int length) {
-        impl.read_ulonglong_array(seq, offset, length);
-    }
-
-    public final void read_longlong_array (org.omg.CORBA.LongLongSeqHolder seq, int offset, int length) {
-        impl.read_longlong_array(seq, offset, length);
-    }
-
-    public final void read_float_array (org.omg.CORBA.FloatSeqHolder seq, int offset, int length) {
-        impl.read_float_array(seq, offset, length);
-    }
-
-    public final void read_double_array (org.omg.CORBA.DoubleSeqHolder seq, int offset, int length) {
-        impl.read_double_array(seq, offset, length);
-    }
-
-    // org.omg.CORBA.portable.ValueBase
-    public final String[] _truncatable_ids() {
-        return impl._truncatable_ids();
-    }
-
-    // java.io.InputStream
-    public final int read(byte b[]) throws IOException {
-        return impl.read(b);
-    }
-
-    public final int read(byte b[], int off, int len) throws IOException {
-        return impl.read(b, off, len);
-    }
-
-    public final long skip(long n) throws IOException {
-        return impl.skip(n);
-    }
-
-    public final int available() throws IOException {
-        return impl.available();
-    }
-
-    public final void close() throws IOException {
-        impl.close();
-    }
-
-    public final void mark(int readlimit) {
-        impl.mark(readlimit);
-    }
-
-    public final void reset() {
-        impl.reset();
-    }
-
-    public final boolean markSupported() {
-        return impl.markSupported();
-    }
-
-    public abstract CDRInputStream dup();
-
-    // Needed by TCUtility
-    public final java.math.BigDecimal read_fixed(short digits, short scale) {
-        return impl.read_fixed(digits, scale);
-    }
-
-    public final boolean isLittleEndian() {
-        return impl.isLittleEndian();
-    }
-
-    protected final ByteBuffer getByteBuffer() {
-        return impl.getByteBuffer();
-    }
-
-    protected final void setByteBuffer(ByteBuffer byteBuffer) {
-        impl.setByteBuffer(byteBuffer);
-    }
-
-    protected final void setByteBufferWithInfo(ByteBufferWithInfo bbwi) {
-        impl.setByteBufferWithInfo(bbwi);
-    }
-
-    public final int getBufferLength() {
-        return impl.getBufferLength();
-    }
-
-    protected final void setBufferLength(int value) {
-        impl.setBufferLength(value);
-    }
-
-    protected final int getIndex() {
-        return impl.getIndex();
-    }
-
-    protected final void setIndex(int value) {
-        impl.setIndex(value);
-    }
-
-    public final void orb(org.omg.CORBA.ORB orb) {
-        impl.orb(orb);
-    }
-
-    public final GIOPVersion getGIOPVersion() {
-        return impl.getGIOPVersion();
-    }
-
-    public final BufferManagerRead getBufferManager() {
-        return impl.getBufferManager();
-    }
-
-    // This should be overridden by any stream (ex: IIOPInputStream)
-    // which wants to read values.  Thus, TypeCodeInputStream doesn't
-    // have to do this.
-    public CodeBase getCodeBase() {
-        return null;
-    }
-
-    // Use Latin-1 for GIOP 1.0 or when code set negotiation was not
-    // performed.
-    protected CodeSetConversion.BTCConverter createCharBTCConverter() {
-        return CodeSetConversion.impl().getBTCConverter(OSFCodeSetRegistry.ISO_8859_1,
-                                                        impl.isLittleEndian());
-    }
-
-    // Subclasses must decide what to do here.  It's inconvenient to
-    // make the class and this method abstract because of dup().
-    protected abstract CodeSetConversion.BTCConverter createWCharBTCConverter();
-
-    // Prints the current buffer in a human readable form
-    void printBuffer() {
-        impl.printBuffer();
-    }
-
-    /**
-     * Aligns the current position on the given octet boundary
-     * if there are enough bytes available to do so.  Otherwise,
-     * it just returns.  This is used for some (but not all)
-     * GIOP 1.2 message headers.
-     */
-    public void alignOnBoundary(int octetBoundary) {
-        impl.alignOnBoundary(octetBoundary);
-    }
-
-    // Needed by request and reply messages for GIOP versions >= 1.2 only.
-    public void setHeaderPadding(boolean headerPadding) {
-        impl.setHeaderPadding(headerPadding);
-    }
-    
-    /**
-     * This must be called after determining the proper ORB version,
-     * and setting it on the stream's ORB instance.  It can be called
-     * after reading the service contexts, since that is the only place
-     * we can get the ORB version info.
-     *
-     * Trying to unmarshal things requiring repository IDs before calling
-     * this will result in NullPtrExceptions.
-     */
-    public void performORBVersionSpecificInit() {
-        // In the case of SystemExceptions, a stream is created
-        // with its default constructor (and thus no impl is set).
-        if (impl != null)
-            impl.performORBVersionSpecificInit();
-    }
-
-    /**
-     * Resets any internal references to code set converters.
-     * This is useful for forcing the CDR stream to reacquire
-     * converters (probably from its subclasses) when state
-     * has changed.
-     */
-    public void resetCodeSetConverters() {
-        impl.resetCodeSetConverters();
-    }
-
-    public void setMessageMediator(MessageMediator messageMediator)
-    {
-        this.messageMediator = (CorbaMessageMediator) messageMediator;
-    }
-
-    public MessageMediator getMessageMediator()
-    {
-        return messageMediator;
-    }
-
-    // ValueInputStream -----------------------------
-
-    public void start_value() {
-        impl.start_value();
-    }
-
-    public void end_value() {
-        impl.end_value();
-    }
-}
--- a/corba/src/share/classes/com/sun/corba/se/impl/copyobject/JavaOutputStream.sjava	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,435 +0,0 @@
-/*
- * Copyright (c) 2004, 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 com.sun.corba.se.impl.encoding;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.nio.ByteBuffer;
-
-import org.omg.CORBA.TypeCode;
-import org.omg.CORBA.Principal;
-import org.omg.CORBA.Any;
-
-import com.sun.corba.se.pept.protocol.MessageMediator;
-
-import com.sun.corba.se.spi.orb.ORB;
-import com.sun.corba.se.spi.logging.CORBALogDomains;
-import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
-import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
-
-import com.sun.corba.se.impl.encoding.CodeSetConversion;
-import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry;
-import com.sun.corba.se.impl.orbutil.ORBConstants;
-import com.sun.corba.se.impl.logging.ORBUtilSystemException;
-
-/**
- * This is delegates to the real implementation.
- */
-public abstract class CDROutputStream
-    extends org.omg.CORBA_2_3.portable.OutputStream
-    implements com.sun.corba.se.impl.encoding.MarshalOutputStream,
-               org.omg.CORBA.DataOutputStream, org.omg.CORBA.portable.ValueOutputStream
-{
-/*
-    private CDROutputStreamBase impl;
-    protected ORB orb ;
-    protected ORBUtilSystemException wrapper ;
-    protected CorbaMessageMediator corbaMessageMediator;
-
-
-    // We can move this out somewhere later.  For now, it serves its purpose
-    // to create a concrete CDR delegate based on the GIOP version.
-    private static class OutputStreamFactory {
-        
-        public static CDROutputStreamBase newOutputStream(ORB orb, GIOPVersion version)
-        {
-            switch(version.intValue()) {
-                case GIOPVersion.VERSION_1_0:
-                    return new CDROutputStream_1_0();
-                case GIOPVersion.VERSION_1_1:
-                    return new CDROutputStream_1_1();
-                case GIOPVersion.VERSION_1_2:
-                    return new CDROutputStream_1_2();
-                default:
-		    ORBUtilSystemException wrapper = ORBUtilSystemException.get( orb,
-			CORBALogDomains.RPC_ENCODING ) ;
-                    // REVISIT - what is appropriate?  INTERNAL exceptions
-                    // are really hard to track later.
-		    throw wrapper.unsupportedGiopVersion( version ) ;
-            }
-        }
-    }
-
-    // REVISIT - These two constructors should be re-factored to better hide
-    // the fact that someone extending this class 'can' construct a CDROutputStream
-    // that does not use pooled ByteBuffers. Right now, only EncapsOutputStream
-    // does _not_ use pooled ByteBuffers, see EncapsOutputStream.
-
-    // NOTE: When a stream is constructed for non-channel-backed sockets
-    // it notifies the constructor not to use pooled (i.e, direct)
-    // ByteBuffers.
-
-    public CDROutputStream(ORB orb,
-                           GIOPVersion version,
-			   boolean littleEndian,
-			   BufferManagerWrite bufferManager,
-                           byte streamFormatVersion,
-                           boolean usePooledByteBuffers)
-    {
-        impl = OutputStreamFactory.newOutputStream(orb, version);
-        impl.init(orb, littleEndian, bufferManager, streamFormatVersion, usePooledByteBuffers);
-
-        impl.setParent(this);
-	this.orb = orb ;
-	this.wrapper = ORBUtilSystemException.get( orb,
-	    CORBALogDomains.RPC_ENCODING ) ;
-    }
-
-    public CDROutputStream(ORB orb,
-                           GIOPVersion version,
-			   boolean littleEndian,
-			   BufferManagerWrite bufferManager,
-                           byte streamFormatVersion)
-    {
-        this(orb, version, littleEndian, bufferManager, streamFormatVersion, true);
-    }
-*/
-
-    private ByteArrayOutputStream bos ;
-    private ObjectOutputStream oos ;
-
-    public JavaOutputStream() 
-    {
-	bos = new ByteArrayOutputStream() ;
-	oos = new ObjectOutputStream( bos ) ;
-    }
-
-    // Provided by IIOPOutputStream and EncapsOutputStream
-    public org.omg.CORBA.portable.InputStream create_input_stream()
-    {
-	ObjectInputStream ois = new ByteArrayInputStream( bos.toByteArray() ) ;
-	    
-	return new JavaInputStream( ois ) ;
-    }
-
-    public final void write_boolean(boolean value) {
-        impl.write_boolean(value);
-    }
-    public final void write_char(char value) {
-        impl.write_char(value);
-    }
-    public final void write_wchar(char value) {
-        impl.write_wchar(value);
-    }
-    public final void write_octet(byte value) {
-        impl.write_octet(value);
-    }
-    public final void write_short(short value) {
-        impl.write_short(value);
-    }
-    public final void write_ushort(short value) {
-        impl.write_ushort(value);
-    }
-    public final void write_long(int value) {
-        impl.write_long(value);
-    }
-    public final void write_ulong(int value) {
-        impl.write_ulong(value);
-    }
-    public final void write_longlong(long value) {
-        impl.write_longlong(value);
-    }
-    public final void write_ulonglong(long value) {
-        impl.write_ulonglong(value);
-    }
-    public final void write_float(float value) {
-        impl.write_float(value);
-    }
-    public final void write_double(double value) {
-        impl.write_double(value);
-    }
-    public final void write_string(String value) {
-        impl.write_string(value);
-    }
-    public final void write_wstring(String value) {
-        impl.write_wstring(value);
-    }
-
-    public final void write_boolean_array(boolean[] value, int offset, int length) {
-        impl.write_boolean_array(value, offset, length);
-    }
-    public final void write_char_array(char[] value, int offset, int length) {
-        impl.write_char_array(value, offset, length);
-    }
-    public final void write_wchar_array(char[] value, int offset, int length) {
-        impl.write_wchar_array(value, offset, length);
-    }
-    public final void write_octet_array(byte[] value, int offset, int length) {
-        impl.write_octet_array(value, offset, length);
-    }
-    public final void write_short_array(short[] value, int offset, int length) {
-        impl.write_short_array(value, offset, length);
-    }
-    public final void write_ushort_array(short[] value, int offset, int length){
-        impl.write_ushort_array(value, offset, length);
-    }
-    public final void write_long_array(int[] value, int offset, int length) {
-        impl.write_long_array(value, offset, length);
-    }
-    public final void write_ulong_array(int[] value, int offset, int length) {
-        impl.write_ulong_array(value, offset, length);
-    }
-    public final void write_longlong_array(long[] value, int offset, int length) {
-        impl.write_longlong_array(value, offset, length);
-    }
-    public final void write_ulonglong_array(long[] value, int offset,int length) {
-        impl.write_ulonglong_array(value, offset, length);
-    }
-    public final void write_float_array(float[] value, int offset, int length) {
-        impl.write_float_array(value, offset, length);
-    }
-    public final void write_double_array(double[] value, int offset, int length) {
-        impl.write_double_array(value, offset, length);
-    }
-    public final void write_Object(org.omg.CORBA.Object value) {
-        impl.write_Object(value);
-    }
-    public final void write_TypeCode(TypeCode value) {
-        impl.write_TypeCode(value);
-    }
-    public final void write_any(Any value) {
-        impl.write_any(value);
-    }
-
-    public final void write_Principal(Principal value) {
-        impl.write_Principal(value);
-    }
-
-    public final void write(int b) throws java.io.IOException {
-        impl.write(b);
-    }
-    
-    public final void write_fixed(java.math.BigDecimal value) {
-        impl.write_fixed(value);
-    }
-
-    public final void write_Context(org.omg.CORBA.Context ctx,
-			      org.omg.CORBA.ContextList contexts) {
-        impl.write_Context(ctx, contexts);
-    }
-
-    public final org.omg.CORBA.ORB orb() {
-        return impl.orb();
-    }
-
-    // org.omg.CORBA_2_3.portable.OutputStream
-    public final void write_value(java.io.Serializable value) {
-        impl.write_value(value);
-    }
-
-    public final void write_value(java.io.Serializable value, java.lang.Class clz) {
-        impl.write_value(value, clz);
-    }
-
-    public final void write_value(java.io.Serializable value, String repository_id) {
-        impl.write_value(value, repository_id);
-    }
-
-    public final void write_value(java.io.Serializable value, 
-                            org.omg.CORBA.portable.BoxedValueHelper factory) {
-        impl.write_value(value, factory);
-    }
-
-    public final void write_abstract_interface(java.lang.Object obj) {
-        impl.write_abstract_interface(obj);
-    }
-
-    // java.io.OutputStream
-    public final void write(byte b[]) throws IOException {
-        impl.write(b);
-    }
-
-    public final void write(byte b[], int off, int len) throws IOException {
-        impl.write(b, off, len);
-    }
-
-    public final void flush() throws IOException {
-        impl.flush();
-    }
-
-    public final void close() throws IOException {
-        impl.close();
-    }
-
-    // com.sun.corba.se.impl.encoding.MarshalOutputStream
-    public final void start_block() {
-        impl.start_block();
-    }
-
-    public final void end_block() {
-        impl.end_block();
-    }
-
-    public final void putEndian() {
-        impl.putEndian();
-    }
-
-    public void writeTo(java.io.OutputStream s)
-	throws IOException 
-    {
-        impl.writeTo(s);
-    }
-
-    public final byte[] toByteArray() {
-        return impl.toByteArray();
-    }
-
-    // org.omg.CORBA.DataOutputStream
-    public final void write_Abstract (java.lang.Object value) {
-        impl.write_Abstract(value);
-    }
-
-    public final void write_Value (java.io.Serializable value) {
-        impl.write_Value(value);
-    }
-
-    public final void write_any_array(org.omg.CORBA.Any[] seq, int offset, int length) {
-        impl.write_any_array(seq, offset, length);
-    }
-
-    public void setMessageMediator(MessageMediator messageMediator)
-    {
-        this.corbaMessageMediator = (CorbaMessageMediator) messageMediator;
-    }
-
-    public MessageMediator getMessageMediator()
-    {
-        return corbaMessageMediator;
-    }
-
-    // org.omg.CORBA.portable.ValueBase
-    public final String[] _truncatable_ids() {
-        return impl._truncatable_ids();
-    }
-
-    // Other
-    protected final int getSize() {
-        return impl.getSize();
-    }
-
-    protected final int getIndex() {
-        return impl.getIndex();
-    }
-
-    protected int getRealIndex(int index) {
-        // Used in indirections. Overridden by TypeCodeOutputStream.
-        return index;
-    }
-
-    protected final void setIndex(int value) {
-        impl.setIndex(value);
-    }
-
-    protected final ByteBuffer getByteBuffer() {
-        return impl.getByteBuffer();
-    }
-
-    protected final void setByteBuffer(ByteBuffer byteBuffer) {
-        impl.setByteBuffer(byteBuffer);
-    }
-
-    public final boolean isLittleEndian() {
-        return impl.isLittleEndian();
-    }
-
-    // XREVISIT - return to final if possible
-    // REVISIT - was protected - need access from msgtypes test.
-    public ByteBufferWithInfo getByteBufferWithInfo() {
-        return impl.getByteBufferWithInfo();
-    }
-
-    protected void setByteBufferWithInfo(ByteBufferWithInfo bbwi) {
-        impl.setByteBufferWithInfo(bbwi);
-    }
-
-    // REVISIT: was protected - but need to access from xgiop.
-    public final BufferManagerWrite getBufferManager() {
-        return impl.getBufferManager();
-    }
-
-    public final void write_fixed(java.math.BigDecimal bigDecimal, short digits, short scale) {
-        impl.write_fixed(bigDecimal, digits, scale);
-    }
-
-    public final void writeOctetSequenceTo(org.omg.CORBA.portable.OutputStream s) {
-        impl.writeOctetSequenceTo(s);
-    }
-
-    public final GIOPVersion getGIOPVersion() {
-        return impl.getGIOPVersion();
-    }
-
-    public final void writeIndirection(int tag, int posIndirectedTo) {
-        impl.writeIndirection(tag, posIndirectedTo);
-    }
-
-    // Use Latin-1 for GIOP 1.0 or when code set negotiation was not
-    // performed.
-    protected CodeSetConversion.CTBConverter createCharCTBConverter() {
-        return CodeSetConversion.impl().getCTBConverter(OSFCodeSetRegistry.ISO_8859_1);
-    }
-
-    // Subclasses must decide what to do here.  It's inconvenient to
-    // make the class and this method abstract because of dup().
-    protected abstract CodeSetConversion.CTBConverter createWCharCTBConverter();
-
-    protected final void freeInternalCaches() {
-        impl.freeInternalCaches();
-    }
-
-    void printBuffer() {
-        impl.printBuffer();
-    }
-
-    public void alignOnBoundary(int octetBoundary) {
-        impl.alignOnBoundary(octetBoundary);
-    }
-
-    // Needed by request and reply messages for GIOP versions >= 1.2 only.
-    public void setHeaderPadding(boolean headerPadding) {
-        impl.setHeaderPadding(headerPadding);
-    }
-
-    // ValueOutputStream -----------------------------
-
-    public void start_value(String rep_id) {
-        impl.start_value(rep_id);
-    }
-
-    public void end_value() {
-        impl.end_value();
-    }
-}
--- a/corba/src/share/classes/com/sun/corba/se/impl/interceptors/ThreadCurrentStack.sjava	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-/*
- * Copyright (c) 2000, 2002, 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 com.sun.corba.se.impl.interceptors;
-
-import com.sun.corba.se.impl.corba.AnyImpl;
-import org.omg.PortableInterceptor.Current;
-import org.omg.PortableInterceptor.InvalidSlot;
-
-import com.sun.corba.se.impl.util.MinorCodes;
-import com.sun.corba.se.impl.core.ORB;
-
-/**
- * ThreadCurrentStack is the container of PICurrent instances for each thread
- */
-public class ThreadCurrentStack
-{
-    // PICurrentPool is the container for reusable PICurrents
-    private class PICurrentPool {
-
-        // Contains a list of reusable PICurrents
-        private java.util.ArrayList pool;
-
-        // High water mark for the pool
-        // If the pool size reaches this limit then putPICurrent will
-        // not put PICurrent to the pool.
-        private static final int  HIGH_WATER_MARK = 5;
-
-        // currentIndex points to the last PICurrent in the list
-        private int currentIndex;
-
-        PICurrentPool( ) {
-            pool = new java.util.ArrayList( HIGH_WATER_MARK );
-            currentIndex = 0;
-        }
-
-        /**
-         * Puts PICurrent to the re-usable pool.
-         */
-        void putPICurrent( PICurrent current ) {
-            // If there are enough PICurrents in the pool, then don't add
-            // this current to the pool.
-            if( currentIndex >= HIGH_WATER_MARK ) {
-                return;
-            }
-            pool.add(currentIndex , current);
-            currentIndex++;
-        }
-
-        /**
-         * Gets PICurrent from the re-usable pool.
-         */
-        PICurrent getPICurrent( ) {
-            // If there are no entries in the pool then return null
-            if( currentIndex == 0 ) {
-                return null;
-            }
-            // Works like a stack, Gets the last one added first
-            currentIndex--;
-            return (PICurrent) pool.get(currentIndex);
-        }
-    }
-   
-    // Contains all the active PICurrents for each thread.
-    // The ArrayList is made to behave like a stack.
-    private java.util.ArrayList currentContainer;
-
-    // Keeps track of number of PICurrents in the stack.
-    private int currentIndex;
- 
-    // For Every Thread there will be a pool of re-usable ThreadCurrent's
-    // stored in PICurrentPool
-    private PICurrentPool currentPool;
-
-    // The orb associated with this ThreadCurrentStack
-    private ORB piOrb;
-
-    /**
-     * Constructs the stack and and PICurrentPool
-     */
-    ThreadCurrentStack( ORB piOrb, PICurrent current ) {
-       this.piOrb = piOrb;
-       currentIndex = 0;
-       currentContainer = new java.util.ArrayList( );
-       currentPool = new PICurrentPool( );
-       currentContainer.add( currentIndex, current );
-       currentIndex++;
-    }
-   
-
-    /**
-     * pushPICurrent goes through the following steps
-     * 1: Checks to see if there is any PICurrent in PICurrentPool
-     *    If present then use that instance to push into the ThreadCurrentStack
-     *
-     * 2:If there is no PICurrent in the pool, then creates a new one and pushes
-     *    that into the ThreadCurrentStack
-     */
-    void pushPICurrent( ) {
-        PICurrent current = currentPool.getPICurrent( );
-        if( current == null ) {
-            // get an existing PICurrent to get the slotSize
-            PICurrent currentTemp = peekPICurrent();
-            current = new PICurrent( piOrb, currentTemp.getSlotSize( ));
-        }
-        currentContainer.add( currentIndex, current );
-        currentIndex++;
-    }
-
-    /**
-     * popPICurrent does the following
-     * 1: pops the top PICurrent in the ThreadCurrentStack
-     *
-     * 2: resets the slots in the PICurrent which resets the slotvalues to
-     *    null if there are any previous sets. 
-     *
-     * 3: pushes the reset PICurrent into the PICurrentPool to reuse 
-     */
-    void  popPICurrent( ) {
-        // Do not pop the PICurrent, If there is only one.
-        // This should not happen, But an extra check for safety.
-        if( currentIndex <= 1 ) {
-            throw new org.omg.CORBA.INTERNAL( 
-                      "Cannot pop the only PICurrent in the stack",
-		      MinorCodes.CANT_POP_ONLY_CURRENT_2,
-		      CompletionStatus.COMPLETED_NO );
-        }
-        currentIndex--;
-        PICurrent current = (PICurrent)currentContainer.get( currentIndex );
-        current.resetSlots( );
-        currentPool.putPICurrent( current );
-    }
-
-    /**
-     * peekPICurrent gets the top PICurrent in the ThreadCurrentStack without
-     * popping.
-     */
-    PICurrent peekPICurrent( ) {
-       return (PICurrent) currentContainer.get( currentIndex - 1);
-    }
-
-}
--- a/corba/src/share/classes/com/sun/corba/se/impl/orbutil/DefineWrapper.sjava	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-/*
- * Copyright (c) 2001, 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.  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 com.sun.corba.se.impl.orbutil ;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-
-/** This class provides just a main method.  Its purpose is to allow -D arguments to
-* set up the system properties when starting programs with tools like OptimizeIt that
-* make this difficult or impossible.
-*
-* Invocation: {java launcher of some kind} DefineClass -Dxxx=yyy -Dxxx=yyy ... {class name} arg0, arg1, ...
-* Result: updates system properties with -D args, then uses reflection to invoke {class name}.main with the args
-*/
-
-class DefineWrapper {
-    public static void main( String[] args )
-    {
-	int numberDefines = args.length ;
-	String className = null ;
-
-	for (int ctr=0; ctr<args.length; ctr++ ) {
-	    String arg = args[ctr] ;
-
-	    if ((arg.charAt(0) == '-') && (arg.charAt(1) == 'D')) {
-		int eqIndex =  arg.indexOf( '=' ) ;
-		if (eqIndex < 0)
-		    throw new Exception( arg + " is not a valid property assignment" ) ;
-
-		final String key = arg.subString( 2, eqIndex ) ;
-		final String value = arg.subStrung( eqIndex + 1 ) ;
-
-		AccessController.doPrivileged( new PrivilegedAction() {
-			public Object run() {
-			    System.setProperty( key, value ) ;
-			    return null ;
-			}
-		    } ) ;
-	    } else {
-		numberDefines = ctr ;
-		className = arg ;
-		break ;
-	    }
-	}
-
-	if (numberDefines < args.length) {
-	    Class cls = getMainClass( className ) ;
-	    Method mainMethod = getMainMethod( cls ) ;
-
-	    String[] newArgs = new String[ args.length - numberDefines ] ;
-	    for (int ctr = numberDefines+1; ctr<args.length; ctr++ ) {
-		newArgs[ ctr-numberDefines-1 ] = args[ ctr ] ;
-	    }
-		
-	    // build args to the main and call it
-	    Object params [] = new Object [1];
-	    params[0] = newArgs;
-	    mainMethod.invoke(null, params);
-	} else {
-	    throw new Exception( "No class name given" ) ;
-	}
-    }
-
-    private static Class getMainClass( String name ) 
-    {
-	// determine the class loader to be used for loading the class
-	// since ServerMain is going to be in JDK and we need to have this
-	// class to load application classes, this is required here.
-	ClassLoader cl = Thread.currentThread().getContextClassLoader();
-
-	if (cl == null)
-	    cl = ClassLoader.getSystemClassLoader();
-
-	try {
-	    // determine the main class, try loading with current class loader
-	    cls = Class.forName( className ) ;
-	} catch (ClassNotFoundException ex) {
-	    // eat the exception and try to load using SystemClassLoader
-	    cls = Class.forName( className, true, cl);
-	}
-    }
-
-    private static Method getMainMethod( Class serverClass ) 
-    {
-	Class argTypes[] = new Class[] { String[].class } ;
-	Method method = null ;
-
-	try {
-	    method = serverClass.getDeclaredMethod( "main", argTypes ) ;
-	} catch (Exception exc) {
-	    throw new Exception( "Could not get main() method: " + exc ) ;
-	} 
-
-	if (!isPublicStaticVoid( method ))
-	    throw new Exception( "Main method is not public static void" ) ;
-	
-	return method ;
-    }
-
-    private static boolean isPublicStaticVoid( Method method ) 
-    {
-	// check modifiers: public static
-	int modifiers =  method.getModifiers ();
-	if (!Modifier.isPublic (modifiers) || !Modifier.isStatic (modifiers)) {
-	    logError( method.getName() + " is not public static" ) ;
-	    return false ;
-	}
-
-	// check return type and exceptions
-	if (method.getExceptionTypes ().length != 0) {
-	    logError( method.getName() + " declares exceptions" ) ;
-	    return false ;
-	}
-
-	if (!method.getReturnType().equals (Void.TYPE)) {
-	    logError( method.getName() + " does not have a void return type" ) ;
-	    return false ;
-	}
-
-	return true ;
-    }
-}
--- a/corba/src/share/classes/com/sun/corba/se/impl/presentation/rmi/IDLNameTranslatorImpl_save.sjava	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,909 +0,0 @@
-/*
- * Copyright (c) 2004, 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 com.sun.corba.se.impl.presentation.rmi ;
-
-import java.lang.reflect.Method;
-
-import java.math.BigInteger;
-
-import java.util.Map;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.HashMap;
-import java.util.StringTokenizer;
-
-import com.sun.corba.se.spi.presentation.rmi.IDLNameTranslator ;
-
-import com.sun.corba.se.impl.presentation.rmi.IDLType ;
-import com.sun.corba.se.impl.presentation.rmi.IDLTypeException ;
-import com.sun.corba.se.impl.presentation.rmi.IDLTypesUtil ;
-import com.sun.corba.se.impl.orbutil.ObjectUtility ;
-
-/**
- * Bidirectional translator between RMI-IIOP interface methods and
- * and IDL Names.
- */
-public class IDLNameTranslatorImpl implements IDLNameTranslator {
-
-    // From CORBA Spec, Table 6 Keywords.
-    // Note that since all IDL identifiers are case 
-    // insensitive, java identifier comparisons to these
-    // will be case insensitive also.
-    private static String[] IDL_KEYWORDS = {
-
-        "abstract", "any", "attribute", "boolean", "case", "char",
-        "const", "context", "custom", "default", "double", "enum",
-        "exception", "factory", "FALSE", "fixed", "float", "in", "inout",
-        "interface", "long", "module", "native", "Object", "octet",
-        "oneway", "out", "private", "public", "raises", "readonly", "sequence",
-        "short", "string", "struct", "supports", "switch", "TRUE", "truncatable",
-        "typedef", "unsigned", "union", "ValueBase", "valuetype", "void",
-	"wchar", "wstring"
-
-    };
-
-    private static char[] HEX_DIGITS = {
-        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-        'A', 'B', 'C', 'D', 'E', 'F' 
-    };
-    
-    private static final String UNDERSCORE = "_";
-
-    // used to mangle java inner class names
-    private static final String INNER_CLASS_SEPARATOR =
-        UNDERSCORE + UNDERSCORE;
-
-    // used to form IDL array type names
-    private static final String[] BASE_IDL_ARRAY_MODULE_TYPE=
-	new String[] { "org", "omg", "boxedRMI" } ;
-
-    private static final String BASE_IDL_ARRAY_ELEMENT_TYPE = "seq";
-
-    // used to mangling java identifiers that have a leading underscore
-    private static final String LEADING_UNDERSCORE_CHAR = "J";
-    private static final String ID_CONTAINER_CLASH_CHAR = UNDERSCORE;
-
-    // separator used between types in a mangled overloaded method name
-    private static final String OVERLOADED_TYPE_SEPARATOR = 
-        UNDERSCORE + UNDERSCORE;
-
-    // string appended to attribute if it clashes with a method name
-    private static final String ATTRIBUTE_METHOD_CLASH_MANGLE_CHARS =
-        UNDERSCORE + UNDERSCORE;
-
-    private static Set idlKeywords_;
-
-    static {
-        
-        idlKeywords_ = new HashSet();
-        for(int i = 0; i < IDL_KEYWORDS.length; i++) {
-            String next = (String) IDL_KEYWORDS[i];
-            // Convert keyword to all caps to ease equality
-            // check.
-            String keywordAllCaps = next.toUpperCase();
-            idlKeywords_.add(keywordAllCaps);
-        }
-
-    }
-
-    //
-    // Instance state
-    //
-    
-    // Remote interface for name translation.  
-    private Class[] interf_;
-
-    // Maps used to hold name translations.  These do not need to be
-    // synchronized since the translation is never modified after
-    // initialization.
-    private Map methodToIDLNameMap_;
-    private Map IDLNameToMethodMap_;
-    private Method[] methods_;
-    
-    /**
-     * Return an IDLNameTranslator for the given interface.  
-     *
-     * @throws IllegalStateException if given class is not a valid 
-     *         RMI/IIOP Remote Interface
-     */
-    public static IDLNameTranslator get( Class interf )
-    {
-        
-        return new IDLNameTranslatorImpl(new Class[] { interf } );
-
-    }
-
-    /**
-     * Return an IDLNameTranslator for the given interfacex.  
-     *
-     * @throws IllegalStateException if given classes are not  valid 
-     *         RMI/IIOP Remote Interfaces
-     */
-    public static IDLNameTranslator get( Class[] interfaces )
-    {
-        
-        return new IDLNameTranslatorImpl(interfaces );
-
-    }
-
-    public static String getExceptionId( Class cls ) 
-    {
-	// Requirements for this method:
-	// 1. cls must be an exception but not a RemoteException.
-	// 2. If cls has an IDL keyword name, an underscore is prepended (1.3.2.2).
-	// 3. If cls jas a leading underscore, J is prepended (1.3.2.3).
-	// 4. If cls has an illegal IDL ident char, it is mapped to UXXXX where
-	//    XXXX is the unicode value in hex of the char (1.3.2.4).
-	// 5. double underscore for inner class (1.3.2.5).
-	// 6. The ID is "IDL:" + name with / separators + ":1.0".
-	IDLType itype = classToIDLType( cls ) ;
-	return itype.getExceptionName() ;
-    }
-
-    public Class[] getInterfaces()
-    {
-        return interf_;
-    }
-
-    public Method[] getMethods()
-    {
-	return methods_ ;
-    }
-
-    public Method getMethod( String idlName ) 
-    {
-        return (Method) IDLNameToMethodMap_.get(idlName);
-    }
-
-    public String getIDLName( Method method ) 
-    {
-        return (String) methodToIDLNameMap_.get(method);
-    }
-
-    /**
-     * Initialize an IDLNameTranslator for the given interface.  
-     *
-     * @throws IllegalStateException if given class is not a valid 
-     *         RMI/IIOP Remote Interface
-     */
-    private IDLNameTranslatorImpl(Class[] interfaces) 
-    {
-
-        try {
-            IDLTypesUtil idlTypesUtil = new IDLTypesUtil();
-	    for (int ctr=0; ctr<interfaces.length; ctr++)
-		idlTypesUtil.validateRemoteInterface(interfaces[ctr]);
-            interf_ = interfaces;
-            buildNameTranslation();
-        } catch( IDLTypeException ite) {
-            String msg = ite.getMessage();
-            IllegalStateException ise = new IllegalStateException(msg);
-            ise.initCause(ite);
-            throw ise;
-        }
-    }
-
-    private void buildNameTranslation() 
-    {
-	// holds method info, keyed by method
-	Map allMethodInfo = new HashMap() ;
-
-	for (int ctr=0; ctr<interf_.length; ctr++) {
-	    Class interf = interf_[ctr] ;
-
-	    IDLTypesUtil idlTypesUtil = new IDLTypesUtil();
-	    Method[] methods = interf.getMethods();
-
-	    // Take an initial pass through all the methods and create some
-	    // information that will be used to track the IDL name 
-	    // transformation.
-	    for(int i = 0; i < methods.length; i++) {
-		
-		Method nextMethod = methods[i];
-
-		IDLMethodInfo methodInfo = new IDLMethodInfo();
-
-		methodInfo.method = nextMethod;           
-
-		methodInfo.propertyType = 
-		    idlTypesUtil.propertyAccessorMethodType(
-			nextMethod, interf ) ;
-
-		if (methodInfo.propertyType != null) {
-		    String attributeName = idlTypesUtil.
-			getAttributeNameForProperty(nextMethod.getName());
-		    methodInfo.originalName = attributeName;
-		    methodInfo.mangledName  = attributeName;               
-		} else {
-		    methodInfo.originalName = nextMethod.getName();
-		    methodInfo.mangledName  = nextMethod.getName();
-		}
-		
-		allMethodInfo.put(nextMethod, methodInfo);
-	    }
-	}
-
-	// Check for having both is<NAME> and get<NAME> methods.
-
-	
-        //
-        // Perform case sensitivity test first.  This applies to all
-        // method names AND attributes.  Compare each method name and 
-        // attribute to all other method names and attributes.  If names 
-        // differ only in case, apply mangling as defined in section 1.3.2.7
-        // of Java2IDL spec.  Note that we compare using the original names.
-        //
-        for(Iterator outerIter=allMethodInfo.values().iterator();
-            outerIter.hasNext();) {
-            IDLMethodInfo outer = (IDLMethodInfo) outerIter.next();           
-            for(Iterator innerIter = allMethodInfo.values().iterator(); 
-                innerIter.hasNext();) {
-                IDLMethodInfo inner = (IDLMethodInfo) innerIter.next();
-
-                if( (outer != inner) &&
-                    (!outer.originalName.equals(inner.originalName)) &&
-                    outer.originalName.equalsIgnoreCase(inner.originalName) ) {
-                    outer.mangledName = 
-                        mangleCaseSensitiveCollision(outer.originalName);
-                    break;
-                }
-
-            }
-        }
-                   
-        for(Iterator iter = allMethodInfo.values().iterator(); 
-            iter.hasNext();) {
-            IDLMethodInfo next = (IDLMethodcurrentInfo) iter.next();           
-            next.mangledName = 
-                mangleIdentifier(next.mangledName, 
-		    next.propertyType != null);
-        }         
-
-        //
-        // Now check for overloaded method names and apply 1.3.2.6.
-        //
-        for(Iterator outerIter=allMethodInfo.values().iterator();
-            outerIter.hasNext();) {
-            IDLMethodInfo outer = (IDLMethodInfo) outerIter.next();
-            if (outer.propertyType != null) {
-                continue;
-            }
-            for(Iterator innerIter = allMethodInfo.values().iterator(); 
-                innerIter.hasNext();) {
-                IDLMethodInfo inner = (IDLMethodInfo) innerIter.next();
-
-                if( (outer != inner) &&
-                    (inner.propertyType == null) &&
-                    outer.originalName.equals(inner.originalName) ) {
-                    outer.mangledName = mangleOverloadedMethod
-                        (outer.mangledName, outer.method);
-                    break;
-                }
-            }
-        }
-       
-        //
-        // Now mangle any properties that clash with method names.
-        //
-        for(Iterator outerIter=allMethodInfo.values().iterator();
-            outerIter.hasNext();) {
-            IDLMethodInfo outer = (IDLMethodInfo) outerIter.next();
-            if(outer.propertyType == null) {
-                continue;
-            }
-            for(Iterator innerIter = allMethodInfo.values().iterator(); 
-                innerIter.hasNext();) {
-                IDLMethodInfo inner = (IDLMethodInfo) innerIter.next();
-                if( (outer != inner) &&
-                    (inner.propertyType == null) &&
-                    outer.mangledName.equals(inner.mangledName) ) {
-                    outer.mangledName = outer.mangledName + 
-                        ATTRIBUTE_METHOD_CLASH_MANGLE_CHARS;
-                    break;
-                }
-            }
-        }
-
-        //
-        // Ensure that no mapped method names clash with mapped name
-        // of container(1.3.2.9).  This is a case insensitive comparison.
-        //
-	for (int ctr=0; ctr<interf_.length; ctr++ ) {
-	    Class interf = interf_[ctr] ;
-	    String mappedContainerName = getMappedContainerName(interf);
-	    for(Iterator iter = allMethodInfo.values().iterator(); 
-		iter.hasNext();) {
-		IDLMethodInfo next = (IDLMethodInfo) iter.next();           
-		if( (next.propertyType == null) &&
-		    identifierClashesWithContainer(mappedContainerName, 
-						   next.mangledName)) {
-		    next.mangledName = mangleContainerClash(next.mangledName);
-		}
-	    }         
-	}
-
-        //
-        // Populate name translation maps.
-        //
-        methodToIDLNameMap_ = new HashMap();
-        IDLNameToMethodMap_ = new HashMap();
-	methods_ = (Method[])allMethodInfo.keySet().toArray( 
-	    new Method[0] ) ;
-
-        for(Iterator iter = allMethodInfo.values().iterator(); 
-            iter.hasNext();) {
-            IDLMethodInfo next = (IDLMethodInfo) iter.next();           
-            String idlName = next.mangledName;
-            if (next.propertyType != null) {                
-		idlName = javaPropertyPrefixToIDL( next.propertyType ) +
-		    next.mangledName ;
-            }
-            
-            methodToIDLNameMap_.put(next.method, idlName);
-
-            // Final check to see if there are any clashes after all the
-            // manglings have been applied.  If so, this is treated as an
-            // invalid interface.  Currently, we do a CASE-SENSITIVE 
-            // comparison since that matches the rmic behavior.  
-            // @@@ Shouldn't this be a case-insensitive check?
-	    // If there is a collision between is<TYPE> and get<TYPE>,
-	    // map only is<TYPE> to an attribute, and leave the
-	    // get<TYPE> method alone.
-            if( IDLNameToMethodMap_.containsKey(idlName) ) {
-                // @@@ I18N
-                Method clash = (Method) IDLNameToMethodMap_.get(idlName);
-		MethodInfo clashMethodInfo = 
-		    (MethodInfo)allMethodInfo.get( clash ) ;
-		if (clashMethodInfo.isBooleanProperty() &&
-		    next.isReadProperty()) {
-		    // fix idlName
-		} else if (clashMethodInfo.isReadProperty() &&
-		    next.isBooleanProperty()) {
-		    // Remove entry under idlName
-		    // put entry into table under correct name
-		} else {
-		    throw new IllegalStateException("Error : methods " + 
-			clash + " and " + next.method + 
-			" both result in IDL name '" + idlName + "'");
-		}
-            } 
-
-	    IDLNameToMethodMap_.put(idlName, next.method);
-        }
-
-        return;
-
-    }
-
-    
-    /**
-     * Perform all necessary stand-alone identifier mangling operations
-     * on a java identifier that is being transformed into an IDL name.
-     * That is, mangling operations that don't require looking at anything
-     * else but the identifier itself.  This covers sections 1.3.2.2, 1.3.2.3, 
-     * and 1.3.2.4 of the Java2IDL spec.  Method overloading and 
-     * case-sensitivity checks are handled elsewhere.
-     */
-
-    private static String mangleIdentifier(String identifier) {
-        return mangleIdentifier(identifier, false);
-    }
-
-    private static String mangleIdentifier(String identifier, boolean attribute) {
-
-        String mangledName = identifier;
-
-        //
-        // Apply leading underscore test (1.3.2.3) 
-        // This should be done before IDL Keyword clash test, since clashing 
-        // IDL keywords are mangled by adding a leading underscore.
-        //
-        if( hasLeadingUnderscore(mangledName) ) {
-            mangledName = mangleLeadingUnderscore(mangledName);            
-        }         
-        
-        //
-        // Apply IDL keyword clash test (1.3.2.2).
-        // This is not needed for attributes since when the full property 
-        // name is composed it cannot clash with an IDL keyword.
-        // (Also, rmic doesn't do it.)
-        //
-        
-        if( !attribute && isIDLKeyword(mangledName) ) {
-            mangledName = mangleIDLKeywordClash(mangledName);           
-        } 
-
-        //
-        // Replace illegal IDL identifier characters (1.3.2.4) 
-        // for all method names and attributes.
-        //
-        if( !isIDLIdentifier(mangledName) ) {
-            mangledName = mangleUnicodeChars(mangledName);
-        }       
-        
-        return mangledName;
-    }
-
-    /**
-     * Checks whether a java identifier clashes with an
-     * IDL keyword.  Note that this is a case-insensitive
-     * comparison.
-     *
-     * Used to implement section 1.3.2.2 of Java2IDL spec.
-     */ 
-    private static boolean isIDLKeyword(String identifier) {
-        
-        String identifierAllCaps = identifier.toUpperCase();
-
-        return idlKeywords_.contains(identifierAllCaps);
-    }
-
-    private static String mangleIDLKeywordClash(String identifier) {
-        return UNDERSCORE + identifier;
-    }
-
-    private static String mangleLeadingUnderscore(String identifier) {
-        return LEADING_UNDERSCORE_CHAR + identifier;
-    }
-
-    /**
-     * Checks whether a java identifier starts with an underscore.
-     * Used to implement section 1.3.2.3 of Java2IDL spec.
-     */
-    private static boolean hasLeadingUnderscore(String identifier) {
-        return identifier.startsWith(UNDERSCORE);
-    }
-
-    /**
-     * Implements Section 1.3.2.4 of Java2IDL Mapping.
-     * All non-IDL identifier characters must be replaced
-     * with their Unicode representation.
-     */
-    static String mangleUnicodeChars(String identifier) {
-        StringBuffer mangledIdentifier = new StringBuffer();
-
-        for(int i = 0; i < identifier.length(); i++) {
-            char nextChar = identifier.charAt(i);
-            if( isIDLIdentifierChar(nextChar) ) {
-                mangledIdentifier.append(nextChar);
-            } else {
-                String unicode = charToUnicodeRepresentation(nextChar);
-                mangledIdentifier.append(unicode);
-            }
-        }
-        
-        return mangledIdentifier.toString();
-    }
-
-    /**
-     * Implements mangling portion of Section 1.3.2.7 of Java2IDL spec.
-     * This method only deals with the actual mangling.  Decision about 
-     * whether case-sensitive collision mangling is required is made 
-     * elsewhere.
-     * 
-     * 
-     * "...a mangled name is generated consisting of the original name 
-     * followed by an underscore separated list of decimal indices 
-     * into the string, where the indices identify all the upper case 
-     * characters in the original string. Indices are zero based."
-     *
-     */ 
-    String mangleCaseSensitiveCollision(String identifier) {
-
-        StringBuffer mangledIdentifier = new StringBuffer(identifier);
-
-        // There is always at least one trailing underscore, whether or 
-        // not the identifier has uppercase letters.
-        mangledIdentifier.append(UNDERSCORE);
-
-        boolean needUnderscore = false;
-        for(int i = 0; i < identifier.length(); i++) {
-            char next = identifier.charAt(i);
-            if( Character.isUpperCase(next) ) {
-                // This bit of logic is needed to ensure that we have
-                // an underscore separated list of indices but no 
-                // trailing underscores.  Basically, after we have at least
-                // one uppercase letter, we always put an undercore before
-                // printing the next one.
-                if( needUnderscore ) {
-                    mangledIdentifier.append(UNDERSCORE);
-                }
-                mangledIdentifier.append(i);
-                needUnderscore = true;
-            }
-        }
-
-        return mangledIdentifier.toString();
-    }
-
-    private static String mangleContainerClash(String identifier) {
-        return identifier + ID_CONTAINER_CLASH_CHAR;
-    }
-
-    /**
-     * Implements Section 1.3.2.9 of Java2IDL Mapping. Container in this
-     * context means the name of the java Class(excluding package) in which 
-     * the identifier is defined.  Comparison is case-insensitive.
-     */
-    private static boolean identifierClashesWithContainer
-        (String mappedContainerName, String identifier) {
-
-        return identifier.equalsIgnoreCase(mappedContainerName);
-    }
-
-    /**
-     * Returns Unicode mangling as defined in Section 1.3.2.4 of
-     * Java2IDL spec.
-     *
-     * "For Java identifiers that contain illegal OMG IDL identifier 
-     * characters such as '$' or Unicode characters outside of ISO Latin 1,
-     * any such illegal characters are replaced by "U" followed by the
-     * 4 hexadecimal characters(in upper case) representing the Unicode
-     * value.  So, the Java name a$b is mapped to aU0024b and 
-     * x\u03bCy is mapped to xU03BCy."
-     */
-    public static String charToUnicodeRepresentation(char c) {
-        
-        int orig = (int) c;
-        StringBuffer hexString = new StringBuffer();
-        
-        int value = orig;
-
-        while( value > 0 ) {
-            int div = value / 16;
-            int mod = value % 16;
-            hexString.insert(0, HEX_DIGITS[mod]);
-            value = div;
-        }
-
-        int numZerosToAdd = 4 - hexString.length();
-        for(int i = 0; i < numZerosToAdd; i++) {
-            hexString.insert(0, "0");
-        }
-
-        hexString.insert(0, "U");
-        return hexString.toString();
-    }
-
-    private static boolean isIDLIdentifier(String identifier) {
-
-        boolean isIdentifier = true;
-
-        for(int i = 0; i < identifier.length(); i++) {
-            char nextChar = identifier.charAt(i);
-            // 1st char must be alphbetic.
-            isIdentifier  = (i == 0) ?
-                isIDLAlphabeticChar(nextChar) : 
-                isIDLIdentifierChar(nextChar);
-            if( !isIdentifier ) {
-                break;
-            }
-        }
-
-        return isIdentifier;
-        
-    }
-
-    private static boolean isIDLIdentifierChar(char c) {
-        return (isIDLAlphabeticChar(c) || 
-                isIDLDecimalDigit(c)   ||
-                isUnderscore(c));
-    }
-
-    /**
-     * True if character is one of 114 Alphabetic characters as
-     * specified in Table 2 of Chapter 3 in CORBA spec.
-     */ 
-    private static boolean isIDLAlphabeticChar(char c) {
-
-        // NOTE that we can't use the java.lang.Character
-        // isUpperCase, isLowerCase, etc. methods since they
-        // include many characters other than the Alphabetic list in
-        // the CORBA spec.  Instead, we test for inclusion in the
-        // Unicode value ranges for the corresponding legal characters.
-
-        boolean alphaChar = 
-            (
-             // A - Z
-             ((c >= 0x0041) && (c <= 0x005A)) 
-
-             ||
-             
-             // a - z
-             ((c >= 0x0061) && (c <= 0x007A)) 
-             
-             ||
-             
-             // other letter uppercase, other letter lowercase, which is
-             // the entire upper half of C1 Controls except X and /
-             ((c >= 0x00C0) && (c <= 0x00FF)
-              && (c != 0x00D7) && (c != 0x00F7)));
-        
-        return alphaChar;
-    }
-
-    /**
-     * True if character is one of 10 Decimal Digits 
-     * specified in Table 3 of Chapter 3 in CORBA spec.
-     */ 
-    private static boolean isIDLDecimalDigit(char c) {
-        return ( (c >= 0x0030) && (c <= 0x0039) );
-    }
-
-    private static boolean isUnderscore(char c) {
-        return ( c == 0x005F );
-    }
-    
-    /**
-     * Mangle an overloaded method name as defined in Section 1.3.2.6 of
-     * Java2IDL spec.  Current value of method name is passed in as argument.
-     * We can't start from original method name since the name might have
-     * been partially mangled as a result of the other rules.  
-     */
-    private static String mangleOverloadedMethod(String mangledName, Method m) {
-
-        IDLTypesUtil idlTypesUtil = new IDLTypesUtil();
-
-        // Start by appending the separator string
-        String newMangledName = mangledName + OVERLOADED_TYPE_SEPARATOR;
-        
-        Class[] parameterTypes = m.getParameterTypes();
-        
-        for(int i = 0; i < parameterTypes.length; i++) {
-            Class nextParamType = parameterTypes[i];
-            
-            if( i > 0 ) {
-                newMangledName = newMangledName + OVERLOADED_TYPE_SEPARATOR;
-            }            
-            IDLType idlType = classToIDLType(nextParamType);
-
-            String moduleName = idlType.getModuleName();
-            String memberName = idlType.getMemberName();
-
-            String typeName = (moduleName.length() > 0) ?
-                moduleName + UNDERSCORE + memberName : memberName;
-                                   
-            if( !idlTypesUtil.isPrimitive(nextParamType) && 
-                (idlTypesUtil.getSpecialCaseIDLTypeMapping(nextParamType) 
-                 == null) &&               
-                isIDLKeyword(typeName) ) {
-                typeName = mangleIDLKeywordClash(typeName);
-            }
-
-            typeName = mangleUnicodeChars(typeName);
-
-            newMangledName = newMangledName + typeName;
-        }        
-
-        return newMangledName;        
-    }
-
-
-    private static IDLType classToIDLType(Class c) {
-               
-        IDLType idlType = null;
-        IDLTypesUtil idlTypesUtil = new IDLTypesUtil();
-
-        if( idlTypesUtil.isPrimitive(c) ) {
-
-            idlType = idlTypesUtil.getPrimitiveIDLTypeMapping(c);
-
-        } else if( c.isArray() ) {
-            
-            // Calculate array depth, as well as base element type.
-            Class componentType = c.getComponentType();
-            int numArrayDimensions = 1;
-            while(componentType.isArray()) {
-                componentType = componentType.getComponentType();
-                numArrayDimensions++;
-            }
-            IDLType componentIdlType = classToIDLType(componentType);
-            
-            String[] modules = BASE_IDL_ARRAY_MODULE_TYPE;
-            if( componentIdlType.hasModule() ) {
-                modules = (String[])ObjectUtility.concatenateArrays( modules, 
-                    componentIdlType.getModules() ) ;
-            }
-
-            String memberName = BASE_IDL_ARRAY_ELEMENT_TYPE + 
-                numArrayDimensions + UNDERSCORE + 
-                componentIdlType.getMemberName();                
-            
-            idlType = new IDLType(c, modules, memberName);
-               
-        } else {
-            idlType = idlTypesUtil.getSpecialCaseIDLTypeMapping(c);
-
-            if (idlType == null) {
-                // Section 1.3.2.5 of Java2IDL spec defines mangling rules for
-                // inner classes.
-                String memberName = getUnmappedContainerName(c);
-
-                // replace inner class separator with double underscore
-                memberName = memberName.replaceAll("\\$", 
-                                                   INNER_CLASS_SEPARATOR);
-                                
-                if( hasLeadingUnderscore(memberName) ) {
-                    memberName = mangleLeadingUnderscore(memberName);
-                }                    
-
-                // Get raw package name.  If there is a package, it
-                // will still have the "." separators and none of the
-                // mangling rules will have been applied.
-                String packageName = getPackageName(c);                 
-                
-                if (packageName == null) {
-		    idlType = new IDLType( c, memberName ) ;
-		} else {
-		    // If this is a generated IDL Entity Type we need to
-		    // prepend org_omg_boxedIDL per sections 1.3.5 and 1.3.9
-		    if (idlTypesUtil.isEntity(c)) {
-			packageName = "org.omg.boxedIDL." + packageName ;
-		    }
-		    
-		    // Section 1.3.2.1 and 1.3.2.6 of Java2IDL spec defines 
-		    // rules for mapping java packages to IDL modules and for 
-		    // mangling module name portion of type name.  NOTE that
-		    // of the individual identifier mangling rules, 
-		    // only the leading underscore test is done here.  
-		    // The other two(IDL Keyword, Illegal Unicode chars) are
-		    // done in mangleOverloadedMethodName.  
-                    StringTokenizer tokenizer = 
-                        new StringTokenizer(packageName, ".");
-		    
-		    String[] modules = new String[ tokenizer.countTokens() ] ;
-		    int index = 0 ;
-                    while (tokenizer.hasMoreElements()) {
-                        String next = tokenizer.nextToken();
-                        String nextMangled = hasLeadingUnderscore(next) ?
-                            mangleLeadingUnderscore(next) : next;
-
-			modules[index++] = nextMangled ;
-                    }                                                          
-
-		    idlType = new IDLType(c, modules, memberName);
-                }
-            }
-        }
-
-        return idlType;
-    }
-
-    /**
-     * Return Class' package name or null if there is no package.
-     */
-    private static String getPackageName(Class c) {
-        Package thePackage = c.getPackage();
-        String packageName = null;
-
-        // Try to get package name by introspection.  Some classloaders might
-        // not provide this information, so check for null.
-        if( thePackage != null ) {
-            packageName = thePackage.getName();
-        } else {
-            // brute force method
-            String fullyQualifiedClassName = c.getName();
-            int lastDot = fullyQualifiedClassName.indexOf('.');
-            packageName = (lastDot == -1) ? null :
-                fullyQualifiedClassName.substring(0, lastDot);
-        }
-        return packageName;
-    }
-    
-    private static String getMappedContainerName(Class c) {
-        String unmappedName = getUnmappedContainerName(c);
-
-        return mangleIdentifier(unmappedName);
-    }
-
-    /**
-     * Return portion of class name excluding package name.
-     */
-    private static String getUnmappedContainerName(Class c) {
-
-        String memberName  = null;
-        String packageName = getPackageName(c);
-
-        String fullyQualifiedClassName = c.getName();
-               
-        if( packageName != null ) {
-            int packageLength = packageName.length();
-            memberName = fullyQualifiedClassName.substring(packageLength + 1);
-        } else {
-            memberName = fullyQualifiedClassName;
-
-        }
-
-        return memberName;
-    }
-
-    /**
-     * Internal helper class for tracking information related to each
-     * interface method while we're building the name translation table.
-     */
-    private static class IDLMethodInfo 
-    {
-        public Method method;
-        public String propertyType;
-        
-        // If this is a property, originalName holds the original 
-        // attribute name. Otherwise, it holds the original method name.
-        public String originalName;
-
-        // If this is a property, mangledName holds the mangled attribute 
-        // name. Otherwise, it holds the mangled method name. 
-        public String mangledName;        
-
-    }
-
-    public String toString() {
-
-        StringBuffer contents = new StringBuffer();
-        contents.append("IDLNameTranslator[" );
-	for( int ctr=0; ctr<interf_.length; ctr++) {
-	    if (ctr != 0)
-		contents.append( " " ) ;
-	    contents.append( interf_[ctr].getName() ) ;
-	}
-        contents.append("]\n");
-        for(Iterator iter = methodToIDLNameMap_.keySet().iterator();
-            iter.hasNext();) {
-
-            Method method  = (Method) iter.next();
-            String idlName = (String) methodToIDLNameMap_.get(method);
-
-            contents.append(idlName + ":" + method + "\n");
-
-        }
-
-        return contents.toString();
-    }
-
-    public static void main(String[] args) {
-        
-        Class remoteInterface = java.rmi.Remote.class;
-        
-        if( args.length > 0 ) {
-            String className = args[0];
-            try {
-                remoteInterface = Class.forName(className);
-            } catch(Exception e) {
-                e.printStackTrace();
-                System.exit(-1);
-            }            
-        }
-        
-        System.out.println("Building name translation for " + remoteInterface);
-        try {
-            IDLNameTranslator nameTranslator = 
-                IDLNameTranslatorImpl.get(remoteInterface);
-            System.out.println(nameTranslator);
-        } catch(IllegalStateException ise) {
-            ise.printStackTrace();
-        }
-    }
-}
--- a/corba/src/share/classes/com/sun/corba/se/impl/presentation/rmi/IDLTypesUtil_save.sjava	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,544 +0,0 @@
-/*
- * Copyright (c) 2004, 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.  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 com.sun.corba.se.impl.presentation.rmi ;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Field;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Iterator;
-
-/**
- * Utility class for testing RMI/IDL Types as defined in
- * Section 1.2 of The Java Language to IDL Mapping.  Note that
- * these are static checks only.  Runtime checks, such as those
- * described in Section 1.2.3, #3, are not covered.
- */
-public class IDLTypesUtil {
-
-    public static final String JAVA_GET_PROPERTY_PREFIX = "get";
-    public static final String JAVA_SET_PROPERTY_PREFIX = "set";
-    public static final String JAVA_IS_PROPERTY_PREFIX  = "is";
-
-    public static final int VALID_TYPE   = 0;
-    public static final int INVALID_TYPE = 1;
-
-    /**
-     * Validate a class to ensure it conforms to the rules for a
-     * Java RMI/IIOP interface.
-     *
-     * @throws IDLTypeException if not a valid RMI/IIOP interface.
-     */
-    public void validateRemoteInterface(Class c) throws IDLTypeException
-    {
-        if( c == null ) {
-            throw new IllegalArgumentException();
-        } 
-
-        if( !c.isInterface() ) {
-            String msg = "Class " + c + " must be a java interface.";
-            throw new IDLTypeException(msg);
-        }
-
-        if( !java.rmi.Remote.class.isAssignableFrom(c) ) {
-            String msg = "Class " + c + " must extend java.rmi.Remote, " +
-                "either directly or indirectly.";
-            throw new IDLTypeException(msg);
-        }
-
-        // Get all methods, including super-interface methods.
-        Method[] methods = c.getMethods();
-        
-        for(int i = 0; i < methods.length; i++) {
-            Method next = methods[i];
-            validateExceptions(next);
-        }
-        
-	// Removed because of bug 4989053
-        // validateDirectInterfaces(c);
-        validateConstants(c);
-
-        return;
-    }
-
-    public boolean isRemoteInterface(Class c)     
-    {
-        boolean remoteInterface = true;
-        try {
-            validateRemoteInterface(c);
-        } catch(IDLTypeException ite) {
-            remoteInterface = false;
-        }
-
-        return remoteInterface;
-    }
-
-    /**
-     * Section 1.2.2 Primitive Types
-     */ 
-    public boolean isPrimitive(Class c) 
-    {
-        if( c == null ) {
-            throw new IllegalArgumentException();
-        } 
-
-        return c.isPrimitive();
-    }
-
-    /**
-     * Section 1.2.4
-     */
-    public boolean isValue(Class c) 
-    {
-        if( c == null ) {
-            throw new IllegalArgumentException();
-        } 
-
-        return 
-            (!c.isInterface() &&
-             java.io.Serializable.class.isAssignableFrom(c) &&
-             !java.rmi.Remote.class.isAssignableFrom(c));
-    }
-
-    /**
-     * Section 1.2.5
-     */
-    public boolean isArray(Class c) 
-    {
-        boolean arrayType = false;
-
-        if( c == null ) {
-            throw new IllegalArgumentException();
-        } 
-
-        if( c.isArray() ) {
-            Class componentType = c.getComponentType();
-            arrayType =
-                (isPrimitive(componentType) || isRemoteInterface(componentType) ||
-                 isEntity(componentType) || isException(componentType) || 
-		 isValue(componentType) || isObjectReference(componentType) );
-        }
-
-        return arrayType;
-    }
-
-    /**
-     * Section 1.2.6
-     */
-    public boolean isException(Class c) 
-    {
-        if( c == null ) {
-            throw new IllegalArgumentException();
-        } 
-
-        // Must be a checked exception, not including RemoteException or
-        // its subclasses.
-        return isCheckedException(c) && !isRemoteException(c) && isValue(c);
-    }
-
-    public boolean isRemoteException(Class c)
-    {
-        if( c == null ) {
-            throw new IllegalArgumentException();
-        } 
-
-	return java.rmi.RemoteException.class.isAssignableFrom(c) ;
-    }
-
-    public boolean isCheckedException(Class c) 
-    {
-        if( c == null ) {
-            throw new IllegalArgumentException();
-        } 
-
-        return Throwable.class.isAssignableFrom(c) &&
-            !RuntimeException.class.isAssignableFrom(c) &&
-            !Error.class.isAssignableFrom(c) ;
-    }
-
-    /**
-     * Section 1.2.7
-     */ 
-    public boolean isObjectReference(Class c) 
-    {
-        if( c == null ) {
-            throw new IllegalArgumentException();
-        } 
-
-        return (c.isInterface() && 
-                org.omg.CORBA.Object.class.isAssignableFrom(c));
-    }
-
-    /**
-     * Section 1.2.8
-     */ 
-    public boolean isEntity(Class c)
-    {
-        if( c == null ) {
-            throw new IllegalArgumentException();
-        } 
-
-        Class superClass = c.getSuperclass();
-        return (!c.isInterface() &&
-                (superClass != null) && 
-                (org.omg.CORBA.portable.IDLEntity.class.isAssignableFrom(c)));
-    }
-
-    public String javaPropertyPrefixToIDL( String javaPrefix )
-    {
-	return "_" + javaPrefix + "_" ;
-    }
-
-    /**
-     * Return the property type if given method is legal property accessor as defined in 
-     * Section 1.3.4.3 of Java2IDL spec.  Result is one of: JAVA_GET_PROPERTY_PREFIX,
-     * JAVA_SET_PROPERTY_PREFIX, JAVA_IS_PROPERTY_PREFIX.
-     */
-    public String propertyAccessorMethodType(Method m, Class c) {
-        
-        String methodName = m.getName();
-        Class returnType  = m.getReturnType();
-        Class[] parameters = m.getParameterTypes();
-        Class[] exceptionTypes = m.getExceptionTypes();
-        String propertyType = null;
-
-        if( methodName.startsWith(JAVA_GET_PROPERTY_PREFIX) ) {
-
-            if((parameters.length == 0) && (returnType != Void.TYPE) &&
-		!hasCorrespondingReadProperty(m, c, JAVA_IS_PROPERTY_PREFIX) {
-                propertyType = JAVA_GET_PROPERTY_PREFIX;
-            }
-           
-        } else if( methodName.startsWith(JAVA_SET_PROPERTY_PREFIX) ) {
-            
-            if((returnType == Void.TYPE) && (parameters.length == 1)) {
-                if (hasCorrespondingReadProperty(m, c, JAVA_GET_PROPERTY_PREFIX) ||
-                    hasCorrespondingReadProperty(m, c, JAVA_IS_PROPERTY_PREFIX)) {
-                    propertyType = JAVA_SET_PROPERTY_PREFIX;
-                }
-            }
-
-        } else if( methodName.startsWith(JAVA_IS_PROPERTY_PREFIX) ) {
-            if((parameters.length == 0) && (returnType == Boolean.TYPE)) {
-                propertyType = JAVA_IS_PROPERTY_PREFIX;             
-            }
-        }
-
-        // Some final checks that apply to all properties.  
-        if( propertyType != null ) {
-            if(!validPropertyExceptions(m) || 
-               (methodName.length() <= propertyType.length())) {
-                propertyType = null;
-            }                                       
-        }
-
-        return propertyType ;
-    }
-
-    private boolean hasCorrespondingReadProperty
-        (Method writeProperty, Class c, String readPropertyPrefix) {
-
-        String writePropertyMethodName = writeProperty.getName();
-        Class[] writePropertyParameters = writeProperty.getParameterTypes();
-        boolean foundReadProperty = false;
-
-        try {            
-            // Look for a valid corresponding Read property
-            String readPropertyMethodName = 
-                writePropertyMethodName.replaceFirst
-                    (JAVA_SET_PROPERTY_PREFIX, readPropertyPrefix);
-            Method readPropertyMethod = c.getMethod(readPropertyMethodName, 
-                                                    new Class[] {});
-            foundReadProperty = 
-                ((propertyAccessorMethodType(readPropertyMethod, c) != null) &&
-                 (readPropertyMethod.getReturnType() == 
-                   writePropertyParameters[0]));
-        } catch(Exception e) {
-            // ignore. this means we didn't find a corresponding get property.
-        }
-
-        return foundReadProperty;
-    }
-
-    public String getAttributeNameForProperty(String propertyName) {
-        String attributeName = null;
-        String prefix = null;
-
-        if( propertyName.startsWith(JAVA_GET_PROPERTY_PREFIX) ) {
-            prefix = JAVA_GET_PROPERTY_PREFIX;           
-        } else if( propertyName.startsWith(JAVA_SET_PROPERTY_PREFIX) ) {
-            prefix = JAVA_SET_PROPERTY_PREFIX;
-        } else if( propertyName.startsWith(JAVA_IS_PROPERTY_PREFIX) ) {
-            prefix = JAVA_IS_PROPERTY_PREFIX;
-        }
-
-        if( (prefix != null) && (prefix.length() < propertyName.length()) ) {
-            String remainder = propertyName.substring(prefix.length());
-            if( (remainder.length() >= 2) && 
-                Character.isUpperCase(remainder.charAt(0)) &&
-                Character.isUpperCase(remainder.charAt(1)) ) {
-                // don't set the first letter to lower-case if the 
-                // first two are upper-case
-                attributeName = remainder;
-            } else {
-                attributeName = Character.toLowerCase(remainder.charAt(0)) +
-                    remainder.substring(1);
-            }
-        }
-
-        return attributeName;
-    }
-
-    /**
-     * Return IDL Type name for primitive types as defined in 
-     * Section 1.3.3 of Java2IDL spec or null if not a primitive type.
-     */ 
-    public IDLType getPrimitiveIDLTypeMapping(Class c) {
-               
-        if( c == null ) {
-            throw new IllegalArgumentException();
-        } 
-
-        if( c.isPrimitive() ) {            
-            if( c == Void.TYPE ) {
-		return new IDLType( c, "void" ) ;
-            } else if( c == Boolean.TYPE ) {
-		return new IDLType( c, "boolean" ) ;
-            } else if( c == Character.TYPE ) {
-		return new IDLType( c, "wchar" ) ;
-            } else if( c == Byte.TYPE ) {
-		return new IDLType( c, "octet" ) ;
-            } else if( c == Short.TYPE ) {
-		return new IDLType( c, "short" ) ;
-            } else if( c == Integer.TYPE ) {
-		return new IDLType( c, "long" ) ;
-            } else if( c == Long.TYPE ) {
-		return new IDLType( c, "long_long" ) ;
-            } else if( c == Float.TYPE ) {
-		return new IDLType( c, "float" ) ;
-            } else if( c == Double.TYPE ) {
-		return new IDLType( c, "double" ) ;
-            }
-        }
-        
-        return null;
-    }
-
-    /**
-     * Return IDL Type name for special case type mappings as defined in
-     * Table 1-1 of Java2IDL spec or null if given class is not a special
-     * type.
-     */
-    public IDLType getSpecialCaseIDLTypeMapping(Class c) {
-
-        if( c == null ) {
-            throw new IllegalArgumentException();
-        } 
-
-        if( c == java.lang.Object.class ) {
-	    return new IDLType( c, new String[] { "java", "lang" },
-		"Object" ) ;
-        } else if( c == java.lang.String.class ) {
-	    return new IDLType( c, new String[] { "CORBA" },
-		"WStringValue" ) ;
-        } else if( c == java.lang.Class.class ) {
-	    return new IDLType( c, new String[] { "javax", "rmi", "CORBA" },
-		"ClassDesc" ) ;
-        } else if( c == java.io.Serializable.class ) {
-	    return new IDLType( c, new String[] { "java", "io" },
-		"Serializable" ) ;
-        } else if( c == java.io.Externalizable.class ) {
-	    return new IDLType( c, new String[] { "java", "io" },
-		"Externalizable" ) ;
-        } else if( c == java.rmi.Remote.class ) {
-	    return new IDLType( c, new String[] { "java", "rmi" },
-		"Remote" ) ;
-        } else if( c == org.omg.CORBA.Object.class ) {
-	    return new IDLType( c, "Object" ) ;
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Implements 1.2.3 #2 and #4
-     */
-    private void validateExceptions(Method method) throws IDLTypeException {
-        
-        Class[] exceptions = method.getExceptionTypes();
-
-        boolean declaresRemoteExceptionOrSuperClass = false;
-
-        // Section 1.2.3, #2
-        for(int eIndex = 0; eIndex < exceptions.length; eIndex++) {
-            Class exception = exceptions[eIndex];
-            if( isRemoteExceptionOrSuperClass(exception) ) {
-                declaresRemoteExceptionOrSuperClass = true;
-                break;
-            }
-        }
-
-        if( !declaresRemoteExceptionOrSuperClass ) {
-            String msg = "Method '" + method + "' must throw at least one " +
-                "exception of type java.rmi.RemoteException or one of its " +
-                "super-classes";
-            throw new IDLTypeException(msg);
-        } 
-
-        // Section 1.2.3, #4
-	// See also bug 4972402
-	// For all exceptions E in exceptions, 
-	// (isCheckedException(E) => (isValue(E) || RemoteException.isAssignableFrom( E ) )
-        for(int eIndex = 0; eIndex < exceptions.length; eIndex++) {
-            Class exception = exceptions[eIndex];
-
-	    if (isCheckedException(exception) && !isValue(exception) && 
-		!isRemoteException(exception)) 
-	    {
-		String msg = "Exception '" + exception + "' on method '" +
-		    method + "' is not a allowed RMI/IIOP exception type";
-		throw new IDLTypeException(msg);
-            }
-        }
-
-        return;
-    }
-
-    /**
-     * Returns true if the method's throw clause conforms to the exception 
-     * restrictions for properties as defined in Section 1.3.4.3 of 
-     * Java2IDL spec.  This means that for all exceptions E declared on the
-     * method, E isChecked => RemoteException.isAssignableFrom( E ). 
-     */
-    private boolean validPropertyExceptions(Method method) 
-    {
-        Class[] exceptions = method.getExceptionTypes();
-         
-        for(int eIndex = 0; eIndex < exceptions.length; eIndex++) {
-            Class exception = exceptions[eIndex];
-
-	    if (isCheckedException(exception) && !isRemoteException(exception)) 
-		return false ;
-        }
-
-        return true;
-    }
-
-    /**
-     * Implements Section 1.2.3, #2.  
-     */
-    private boolean isRemoteExceptionOrSuperClass(Class c) {
-        return 
-            ((c == java.rmi.RemoteException.class) ||
-             (c == java.io.IOException.class) ||
-             (c == java.lang.Exception.class) ||
-             (c == java.lang.Throwable.class));
-    }
-
-    /**
-     * Implements Section 1.2.3, #5.
-     */ 
-    private void validateDirectInterfaces(Class c) throws IDLTypeException {
-
-        Class[] directInterfaces = c.getInterfaces();
-
-        if( directInterfaces.length < 2 ) {
-            return;
-        }
-
-        Set allMethodNames = new HashSet();
-        Set currentMethodNames = new HashSet();
-
-        for(int i = 0; i < directInterfaces.length; i++) {
-            Class next = directInterfaces[i];
-            Method[] methods = next.getMethods();
-
-            // Comparison is based on method names only.  First collect
-            // all methods from current interface, eliminating duplicate
-            // names.
-            currentMethodNames.clear();
-            for(int m = 0; m < methods.length; m++) {
-                currentMethodNames.add(methods[m].getName());
-            }
-
-            // Now check each method against list of all unique method
-            // names processed so far.
-            for(Iterator iter=currentMethodNames.iterator(); iter.hasNext();) {
-                String methodName = (String) iter.next();
-                if( allMethodNames.contains(methodName) ) {
-                    String msg = "Class " + c + " inherits method " + 
-                        methodName + " from multiple direct interfaces.";
-                    throw new IDLTypeException(msg);
-                } else {
-                    allMethodNames.add(methodName);
-                }
-            }
-        }
-
-        return;
-    }
-
-    /**
-     * Implements 1.2.3 #6
-     */
-    private void validateConstants(final Class c) 
-        throws IDLTypeException {
-
-        Field[] fields = null;
-
-        try {
-            fields = (Field[])
-                java.security.AccessController.doPrivileged
-                (new java.security.PrivilegedExceptionAction() {
-                        public java.lang.Object run() throws Exception {
-                            return c.getFields();
-                        }
-                    });
-        } catch(java.security.PrivilegedActionException pae) {
-            IDLTypeException ite = new IDLTypeException();
-            ite.initCause(pae);
-            throw ite;
-        }
-   
-        for(int i = 0; i < fields.length; i++) {
-            Field next = fields[i];
-            Class fieldType = next.getType();
-            if( (fieldType != java.lang.String.class) &&
-                !isPrimitive(fieldType) ) {
-                String msg = "Constant field '" + next.getName() + 
-                    "' in class '" + next.getDeclaringClass().getName() + 
-                    "' has invalid type' " + next.getType() + "'. Constants" +
-                    " in RMI/IIOP interfaces can only have primitive" + 
-                    " types and java.lang.String types.";
-                throw new IDLTypeException(msg);
-            }
-        }
-
-
-        return;
-    }
-
-}
--- a/corba/src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalClientRequestImpl.sjava	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,138 +0,0 @@
-/*
- * Copyright (c) 1999, 2003, 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 com.sun.corba.se.impl.iiop;
-
-import com.sun.corba.se.impl.protocol.Request;
-import com.sun.corba.se.impl.core.ClientRequest;
-import com.sun.corba.se.impl.core.ServiceContext;
-import com.sun.corba.se.impl.core.ServiceContexts;
-import com.sun.corba.se.impl.core.ClientResponse;
-import com.sun.corba.se.impl.core.ServerRequest;
-import com.sun.corba.se.impl.core.ServerResponse;
-import com.sun.corba.se.impl.corba.IOR;
-import com.sun.corba.se.impl.corba.GIOPVersion;
-import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase;
-import com.sun.corba.se.impl.protocol.giopmsgheaders.RequestMessage;
-import com.sun.corba.se.impl.orbutil.ORBConstants;
-import com.sun.corba.se.impl.core.ORBVersion;
-import com.sun.corba.se.impl.core.ORB;
-import com.sun.corba.se.impl.orbutil.ORBUtility;
-import com.sun.corba.se.impl.ior.ObjectKeyFactory ;
-import com.sun.corba.se.impl.ior.ObjectKey ;
-import com.sun.corba.se.impl.ior.ObjectKeyTemplate ;
-import com.sun.corba.se.impl.ior.IIOPProfile;
-
-public class LocalClientRequestImpl extends IIOPOutputStream 
-    implements ClientRequest 
-{
-    public LocalClientRequestImpl( GIOPVersion gv, 
-	ORB orb, IOR ior, short addrDisposition, 
-        String operationName, boolean oneway, ServiceContexts svc, 
-	int requestId, byte streamFormatVersion)
-    {
-	super(gv, 
-              orb, 
-              null, 
-              BufferManagerFactory.newBufferManagerWrite(BufferManagerFactory.GROW),
-              streamFormatVersion);
-
-	this.isOneway = oneway;
-	boolean responseExpected = !isOneway;
-
-        IIOPProfile iop = ior.getProfile();
-	ObjectKey okey = iop.getObjectKey();
-	ObjectKeyTemplate oktemp = okey.getTemplate() ;
-	ORBVersion version = oktemp.getORBVersion() ;
-	orb.setORBVersion( version ) ;
-
-        this.request = MessageBase.createRequest(orb, gv, requestId,
-	    responseExpected, ior, addrDisposition, operationName, svc, null);
-	setMessage(request);
-	request.write(this);
-
-	// mark beginning of msg body for possible later use
-	bodyBegin = getSize();
-    }
-
-    public int getRequestId() {
-	return request.getRequestId();
-    }
-    
-    public boolean isOneWay() {
-	return isOneway;
-    }
-
-    public ServiceContexts getServiceContexts() {
-	return request.getServiceContexts();
-    }
-
-    public String getOperationName() {
-	return request.getOperation();
-    }
-
-    public ObjectKey getObjectKey() {
-	return request.getObjectKey();
-    }
-
-    public ServerRequest getServerRequest()
-    {
-	// Set the size of the marshalled data in the message header.
-	getMessage().setSize( getByteBuffer(), getSize() ) ;
-
-	// Construct a new ServerRequest out of the buffer in this ClientRequest
-	LocalServerRequestImpl serverRequest = new LocalServerRequestImpl(
-	    (ORB)orb(), toByteArray(), request ) ;
-
-	// Skip over all of the GIOP header information.  This positions
-	// the offset in the buffer so that the skeleton can correctly read
-	// the marshalled arguments.
-	serverRequest.setIndex( bodyBegin ) ;
-
-	return serverRequest ;
-    }
-    
-    public ClientResponse invoke() 
-    {	
-	ORB myORB = (ORB)orb() ;
-
-	ServerResponse serverResponse = myORB.process( getServerRequest() ) ;
-
-	LocalServerResponseImpl lsr = (LocalServerResponseImpl)serverResponse ;
-
-	return lsr.getClientResponse() ;
-    }
-
-    /**
-     * Check to see if the request is local.
-     */
-    public boolean isLocal(){
-        return true;
-    }
-
-    private RequestMessage request;
-    private int bodyBegin;
-    private boolean isOneway;
-}
--- a/corba/src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalClientResponseImpl.sjava	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-/*
- * Copyright (c) 1999, 2003, 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 com.sun.corba.se.impl.iiop;
-
-import java.io.IOException;
-
-import org.omg.CORBA.SystemException;
-import org.omg.CORBA.CompletionStatus;
-
-import com.sun.corba.se.impl.core.Response;
-import com.sun.corba.se.impl.core.ClientResponse;
-import com.sun.corba.se.impl.corba.IOR;
-import com.sun.corba.se.impl.core.ORB;
-import com.sun.corba.se.impl.core.ServiceContext;
-import com.sun.corba.se.impl.core.ServiceContexts;
-import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
-import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage;
-import com.sun.corba.se.impl.orbutil.MinorCodes;
-
-class LocalClientResponseImpl extends IIOPInputStream implements ClientResponse
-{
-    LocalClientResponseImpl(ORB orb, byte[] buf, ReplyMessage header)
-    {
-	super(orb, buf, header.getSize(), header.isLittleEndian(), header, null);
-
-        this.reply = header;
-
-        // NOTE (Ram J) (06/02/2000) if we set result.setIndex(bodyBegin)
-        // in LocalServerResponse.getClientResponse(), then we do not need
-        // to read the headers (done below) anymore.
-        // This will be an optimisation which is can be done to speed up the
-        // local invocation by avoiding reading the headers in the local cases.
-
-        // BUGFIX(Ram Jeyaraman) This has been moved from
-        // LocalServerResponse.getClientResponse()
-        // Skip over all of the GIOP header information.  This positions
-        // the offset in the buffer so that the skeleton can correctly read
-        // the marshalled arguments.
-        this.setIndex(Message.GIOPMessageHeaderLength);
-
-        // BUGFIX(Ram Jeyaraman) For local invocations, the reply mesg fields
-        // needs to be set, by reading the response buffer contents
-        // to correctly set the exception type and other info.
-        this.reply.read(this);
-    }
-
-    LocalClientResponseImpl(SystemException ex)
-    {
-	this.systemException = ex;
-    }
-
-    public boolean isSystemException() {
-	if ( reply != null )
-	    return reply.getReplyStatus() == ReplyMessage.SYSTEM_EXCEPTION;
-	else
-	    return (systemException != null);	
-    }
-
-    public boolean isUserException() {
-	if ( reply != null )
-	    return reply.getReplyStatus() == ReplyMessage.USER_EXCEPTION;
-	else
-	    return false;
-    }
-
-    public boolean isLocationForward() {
-        if ( reply != null ) {
-            return ( (reply.getReplyStatus() == ReplyMessage.LOCATION_FORWARD) ||
-                     (reply.getReplyStatus() == ReplyMessage.LOCATION_FORWARD_PERM) );
-            //return reply.getReplyStatus() == ReplyMessage.LOCATION_FORWARD;
-        } else {
-            return false;
-        }
-    }
-    
-    public boolean isDifferentAddrDispositionRequested() {
-        if (reply != null) {
-            return reply.getReplyStatus() == ReplyMessage.NEEDS_ADDRESSING_MODE;
-        }
-    
-        return false;
-    }
-        
-    public short getAddrDisposition() {
-        if (reply != null) {
-            return reply.getAddrDisposition();
-        }
-        
-        throw new org.omg.CORBA.INTERNAL(
-            "Null reply in getAddrDisposition",
-            MinorCodes.NULL_REPLY_IN_GET_ADDR_DISPOSITION,        
-            CompletionStatus.COMPLETED_MAYBE);
-    }
-        
-    public IOR getForwardedIOR() {
-	if ( reply != null )
-	    return reply.getIOR();
-	else
-	    return null;
-    }
-
-    public int getRequestId() {
-	if ( reply != null )
-	    return reply.getRequestId();
-	else
-	    throw new org.omg.CORBA.INTERNAL("Error in getRequestId");
-    }
-
-    public ServiceContexts getServiceContexts() {
-	if ( reply != null )
-	    return reply.getServiceContexts();
-	else
-	    return null;
-    }
-
-    public SystemException getSystemException() {
-	if ( reply != null )
-	    return reply.getSystemException();
-	else
-	    return systemException;
-    }
-
-    public java.lang.String peekUserExceptionId() {
-        mark(Integer.MAX_VALUE);
-        String result = read_string();
-        reset();
-        return result;
-    }
-
-    /**
-     * Check to see if the response is local.
-     */
-    public boolean isLocal(){
-        return true;
-    }
-
-    private ReplyMessage reply;
-    private SystemException systemException;
-}
--- a/corba/src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalServerRequestImpl.sjava	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,208 +0,0 @@
-/*
- * Copyright (c) 1999, 2003, 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 com.sun.corba.se.impl.iiop;
-
-import org.omg.CORBA.SystemException;
-
-import com.sun.corba.se.impl.core.ServerRequest;
-import com.sun.corba.se.impl.core.ServiceContext;
-import com.sun.corba.se.impl.core.DuplicateServiceContext;
-import com.sun.corba.se.impl.core.UEInfoServiceContext;
-import com.sun.corba.se.impl.core.ServiceContexts;
-import com.sun.corba.se.impl.core.ServerResponse;
-import com.sun.corba.se.impl.corba.IOR;
-import com.sun.corba.se.impl.core.ORB;
-import com.sun.corba.se.impl.orbutil.ORBUtility;  //d11638
-import org.omg.CORBA.portable.UnknownException;
-import org.omg.CORBA.UNKNOWN;
-import org.omg.CORBA.CompletionStatus;
-import com.sun.corba.se.impl.ior.ObjectKey;
-import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase;
-import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage;
-import com.sun.corba.se.impl.protocol.giopmsgheaders.RequestMessage;
-
-class LocalServerRequestImpl extends IIOPInputStream implements ServerRequest {
-    org.omg.CORBA.portable.OutputStream replyStream;
-    org.omg.CORBA.portable.OutputStream exceptionReplyStream;
-
-    LocalServerRequestImpl(ORB orb, byte[] buf, RequestMessage header)
-    {
-        super(orb, buf, header.getSize(), header.isLittleEndian(), header, null );
-
-        this.request = header;
-    }
-
-    public int getRequestId() {
-    	return request.getRequestId();
-    }
-
-    public boolean isOneWay() {
-    	return !request.isResponseExpected();
-    }
-
-    public ServiceContexts getServiceContexts() {
-    	return request.getServiceContexts();
-    }
-
-    public String getOperationName() {
-    	return request.getOperation();
-    }
-
-    public ObjectKey getObjectKey() {
-    	return request.getObjectKey();
-    }
-
-    public ServerResponse createResponse(ServiceContexts svc)
-    {
-    	return new LocalServerResponseImpl(this, svc);
-    }
-
-    public org.omg.CORBA.portable.OutputStream createReply() {
-        if (replyStream == null) {
-            replyStream = (org.omg.CORBA.portable.OutputStream)
-                                createResponse(null);
-        }
-        return replyStream;
-    }
-
-    public org.omg.CORBA.portable.OutputStream createExceptionReply() {
-        if (exceptionReplyStream == null) {
-            exceptionReplyStream = (org.omg.CORBA.portable.OutputStream)
-                                        createUserExceptionResponse(null);
-        }
-        return exceptionReplyStream;
-    }
-
-    public ServerResponse createUserExceptionResponse(
-	ServiceContexts svc)
-    {
-    	return new LocalServerResponseImpl(this, svc, true);
-    }
-
-    public ServerResponse createUnknownExceptionResponse(
-	        UnknownException ex) {
-        ServiceContexts contexts = null;
-        SystemException sys = new UNKNOWN( 0,
-            CompletionStatus.COMPLETED_MAYBE);
-
-            try {
-                contexts = new ServiceContexts( (ORB)orb() );
-                UEInfoServiceContext uei = new UEInfoServiceContext(sys);
-                contexts.put(uei) ;
-            } catch (DuplicateServiceContext d) {
-            // can't happen
-            }
-
-        return createSystemExceptionResponse(sys,contexts);
-    }
-
-    public ServerResponse createSystemExceptionResponse(
-    	SystemException ex, ServiceContexts svc) {
-
-	// Only do this if interceptors have been initialized on this request
-	// and have not completed their lifecycle (otherwise the info stack
-	// may be empty or have a different request's entry on top).
-	if (executePIInResponseConstructor()) {
-	    // Inform Portable Interceptors of the SystemException.  This is
-	    // required to be done here because the ending interception point
-	    // is called in the ServerResponseImpl constructor called below
-	    // but we do not currently write the SystemException into the
-	    // response until after the ending point is called.
-	    ORB orb = (ORB)orb();
-	    orb.getPIHandler().setServerPIInfo( ex );
-	}
-
-	if (orb() != null && ((ORB)orb()).subcontractDebugFlag && ex != null)
-            ORBUtility.dprint(this, "Sending SystemException:", ex);
-
-        LocalServerResponseImpl response =
-            new LocalServerResponseImpl(this, svc, false);
-        ORBUtility.writeSystemException(ex, response);
-        return response;
-    }
-
-    public ServerResponse createLocationForward(
-	        IOR ior, ServiceContexts svc) {
-        ReplyMessage reply = MessageBase.createReply( (ORB)orb(),
-	    request.getGIOPVersion(), request.getRequestId(),
-	    ReplyMessage.LOCATION_FORWARD, svc, ior);
-        LocalServerResponseImpl response =
-            new LocalServerResponseImpl(this, reply, ior);
-
-        return response;
-    }
-
-    private RequestMessage request;
-
-    /**
-     * Check to see if the request is local.
-     */
-    public boolean isLocal(){
-        return true;
-    }
-
-    private boolean _executeReturnServantInResponseConstructor = false;
-
-    public boolean executeReturnServantInResponseConstructor()
-    {
-	return _executeReturnServantInResponseConstructor;
-    }
-
-    public void setExecuteReturnServantInResponseConstructor(boolean b)
-    {
-	_executeReturnServantInResponseConstructor = b;
-    }
-
-    
-    private boolean _executeRemoveThreadInfoInResponseConstructor = false;
-
-    public boolean executeRemoveThreadInfoInResponseConstructor()
-    {
-	return _executeRemoveThreadInfoInResponseConstructor;
-    }
-
-    public void setExecuteRemoveThreadInfoInResponseConstructor(boolean b)
-    {
-	_executeRemoveThreadInfoInResponseConstructor = b;
-    }
-
-    
-    private boolean _executePIInResponseConstructor = false;
-                                                            
-    public boolean executePIInResponseConstructor() {
-        return _executePIInResponseConstructor;
-    }
-
-    public void setExecutePIInResponseConstructor( boolean b ) {
-        _executePIInResponseConstructor = b;
-    }
-
-    // We know that we're talking to the same ValueHandler, so
-    // use the maximum version it supports.
-    public byte getStreamFormatVersionForReply() {
-        return ORBUtility.getMaxStreamFormatVersion();
-    }
-}
--- a/corba/src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalServerResponseImpl.sjava	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-/*
- * Copyright (c) 1999, 2003, 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 com.sun.corba.se.impl.iiop;
-
-import org.omg.CORBA.SystemException;
-
-import com.sun.corba.se.impl.core.ServerResponse;
-import com.sun.corba.se.impl.core.ORB;
-import com.sun.corba.se.impl.corba.IOR;
-import com.sun.corba.se.impl.core.ServiceContext;
-import com.sun.corba.se.impl.core.ServiceContexts;
-import com.sun.corba.se.impl.core.ClientResponse;
-import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase;
-import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage;
-
-class LocalServerResponseImpl
-    extends     IIOPOutputStream
-    implements  ServerResponse
-{
-    LocalServerResponseImpl(LocalServerRequestImpl request, ServiceContexts svc)
-    {
-        this(request,
-            MessageBase.createReply(
-                            (ORB)request.orb(),
-                            request.getGIOPVersion(),
-                            request.getRequestId(), ReplyMessage.NO_EXCEPTION,
-                            svc, null),
-            null);
-    }
-
-    LocalServerResponseImpl(LocalServerRequestImpl request, ServiceContexts svc,
-            boolean user)
-    {
-        this(request,
-            MessageBase.createReply(
-                            (ORB)request.orb(),
-                            request.getGIOPVersion(), request.getRequestId(),
-                            user ? ReplyMessage.USER_EXCEPTION :
-                                   ReplyMessage.SYSTEM_EXCEPTION,
-                            svc, null),
-            null);
-    }
-
-    LocalServerResponseImpl( LocalServerRequestImpl request, ReplyMessage reply,
-			     IOR ior)
-    {
-        super(request.getGIOPVersion(),
-              (ORB)request.orb(), 
-              null, 
-              BufferManagerFactory.newBufferManagerWrite(BufferManagerFactory.GROW),
-              request.getStreamFormatVersionForReply());
-
-        setMessage(reply);
-
-	ORB orb = (ORB)request.orb();
-
-	ServerResponseImpl.runServantPostInvoke(orb, request);
-
-	if( request.executePIInResponseConstructor() ) {
-	    // Invoke server request ending interception points (send_*):
-	    // Note: this may end up with a SystemException or an internal
-	    // Runtime ForwardRequest.
-	    orb.getPIHandler().invokeServerPIEndingPoint( reply );
-
-	    // Note this will be executed even if a ForwardRequest or
-	    // SystemException is thrown by a Portable Interceptors ending 
-	    // point since we end up in this constructor again anyway.
-	    orb.getPIHandler().cleanupServerPIRequest();
-
-	    // See (Local)ServerRequestImpl.createSystemExceptionResponse
-	    // for why this is necesary.
-	    request.setExecutePIInResponseConstructor(false);
-	}
-
-	// Once you get here then the final reply is available (i.e.,
-	// postinvoke and interceptors have completed.
-	if (request.executeRemoveThreadInfoInResponseConstructor()) {
-	    ServerResponseImpl.removeThreadInfo(orb, request);
-	}
-        
-	reply.write(this);
-	if (reply.getIOR() != null)
-	    reply.getIOR().write(this);
-
-        this.reply = reply;
-        this.ior = reply.getIOR();
-    }
-
-    public boolean isSystemException() {
-        if (reply != null)
-            return reply.getReplyStatus() == ReplyMessage.SYSTEM_EXCEPTION;
-        return false;
-    }
-
-    public boolean isUserException() {
-        if (reply != null)
-            return reply.getReplyStatus() == ReplyMessage.USER_EXCEPTION;
-        return false;
-    }
-
-    public boolean isLocationForward() {
-        if (ior != null)
-            return true;
-        return false;
-    }
-
-    public IOR getForwardedIOR() {
-    	return ior;
-    }
-
-    public int getRequestId() {
-        if (reply != null)
-            return reply.getRequestId();
-        return -1;
-    }
-
-    public ServiceContexts getServiceContexts() {
-        if (reply != null)
-            return reply.getServiceContexts();
-        return null;
-    }
-
-    public SystemException getSystemException() {
-        if (reply != null)
-            return reply.getSystemException();
-        return null;
-    }
-
-    public ReplyMessage getReply()
-    {
-    	return reply ;
-    }
-
-    public ClientResponse getClientResponse()
-    {
-        // set the size of the marshalled data in the message header
-        getMessage().setSize(getByteBuffer(), getSize());
-
-        // Construct a new ClientResponse out of the buffer in this ClientRequest
-        LocalClientResponseImpl result =
-            new LocalClientResponseImpl( (ORB)orb(), toByteArray(), reply);
-
-        // NOTE (Ram J) (06/02/2000) if we set result.setIndex(bodyBegin) here
-        // then the LocalClientResponse does not need to read the headers anymore.
-        // This will be an optimisation which is can be done to speed up the
-        // local invocation by avoiding reading the headers in the local cases.
-
-        // BUGFIX(Ram Jeyaraman) result.setOffset is now done in
-        // LocalClientResponseImpl constructor.
-        /*
-          // Skip over all of the GIOP header information.  This positions
-          // the offset in the buffer so that the skeleton can correctly read
-          // the marshalled arguments.
-          result.setOffset( bodyBegin ) ;
-        */
-
-        return result ;
-    }
-
-    /**
-     * Check to see if the response is local.
-     */
-    public boolean isLocal(){
-        return true;
-    }
-
-    private ReplyMessage reply;
-    private IOR ior; // forwarded IOR
-}
--- a/corba/src/share/classes/com/sun/corba/se/impl/transport/BufferConnectionImpl.sjava	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,710 +0,0 @@
-/*
- * Copyright (c) 2004, 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 com.sun.corba.se.impl.transport;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.nio.ByteBuffer;
-import java.nio.channels.SelectableChannel;
-import java.nio.channels.SelectionKey;
-import java.nio.channels.SocketChannel;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.Collections;
-import java.util.Hashtable;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.omg.CORBA.COMM_FAILURE;
-import org.omg.CORBA.CompletionStatus;
-import org.omg.CORBA.DATA_CONVERSION;
-import org.omg.CORBA.INTERNAL;
-import org.omg.CORBA.MARSHAL;
-import org.omg.CORBA.OBJECT_NOT_EXIST;
-import org.omg.CORBA.SystemException;
-
-import com.sun.org.omg.SendingContext.CodeBase;
-
-import com.sun.corba.se.pept.broker.Broker;
-import com.sun.corba.se.pept.encoding.InputObject;
-import com.sun.corba.se.pept.encoding.OutputObject;
-import com.sun.corba.se.pept.protocol.MessageMediator;
-import com.sun.corba.se.pept.transport.Acceptor;
-import com.sun.corba.se.pept.transport.Connection;
-import com.sun.corba.se.pept.transport.ConnectionCache;
-import com.sun.corba.se.pept.transport.ContactInfo;
-import com.sun.corba.se.pept.transport.EventHandler;
-import com.sun.corba.se.pept.transport.InboundConnectionCache;
-import com.sun.corba.se.pept.transport.OutboundConnectionCache;
-import com.sun.corba.se.pept.transport.ResponseWaitingRoom;
-import com.sun.corba.se.pept.transport.Selector;
-
-import com.sun.corba.se.spi.ior.IOR;
-import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
-import com.sun.corba.se.spi.logging.CORBALogDomains;
-import com.sun.corba.se.spi.orb.ORB ;
-import com.sun.corba.se.spi.orbutil.threadpool.Work;
-import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
-import com.sun.corba.se.spi.transport.CorbaContactInfo;
-import com.sun.corba.se.spi.transport.CorbaConnection;
-import com.sun.corba.se.spi.transport.CorbaResponseWaitingRoom;
-
-import com.sun.corba.se.impl.encoding.CachedCodeBase;
-import com.sun.corba.se.impl.encoding.CDRInputStream_1_0;
-import com.sun.corba.se.impl.encoding.CDROutputObject;
-import com.sun.corba.se.impl.encoding.CDROutputStream_1_0;
-import com.sun.corba.se.impl.encoding.CodeSetComponentInfo;
-import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry;
-import com.sun.corba.se.impl.logging.ORBUtilSystemException;
-import com.sun.corba.se.impl.orbutil.ORBConstants;
-import com.sun.corba.se.impl.orbutil.ORBUtility;
-import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
-import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase;
-import com.sun.corba.se.impl.transport.CorbaResponseWaitingRoomImpl;
-
-/**
- * @author Ken Cavanaugh
- */
-public class BufferConnectionImpl
-    extends
-	EventHandlerBase
-    implements
-        CorbaConnection,
-	Work
-{
-    //
-    // New transport.
-    //
-
-    protected long enqueueTime;
-
-    public SocketChannel getSocketChannel()
-    {
-	return null;
-    }
-
-    // REVISIT:
-    // protected for test: genericRPCMSGFramework.IIOPConnection constructor.
-
-    //
-    // From iiop.Connection.java
-    //
-
-    protected long timeStamp = 0;
-    protected boolean isServer = false;
-
-    // Start at some value other than zero since this is a magic
-    // value in some protocols.
-    protected int requestId = 5;
-    protected CorbaResponseWaitingRoom responseWaitingRoom;
-    protected int state;
-    protected java.lang.Object stateEvent = new java.lang.Object();
-    protected java.lang.Object writeEvent = new java.lang.Object();
-    protected boolean writeLocked;
-    protected int serverRequestCount = 0;
-    
-    // Server request map: used on the server side of Connection
-    // Maps request ID to IIOPInputStream.
-    Map serverRequestMap = new HashMap() ;
-
-    // This is a flag associated per connection telling us if the
-    // initial set of sending contexts were sent to the receiver
-    // already...
-    protected boolean postInitialContexts = false;
- 
-    // Remote reference to CodeBase server (supplies
-    // FullValueDescription, among other things)
-    protected IOR codeBaseServerIOR;
-
-    // CodeBase cache for this connection.  This will cache remote operations,
-    // handle connecting, and ensure we don't do any remote operations until
-    // necessary.
-    protected CachedCodeBase cachedCodeBase = new CachedCodeBase(this);
-
-    protected ORBUtilSystemException wrapper ;
-
-    List buffers ;
-
-    public BufferConnectionImpl(ORB orb, byte[][] data )
-    {
-	this.orb = orb;
-	wrapper = ORBUtilSystemException.get( orb,
-	    CORBALogDomains.RPC_TRANSPORT ) ;
-	buffers = new ArrayList() ;
-    }
-
-    ////////////////////////////////////////////////////
-    //
-    // framework.transport.Connection
-    //
-
-    public boolean shouldRegisterReadEvent()
-    {
-	return false;
-    }
-
-    public boolean shouldRegisterServerReadEvent()
-    {
-	return false;
-    }
-
-    public boolean read()
-    {
-	return true ;
-    }
-
-    protected CorbaMessageMediator readBits()
-    {
-	return null ;
-    }
-
-    protected boolean dispatch(CorbaMessageMediator messageMediator)
-    {
-    }
-
-    public boolean shouldUseDirectByteBuffers()
-    {
-	return false ;
-    }
-
-    // Only called from readGIOPMessage with (12, 0, 12) as arguments
-    // size is size of buffer to create
-    // offset is offset from start of message in buffer
-    // length is length to read
-    public ByteBuffer read(int size, int offset, int length)
-	throws IOException
-    {
-	byte[] buf = new byte[size];
-	readFully( buf, offset, length);
-	ByteBuffer byteBuffer = ByteBuffer.wrap(buf);
-	byteBuffer.limit(size);
-	return byteBuffer;
-    }
-
-    // Only called as read( buf, 12, msgsize-12 ) in readGIOPMessage
-    // We can ignore the byteBuffer parameter
-    // offset is the starting position to place data in the result
-    // length is the length of the data to read
-    public ByteBuffer read(ByteBuffer byteBuffer, int offset, int length)
-	throws IOException
-    {
-	int size = offset + length;
-	byte[] buf = new byte[size];
-	readFully(buf, offset, length);
-	return ByteBuffer.wrap(buf);
-    }
-
-    // Read size bytes from buffer list and place the data
-    // starting at offset in buf.
-    public void readFully(byte[] buf, int offset, int size) 
-	throws IOException
-    {
-	int remaining = size ;
-	int position = offset ;
-	while (remaining > 0) {
-	    ByteBuffer buff = (ByteBuffer)buffers.get(0) ; 
-	    int dataSize = buff.remaining() ;
-	    int xferSize = dataSize ;
-	    if (dataSize >= remaining) :
-		xferSize = remaining ;
-		buffers.remove(0) ;
-	    }
-	    
-	    buff.get( buf, offset, xferSize ) ;
-
-	    offset += xferSize ;
-	    remaining -= xferSize ;
-	}
-    }    
-
-    public void write(ByteBuffer byteBuffer)
-	throws IOException
-    {
-	buffers.add( byteBuffer ) ;
-    }
-
-    /**
-     * Note:it is possible for this to be called more than once
-     */
-    public synchronized void close() 
-    {
-    }
-
-    public Acceptor getAcceptor()
-    {
-	return null;
-    }
-
-    public ContactInfo getContactInfo()
-    {
-	return null;
-    }
-
-    public EventHandler getEventHandler()
-    {
-	return this;
-    }
-
-    public OutputObject createOutputObject(MessageMediator messageMediator)
-    {
-	// REVISIT - remove this method from Connection and all it subclasses.
-	throw new RuntimeException("*****SocketOrChannelConnectionImpl.createOutputObject - should not be called.");
-    }
-
-    // This is used by the GIOPOutputObject in order to
-    // throw the correct error when handling code sets.
-    // Can we determine if we are on the server side by
-    // other means?  XREVISIT
-    public boolean isServer()
-    {
-        return isServer;
-    }
-
-    public boolean isBusy()
-    {
-	return false ;
-    }
-
-    public long getTimeStamp()
-    {
-	return timeStamp;
-    }
-
-    public void setTimeStamp(long time)
-    {
-	timeStamp = time;
-    }
-
-    public void setState(String stateString)
-    {
-	synchronized (stateEvent) {
-	    if (stateString.equals("ESTABLISHED")) {
-		state =  ESTABLISHED;
-		stateEvent.notifyAll();
-	    } else {
-		// REVISIT: ASSERT
-	    }
-	}
-    }
-
-    public void writeLock()
-    {
-    }
-
-    public void writeUnlock()
-    {
-    }
-
-    public void sendWithoutLock(OutputObject outputObject)
-    {
-    }
-
-    public void registerWaiter(MessageMediator messageMediator)
-    {
-    }
-
-    public void unregisterWaiter(MessageMediator messageMediator)
-    {
-    }
-
-    public InputObject waitForResponse(MessageMediator messageMediator)
-    {
-	return null ;
-    }
-
-    public void setConnectionCache(ConnectionCache connectionCache)
-    {
-    }
-
-    public ConnectionCache getConnectionCache()
-    {
-	return null;	
-    }
-
-    ////////////////////////////////////////////////////
-    //
-    // EventHandler methods
-    //
-
-    public SelectableChannel getChannel()
-    {
-	return null;
-    }
-
-    public int getInterestOps()
-    {
-	return null;
-    }
-
-    //    public Acceptor getAcceptor() - already defined above.
-
-    public Connection getConnection()
-    {
-	return this;
-    }
-
-    ////////////////////////////////////////////////////
-    //
-    // Work methods.
-    //
-
-    public String getName()
-    {
-	return this.toString();
-    }
-
-    public void doWork()
-    {
-    }
-
-    public void setEnqueueTime(long timeInMillis)
-    {
-	enqueueTime = timeInMillis;
-    }
-
-    public long getEnqueueTime()
-    {
-	return enqueueTime;
-    }
-
-    ////////////////////////////////////////////////////
-    //
-    // spi.transport.CorbaConnection.
-    //
-
-    public ResponseWaitingRoom getResponseWaitingRoom()
-    {
-	return null ;
-    }
-
-    // REVISIT - inteface defines isServer but already defined in 
-    // higher interface.
-
-
-    public void serverRequestMapPut(int requestId, 
-				    CorbaMessageMediator messageMediator)
-    {
-	serverRequestMap.put(new Integer(requestId), messageMediator);
-    }
-
-    public CorbaMessageMediator serverRequestMapGet(int requestId)
-    {
-	return (CorbaMessageMediator)
-	    serverRequestMap.get(new Integer(requestId));
-    }
-
-    public void serverRequestMapRemove(int requestId)
-    {
-	serverRequestMap.remove(new Integer(requestId));
-    }
-
-
-    // REVISIT: this is also defined in:
-    // com.sun.corba.se.spi.legacy.connection.Connection
-    public java.net.Socket getSocket()
-    {
-	return null;
-    }
-
-    /** It is possible for a Close Connection to have been
-     ** sent here, but we will not check for this. A "lazy"
-     ** Exception will be thrown in the Worker thread after the
-     ** incoming request has been processed even though the connection
-     ** is closed before the request is processed. This is o.k because
-     ** it is a boundary condition. To prevent it we would have to add
-     ** more locks which would reduce performance in the normal case.
-     **/
-    public synchronized void serverRequestProcessingBegins()
-    {
-        serverRequestCount++;
-    }
-
-    public synchronized void serverRequestProcessingEnds()
-    {
-        serverRequestCount--;
-    }
-
-    //
-    //
-    //
-
-    public synchronized int getNextRequestId() 
-    {
-	return requestId++;
-    }
-
-    // Negotiated code sets for char and wchar data
-    protected CodeSetComponentInfo.CodeSetContext codeSetContext = null;
-
-    public ORB getBroker() 
-    {
-        return orb;
-    }
-
-    public CodeSetComponentInfo.CodeSetContext getCodeSetContext() 
-    {
-        // Needs to be synchronized for the following case when the client
-        // doesn't send the code set context twice, and we have two threads
-        // in ServerRequestDispatcher processCodeSetContext.
-        //
-        // Thread A checks to see if there is a context, there is none, so
-        //     it calls setCodeSetContext, getting the synch lock.
-        // Thread B checks to see if there is a context.  If we didn't synch,
-        //     it might decide to outlaw wchar/wstring.
-        if (codeSetContext == null) {
-            synchronized(this) {
-                return codeSetContext;
-            }
-        }
-
-        return codeSetContext;
-    }
-
-    public synchronized void setCodeSetContext(CodeSetComponentInfo.CodeSetContext csc) {
-        // Double check whether or not we need to do this
-        if (codeSetContext == null) {
-            
-            if (OSFCodeSetRegistry.lookupEntry(csc.getCharCodeSet()) == null ||
-                OSFCodeSetRegistry.lookupEntry(csc.getWCharCodeSet()) == null) {
-                // If the client says it's negotiated a code set that
-                // isn't a fallback and we never said we support, then
-                // it has a bug.
-		throw wrapper.badCodesetsFromClient() ;
-            }
-
-            codeSetContext = csc;
-        }
-    }
-
-    //
-    // from iiop.IIOPConnection.java
-    //
-
-    // Map request ID to an InputObject.
-    // This is so the client thread can start unmarshaling
-    // the reply and remove it from the out_calls map while the
-    // ReaderThread can still obtain the input stream to give
-    // new fragments.  Only the ReaderThread touches the clientReplyMap,
-    // so it doesn't incur synchronization overhead.
-
-    public MessageMediator clientRequestMapGet(int requestId)
-    {
-	return null ;
-    }
-
-    protected MessageMediator clientReply_1_1;
-
-    public void clientReply_1_1_Put(MessageMediator x)
-    {
-	clientReply_1_1 = x;
-    }
-
-    public MessageMediator clientReply_1_1_Get()
-    {
-	return 	clientReply_1_1;
-    }
-
-    public void clientReply_1_1_Remove()
-    {
-	clientReply_1_1 = null;
-    }
-
-    protected MessageMediator serverRequest_1_1;
-
-    public void serverRequest_1_1_Put(MessageMediator x)
-    {
-	serverRequest_1_1 = x;
-    }
-
-    public MessageMediator serverRequest_1_1_Get()
-    {
-	return 	serverRequest_1_1;
-    }
-
-    public void serverRequest_1_1_Remove()
-    {
-	serverRequest_1_1 = null;
-    }
-
-    protected String getStateString( int state ) 
-    {
-        synchronized ( stateEvent ){
-            switch (state) {
-            case OPENING : return "OPENING" ;
-            case ESTABLISHED : return "ESTABLISHED" ;
-            case CLOSE_SENT : return "CLOSE_SENT" ;
-            case CLOSE_RECVD : return "CLOSE_RECVD" ;
-            case ABORT : return "ABORT" ;
-            default : return "???" ;
-            }
-        }
-    }
-    
-    public synchronized boolean isPostInitialContexts() {
-        return postInitialContexts;
-    }
-
-    // Can never be unset...
-    public synchronized void setPostInitialContexts(){
-        postInitialContexts = true;
-    }
-    
-    /**
-     * Wake up the outstanding requests on the connection, and hand them
-     * COMM_FAILURE exception with a given minor code.
-     *
-     * Also, delete connection from connection table and
-     * stop the reader thread.
-
-     * Note that this should only ever be called by the Reader thread for
-     * this connection.
-     * 
-     * @param minor_code The minor code for the COMM_FAILURE major code.
-     * @param die Kill the reader thread (this thread) before exiting.
-     */
-    public void purgeCalls(SystemException systemException,
-			   boolean die, boolean lockHeld)
-    {
-    }
-
-    /*************************************************************************
-    * The following methods are for dealing with Connection cleaning for
-    * better scalability of servers in high network load conditions.
-    **************************************************************************/
-
-    public void sendCloseConnection(GIOPVersion giopVersion)
-	throws IOException 
-    {
-        Message msg = MessageBase.createCloseConnection(giopVersion);
-	sendHelper(giopVersion, msg);
-    }
-
-    public void sendMessageError(GIOPVersion giopVersion)
-	throws IOException 
-    {
-        Message msg = MessageBase.createMessageError(giopVersion);
-	sendHelper(giopVersion, msg);
-    }
-
-    /**
-     * Send a CancelRequest message. This does not lock the connection, so the
-     * caller needs to ensure this method is called appropriately.
-     * @exception IOException - could be due to abortive connection closure.
-     */
-    public void sendCancelRequest(GIOPVersion giopVersion, int requestId)
-	throws IOException 
-    {
-
-        Message msg = MessageBase.createCancelRequest(giopVersion, requestId);
-	sendHelper(giopVersion, msg);
-    }
-
-    protected void sendHelper(GIOPVersion giopVersion, Message msg)
-	throws IOException
-    {
-	// REVISIT: See comments in CDROutputObject constructor.
-        CDROutputObject outputObject = 
-	    new CDROutputObject((ORB)orb, null, giopVersion, this, msg,
-				ORBConstants.STREAM_FORMAT_VERSION_1);
-        msg.write(outputObject);
-
-	outputObject.writeTo(this);
-    }
-
-    public void sendCancelRequestWithLock(GIOPVersion giopVersion,
-					  int requestId)
-	throws IOException 
-    {
-	writeLock();
-	try {
-	    sendCancelRequest(giopVersion, requestId);
-	} finally {
-	    writeUnlock();
-	}
-    }
-
-    // Begin Code Base methods ---------------------------------------
-    //
-    // Set this connection's code base IOR.  The IOR comes from the
-    // SendingContext.  This is an optional service context, but all
-    // JavaSoft ORBs send it.
-    //
-    // The set and get methods don't need to be synchronized since the
-    // first possible get would occur during reading a valuetype, and
-    // that would be after the set.
-
-    // Sets this connection's code base IOR.  This is done after
-    // getting the IOR out of the SendingContext service context.
-    // Our ORBs always send this, but it's optional in CORBA.
-
-    public final void setCodeBaseIOR(IOR ior) {
-        codeBaseServerIOR = ior;
-    }
-
-    public final IOR getCodeBaseIOR() {
-        return codeBaseServerIOR;
-    }
-
-    // Get a CodeBase stub to use in unmarshaling.  The CachedCodeBase
-    // won't connect to the remote codebase unless it's necessary.
-    public final CodeBase getCodeBase() {
-        return cachedCodeBase;
-    }
-
-    // End Code Base methods -----------------------------------------
-
-    // Can be overridden in subclass for different options.
-    protected void setSocketOptions(Socket socket)
-    {
-    }
-
-    public String toString()
-    {
-        synchronized ( stateEvent ){
-            return 
-		"BufferConnectionImpl[" + " "
-		+ getStateString( state ) + " "
-		+ shouldUseSelectThreadToWait() + " "
-		+ shouldUseWorkerThreadForEvent()
-		+ "]" ;
-        }
-    }
-    
-    // Must be public - used in encoding.
-    public void dprint(String msg) 
-    {
-	ORBUtility.dprint("SocketOrChannelConnectionImpl", msg);
-    }
-
-    protected void dprint(String msg, Throwable t)
-    {
-	dprint(msg);
-	t.printStackTrace(System.out);
-    }
-}
-
-// End of file.
--- a/hotspot/.hgtags	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/.hgtags	Wed Jul 05 19:07:19 2017 +0200
@@ -365,3 +365,5 @@
 46487ba40ff225654d0c51787ed3839bafcbd9f3 hs25-b43
 f6921c876db192bba389cec062855a66372da01c jdk8-b101
 530fe88b3b2c710f42810b3580d86a0d83ad6c1c hs25-b44
+c4697c1c448416108743b59118b4a2498b339d0c jdk8-b102
+7f55137d6aa81efc6eb0035813709f2cb6a26b8b hs25-b45
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/jdi/JVMTIThreadState.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/jdi/JVMTIThreadState.java	Wed Jul 05 19:07:19 2017 +0200
@@ -29,11 +29,10 @@
     public static final int JVMTI_THREAD_STATE_ALIVE = 0x0001;
     public static final int JVMTI_THREAD_STATE_TERMINATED = 0x0002;
     public static final int JVMTI_THREAD_STATE_RUNNABLE = 0x0004;
-    public static final int JVMTI_THREAD_STATE_WAITING = 0x0008;
+    public static final int JVMTI_THREAD_STATE_WAITING = 0x0080;
     public static final int JVMTI_THREAD_STATE_WAITING_INDEFINITELY = 0x0010;
     public static final int JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT = 0x0020;
     public static final int JVMTI_THREAD_STATE_SLEEPING = 0x0040;
-    public static final int JVMTI_THREAD_STATE_WAITING_FOR_NOTIFICATION = 0x0080;
     public static final int JVMTI_THREAD_STATE_IN_OBJECT_WAIT = 0x0100;
     public static final int JVMTI_THREAD_STATE_PARKED = 0x0200;
     public static final int JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER = 0x0400;
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/OSThread.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/OSThread.java	Wed Jul 05 19:07:19 2017 +0200
@@ -32,7 +32,7 @@
 // to the sys_thread_t structure of the classic JVM implementation.
 public class OSThread extends VMObject {
     private static JIntField interruptedField;
-    private static JIntField threadIdField;
+    private static Field threadIdField;
     static {
         VM.registerVMInitializedObserver(new Observer() {
             public void update(Observable o, Object data) {
@@ -44,7 +44,7 @@
     private static synchronized void initialize(TypeDataBase db) {
         Type type = db.lookupType("OSThread");
         interruptedField = type.getJIntField("_interrupted");
-        threadIdField = type.getJIntField("_thread_id");
+        threadIdField = type.getField("_thread_id");
     }
 
     public OSThread(Address addr) {
@@ -56,7 +56,7 @@
     }
 
     public int threadId() {
-        return (int)threadIdField.getValue(addr);
+        return threadIdField.getJInt(addr);
     }
 
 }
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassDump.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassDump.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -74,23 +74,24 @@
     public void run() {
         // Ready to go with the database...
         try {
-            // The name of the filter always comes from a System property.
-            // If we have a pkgList, pass it, otherwise let the filter read
-            // its own System property for the list of classes.
-            String filterClassName = System.getProperty("sun.jvm.hotspot.tools.jcore.filter",
-                                                        "sun.jvm.hotspot.tools.jcore.PackageNameFilter");
-            try {
-                Class filterClass = Class.forName(filterClassName);
-                if (pkgList == null) {
-                    classFilter = (ClassFilter) filterClass.newInstance();
-                } else {
-                    Constructor con = filterClass.getConstructor(String.class);
-                    classFilter = (ClassFilter) con.newInstance(pkgList);
+            if (classFilter == null) {
+                // If not already set, the name of the filter comes from a System property.
+                // If we have a pkgList, pass it, otherwise let the filter read
+                // its own System property for the list of classes.
+                String filterClassName = System.getProperty("sun.jvm.hotspot.tools.jcore.filter",
+                                                            "sun.jvm.hotspot.tools.jcore.PackageNameFilter");
+                try {
+                    Class filterClass = Class.forName(filterClassName);
+                    if (pkgList == null) {
+                        classFilter = (ClassFilter) filterClass.newInstance();
+                    } else {
+                        Constructor con = filterClass.getConstructor(String.class);
+                        classFilter = (ClassFilter) con.newInstance(pkgList);
+                    }
+                } catch(Exception exp) {
+                    System.err.println("Warning: Can not create class filter!");
                 }
-            } catch(Exception exp) {
-                System.err.println("Warning: Can not create class filter!");
             }
-
             String outputDirectory = System.getProperty("sun.jvm.hotspot.tools.jcore.outputDir", ".");
             setOutputDirectory(outputDirectory);
 
--- a/hotspot/make/hotspot_version	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/make/hotspot_version	Wed Jul 05 19:07:19 2017 +0200
@@ -35,7 +35,7 @@
 
 HS_MAJOR_VER=25
 HS_MINOR_VER=0
-HS_BUILD_NUMBER=44
+HS_BUILD_NUMBER=45
 
 JDK_MAJOR_VER=1
 JDK_MINOR_VER=8
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp	Wed Jul 05 19:07:19 2017 +0200
@@ -2295,7 +2295,7 @@
       if (gen_type_check) {
         // We have determined that offset == referent_offset && src != null.
         // if (src->_klass->_reference_type == REF_NONE) -> continue
-        __ move(new LIR_Address(src.result(), oopDesc::klass_offset_in_bytes(), UseCompressedKlassPointers ? T_OBJECT : T_ADDRESS), src_klass);
+        __ move(new LIR_Address(src.result(), oopDesc::klass_offset_in_bytes(), T_ADDRESS), src_klass);
         LIR_Address* reference_type_addr = new LIR_Address(src_klass, in_bytes(InstanceKlass::reference_type_offset()), T_BYTE);
         LIR_Opr reference_type = new_register(T_INT);
         __ move(reference_type_addr, reference_type);
--- a/hotspot/src/share/vm/classfile/classLoader.cpp	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/src/share/vm/classfile/classLoader.cpp	Wed Jul 05 19:07:19 2017 +0200
@@ -878,7 +878,7 @@
 
 instanceKlassHandle ClassLoader::load_classfile(Symbol* h_name, TRAPS) {
   ResourceMark rm(THREAD);
-  EventMark m("loading class " INTPTR_FORMAT, (address)h_name);
+  EventMark m("loading class %s", h_name->as_C_string());
   ThreadProfilerMark tpm(ThreadProfilerMark::classLoaderRegion);
 
   stringStream st;
--- a/hotspot/src/share/vm/runtime/arguments.cpp	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.cpp	Wed Jul 05 19:07:19 2017 +0200
@@ -60,6 +60,28 @@
 #define DEFAULT_VENDOR_URL_BUG "http://bugreport.sun.com/bugreport/crash.jsp"
 #define DEFAULT_JAVA_LAUNCHER  "generic"
 
+// Disable options not supported in this release, with a warning if they
+// were explicitly requested on the command-line
+#define UNSUPPORTED_OPTION(opt, description)                    \
+do {                                                            \
+  if (opt) {                                                    \
+    if (FLAG_IS_CMDLINE(opt)) {                                 \
+      warning(description " is disabled in this release.");     \
+    }                                                           \
+    FLAG_SET_DEFAULT(opt, false);                               \
+  }                                                             \
+} while(0)
+
+#define UNSUPPORTED_GC_OPTION(gc)                                     \
+do {                                                                  \
+  if (gc) {                                                           \
+    if (FLAG_IS_CMDLINE(gc)) {                                        \
+      warning(#gc " is not supported in this VM.  Using Serial GC."); \
+    }                                                                 \
+    FLAG_SET_DEFAULT(gc, false);                                      \
+  }                                                                   \
+} while(0)
+
 char**  Arguments::_jvm_flags_array             = NULL;
 int     Arguments::_num_jvm_flags               = 0;
 char**  Arguments::_jvm_args_array              = NULL;
@@ -3128,14 +3150,17 @@
     FLAG_SET_DEFAULT(UseLargePages, false);
   }
 
-  // Tiered compilation is undefined with C1.
-  TieredCompilation = false;
 #else
   if (!FLAG_IS_DEFAULT(OptoLoopAlignment) && FLAG_IS_DEFAULT(MaxLoopPad)) {
     FLAG_SET_DEFAULT(MaxLoopPad, OptoLoopAlignment-1);
   }
 #endif
 
+#ifndef TIERED
+  // Tiered compilation is undefined.
+  UNSUPPORTED_OPTION(TieredCompilation, "TieredCompilation");
+#endif
+
   // If we are running in a headless jre, force java.awt.headless property
   // to be true unless the property has already been set.
   // Also allow the OS environment variable JAVA_AWT_HEADLESS to set headless state.
@@ -3278,29 +3303,6 @@
   }
 }
 
-// Disable options not supported in this release, with a warning if they
-// were explicitly requested on the command-line
-#define UNSUPPORTED_OPTION(opt, description)                    \
-do {                                                            \
-  if (opt) {                                                    \
-    if (FLAG_IS_CMDLINE(opt)) {                                 \
-      warning(description " is disabled in this release.");     \
-    }                                                           \
-    FLAG_SET_DEFAULT(opt, false);                               \
-  }                                                             \
-} while(0)
-
-
-#define UNSUPPORTED_GC_OPTION(gc)                                     \
-do {                                                                  \
-  if (gc) {                                                           \
-    if (FLAG_IS_CMDLINE(gc)) {                                        \
-      warning(#gc " is not supported in this VM.  Using Serial GC."); \
-    }                                                                 \
-    FLAG_SET_DEFAULT(gc, false);                                      \
-  }                                                                   \
-} while(0)
-
 #if !INCLUDE_ALL_GCS
 static void force_serial_gc() {
   FLAG_SET_DEFAULT(UseSerialGC, true);
--- a/hotspot/src/share/vm/services/gcNotifier.cpp	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/src/share/vm/services/gcNotifier.cpp	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -211,9 +211,9 @@
     NotificationMark nm(request);
     Handle objGcInfo = createGcInfo(request->gcManager, request->gcStatInfo, THREAD);
 
-    Handle objName = java_lang_String::create_from_platform_dependent_str(request->gcManager->name(), CHECK);
-    Handle objAction = java_lang_String::create_from_platform_dependent_str(request->gcAction, CHECK);
-    Handle objCause = java_lang_String::create_from_platform_dependent_str(request->gcCause, CHECK);
+    Handle objName = java_lang_String::create_from_str(request->gcManager->name(), CHECK);
+    Handle objAction = java_lang_String::create_from_str(request->gcAction, CHECK);
+    Handle objCause = java_lang_String::create_from_str(request->gcCause, CHECK);
 
     Klass* k = Management::sun_management_GarbageCollectorImpl_klass(CHECK);
     instanceKlassHandle gc_mbean_klass(THREAD, k);
--- a/hotspot/src/share/vm/services/management.cpp	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/src/share/vm/services/management.cpp	Wed Jul 05 19:07:19 2017 +0200
@@ -1831,13 +1831,13 @@
  private:
   objArrayHandle _names_strings;
   char **_names_chars;
-  typeArrayOop _times;
+  typeArrayHandle _times;
   int _names_len;
   int _times_len;
   int _count;
 
  public:
-  ThreadTimesClosure(objArrayHandle names, typeArrayOop times);
+  ThreadTimesClosure(objArrayHandle names, typeArrayHandle times);
   ~ThreadTimesClosure();
   virtual void do_thread(Thread* thread);
   void do_unlocked();
@@ -1845,9 +1845,9 @@
 };
 
 ThreadTimesClosure::ThreadTimesClosure(objArrayHandle names,
-                                       typeArrayOop times) {
+                                       typeArrayHandle times) {
   assert(names() != NULL, "names was NULL");
-  assert(times != NULL, "times was NULL");
+  assert(times() != NULL, "times was NULL");
   _names_strings = names;
   _names_len = names->length();
   _names_chars = NEW_C_HEAP_ARRAY(char*, _names_len, mtInternal);
@@ -1925,7 +1925,7 @@
   typeArrayOop ta = typeArrayOop(JNIHandles::resolve_non_null(times));
   typeArrayHandle times_ah(THREAD, ta);
 
-  ThreadTimesClosure ttc(names_ah, times_ah());
+  ThreadTimesClosure ttc(names_ah, times_ah);
   {
     MutexLockerEx ml(Threads_lock);
     Threads::threads_do(&ttc);
--- a/hotspot/src/share/vm/utilities/exceptions.cpp	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/src/share/vm/utilities/exceptions.cpp	Wed Jul 05 19:07:19 2017 +0200
@@ -125,13 +125,13 @@
 }
 
 void Exceptions::_throw(Thread* thread, const char* file, int line, Handle h_exception, const char* message) {
+  ResourceMark rm;
   assert(h_exception() != NULL, "exception should not be NULL");
 
   // tracing (do this up front - so it works during boot strapping)
   if (TraceExceptions) {
     ttyLocker ttyl;
-    ResourceMark rm;
-    tty->print_cr("Exception <%s>%s%s (" INTPTR_FORMAT " ) \n"
+    tty->print_cr("Exception <%s%s%s> (" INTPTR_FORMAT ") \n"
                   "thrown [%s, line %d]\nfor thread " INTPTR_FORMAT,
                   h_exception->print_value_string(),
                   message ? ": " : "", message ? message : "",
@@ -141,7 +141,9 @@
   NOT_PRODUCT(Exceptions::debug_check_abort(h_exception, message));
 
   // Check for special boot-strapping/vm-thread handling
-  if (special_exception(thread, file, line, h_exception)) return;
+  if (special_exception(thread, file, line, h_exception)) {
+    return;
+  }
 
   assert(h_exception->is_a(SystemDictionary::Throwable_klass()), "exception is not a subclass of java/lang/Throwable");
 
@@ -149,7 +151,9 @@
   thread->set_pending_exception(h_exception(), file, line);
 
   // vm log
-  Events::log_exception(thread, "Threw " INTPTR_FORMAT " at %s:%d", (address)h_exception(), file, line);
+  Events::log_exception(thread, "Exception <%s%s%s> (" INTPTR_FORMAT ") thrown at [%s, line %d]",
+                        h_exception->print_value_string(), message ? ": " : "", message ? message : "",
+                        (address)h_exception(), file, line);
 }
 
 
--- a/hotspot/src/share/vm/utilities/taskqueue.hpp	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/src/share/vm/utilities/taskqueue.hpp	Wed Jul 05 19:07:19 2017 +0200
@@ -395,7 +395,13 @@
 template<class E, MEMFLAGS F, unsigned int N>
 bool GenericTaskQueue<E, F, N>::pop_global(E& t) {
   Age oldAge = _age.get();
-  uint localBot = _bottom;
+  // Architectures with weak memory model require a barrier here
+  // to guarantee that bottom is not older than age,
+  // which is crucial for the correctness of the algorithm.
+#if !(defined SPARC || defined IA32 || defined AMD64)
+  OrderAccess::fence();
+#endif
+  uint localBot = OrderAccess::load_acquire((volatile juint*)&_bottom);
   uint n_elems = size(localBot, oldAge.top());
   if (n_elems == 0) {
     return false;
@@ -644,7 +650,7 @@
 template<class E, MEMFLAGS F, unsigned int N> inline bool
 GenericTaskQueue<E, F, N>::push(E t) {
   uint localBot = _bottom;
-  assert((localBot >= 0) && (localBot < N), "_bottom out of range.");
+  assert(localBot < N, "_bottom out of range.");
   idx_t top = _age.top();
   uint dirty_n_elems = dirty_size(localBot, top);
   assert(dirty_n_elems < N, "n_elems out of range.");
--- a/hotspot/test/compiler/codecache/CheckUpperLimit.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/test/compiler/codecache/CheckUpperLimit.java	Wed Jul 05 19:07:19 2017 +0200
@@ -35,10 +35,6 @@
     ProcessBuilder pb;
     OutputAnalyzer out;
 
-    pb = ProcessTools.createJavaProcessBuilder("-XX:ReservedCodeCacheSize=2048m", "-version");
-    out = new OutputAnalyzer(pb.start());
-    out.shouldHaveExitValue(0);
-
     pb = ProcessTools.createJavaProcessBuilder("-XX:ReservedCodeCacheSize=2049m", "-version");
     out = new OutputAnalyzer(pb.start());
     out.shouldContain("Invalid ReservedCodeCacheSize=");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/unsafe/GetUnsafeObjectG1PreBarrier.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * 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
+ * @bug 8016474
+ * @summary The bug only happens with C1 and G1 using a different ObjectAlignmentInBytes than KlassAlignmentInBytes (which is 8)
+ * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=32 GetUnsafeObjectG1PreBarrier
+ */
+
+import java.lang.reflect.Field;
+
+import sun.misc.Unsafe;
+
+public class GetUnsafeObjectG1PreBarrier {
+    private static final Unsafe unsafe;
+    private static final int N = 100_000;
+
+    static {
+        try {
+            Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
+            theUnsafe.setAccessible(true);
+            unsafe = (Unsafe) theUnsafe.get(null);
+        } catch (NoSuchFieldException | IllegalAccessException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    public Object a;
+
+    public static void main(String[] args) throws Throwable {
+        new GetUnsafeObjectG1PreBarrier();
+    }
+
+    public GetUnsafeObjectG1PreBarrier() throws Throwable {
+        doit();
+    }
+
+    private void doit() throws Throwable {
+        Field field = GetUnsafeObjectG1PreBarrier.class.getField("a");
+        long fieldOffset = unsafe.objectFieldOffset(field);
+
+        for (int i = 0; i < N; i++) {
+            readField(this, fieldOffset);
+        }
+    }
+
+    private void readField(Object o, long fieldOffset) {
+        unsafe.getObject(o, fieldOffset);
+    }
+}
--- a/hotspot/test/runtime/7196045/Test7196045.java	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 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 7196045
- * @summary Possible JVM deadlock in ThreadTimesClosure when using HotspotInternal non-public API.
- * @run main/othervm -XX:+UsePerfData Test7196045
- */
-
-import java.lang.management.ManagementFactory;
-import javax.management.JMException;
-import javax.management.MBeanServer;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-
-public class Test7196045 {
-
-    public static long duration = 1000 * 60 * 2;
-    private static final String HOTSPOT_INTERNAL = "sun.management:type=HotspotInternal";
-
-    public static void main(String[] args) {
-
-        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
-        ObjectName objName= null;
-        try {
-            ObjectName hotspotInternal = new ObjectName(HOTSPOT_INTERNAL);
-            try {
-                server.registerMBean(new sun.management.HotspotInternal(), hotspotInternal);
-            } catch (JMException e) {
-                throw new RuntimeException("HotSpotWatcher: Failed to register the HotspotInternal MBean" + e);
-            }
-            objName= new ObjectName("sun.management:type=HotspotThreading");
-
-        } catch (MalformedObjectNameException e1) {
-            throw new RuntimeException("Bad object name" + e1);
-        }
-
-        long endTime = System.currentTimeMillis() + duration;
-        long i = 0;
-        while (true) {
-            try {
-                server.getAttribute(objName, "InternalThreadCpuTimes");
-            } catch (Exception ex) {
-                System.err.println("Exception while getting attribute: " + ex);
-            }
-            i++;
-            if (i % 10000 == 0) {
-                System.out.println("Successful iterations: " + i);
-            }
-            if (System.currentTimeMillis() > endTime) {
-                break;
-            }
-        }
-        System.out.println("PASSED.");
-    }
-}
--- a/hotspot/test/runtime/8000968/Test8000968.sh	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-#
-#  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 Test8000968.sh
-# @bug 8000968
-# @summary NPG: UseCompressedKlassPointers asserts with ObjectAlignmentInBytes=32
-# @run shell Test8000968.sh
-#
-
-if [ "${TESTJAVA}" = "" ]
-then
-  PARENT=`dirname \`which java\``
-  TESTJAVA=`dirname ${PARENT}`
-  printf "TESTJAVA not set, selecting " ${TESTJAVA}
-  printf "  If this is incorrect, try setting the variable manually.\n"
-fi
-
-
-# set platform-dependent variables
-OS=`uname -s`
-case "$OS" in
-  Windows_* )
-    FS="\\"
-    NULL=NUL
-    ;;
-  * )
-    FS="/"
-    NULL=/dev/null
-    ;;
-esac
-
-JAVA=${TESTJAVA}${FS}bin${FS}java
-
-#
-# See if platform has 64 bit java.
-#
-${JAVA} ${TESTVMOPTS} -d64 -version 2>&1 | grep -i "does not support" > ${NULL}
-if [ "$?" != "1" ]
-then
-  printf "Platform is 32 bit, does not support -XX:ObjectAlignmentInBytes= option.\n"
-  printf "Passed.\n"
-  exit 0
-fi
-
-#
-# Test -XX:ObjectAlignmentInBytes with -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops.
-#
-${JAVA} ${TESTVMOPTS} -d64 -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=16 -version 2>&1 > ${NULL}
-if [ "$?" != "0" ]
-then
-  printf "FAILED: -XX:ObjectAlignmentInBytes=16 option did not work.\n"
-  exit 1
-fi
-
-${JAVA} ${TESTVMOPTS} -d64 -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=32 -version 2>&1 > ${NULL}
-if [ "$?" != "0" ]
-then
-  printf "FAILED: -XX:ObjectAlignmentInBytes=32 option did not work.\n"
-  exit 1
-fi
-
-${JAVA} ${TESTVMOPTS} -d64 -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=64 -version 2>&1 > ${NULL}
-if [ "$?" != "0" ]
-then
-  printf "FAILED: -XX:ObjectAlignmentInBytes=64 option did not work.\n"
-  exit 1
-fi
-
-${JAVA} ${TESTVMOPTS} -d64 -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=128 -version 2>&1 > ${NULL}
-if [ "$?" != "0" ]
-then
-  printf "FAILED: -XX:ObjectAlignmentInBytes=128 option did not work.\n"
-  exit 1
-fi
-
-
-printf "Passed.\n"
-exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/CompressedOops/CompressedKlassPointerAndOops.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,63 @@
+/*
+ * 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
+ * @bug 8000968
+ * @key regression
+ * @summary NPG: UseCompressedKlassPointers asserts with ObjectAlignmentInBytes=32
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.*;
+
+public class CompressedKlassPointerAndOops {
+
+    public static void main(String[] args) throws Exception {
+
+        if (!Platform.is64bit()) {
+            // Can't test this on 32 bit, just pass
+            System.out.println("Skipping test on 32bit");
+            return;
+        }
+
+        runWithAlignment(16);
+        runWithAlignment(32);
+        runWithAlignment(64);
+        runWithAlignment(128);
+    }
+
+    private static void runWithAlignment(int alignment) throws Exception {
+        ProcessBuilder pb;
+        OutputAnalyzer output;
+
+        pb = ProcessTools.createJavaProcessBuilder(
+            "-XX:+UseCompressedKlassPointers",
+            "-XX:+UseCompressedOops",
+            "-XX:ObjectAlignmentInBytes=" + alignment,
+            "-version");
+
+        output = new OutputAnalyzer(pb.start());
+        output.shouldHaveExitValue(0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/InternalApi/ThreadCpuTimesDeadlock.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2012, 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
+ * @bug 7196045
+ * @bug 8014294
+ * @summary Possible JVM deadlock in ThreadTimesClosure when using HotspotInternal non-public API.
+ * @run main/othervm -XX:+UsePerfData -Xmx32m ThreadCpuTimesDeadlock
+ */
+
+import java.lang.management.ManagementFactory;
+import javax.management.JMException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+public class ThreadCpuTimesDeadlock {
+
+    public static byte[] dummy;
+    public static long duration = 10 * 1000;
+    private static final String HOTSPOT_INTERNAL = "sun.management:type=HotspotInternal";
+
+    public static void main(String[] args) {
+
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        ObjectName objName= null;
+        try {
+            ObjectName hotspotInternal = new ObjectName(HOTSPOT_INTERNAL);
+            try {
+                server.registerMBean(new sun.management.HotspotInternal(), hotspotInternal);
+            } catch (JMException e) {
+                throw new RuntimeException("HotSpotWatcher: Failed to register the HotspotInternal MBean" + e);
+            }
+            objName= new ObjectName("sun.management:type=HotspotThreading");
+
+        } catch (MalformedObjectNameException e1) {
+            throw new RuntimeException("Bad object name" + e1);
+        }
+
+        // Thread that allocs memory to generate GC's
+        Thread allocThread = new Thread() {
+          public void run() {
+            while (true) {
+              dummy = new byte[4096];
+            }
+          }
+        };
+
+        allocThread.setDaemon(true);
+        allocThread.start();
+
+        long endTime = System.currentTimeMillis() + duration;
+        long i = 0;
+        while (true) {
+            try {
+                server.getAttribute(objName, "InternalThreadCpuTimes");
+            } catch (Exception ex) {
+                System.err.println("Exception while getting attribute: " + ex);
+            }
+            i++;
+            if (i % 10000 == 0) {
+                System.out.println("Successful iterations: " + i);
+            }
+            if (System.currentTimeMillis() > endTime) {
+                break;
+            }
+        }
+        System.out.println("PASSED.");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary/OutputAnalyzerReportingTest.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,124 @@
+/*
+ * 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
+ * @summary Test the OutputAnalyzer reporting functionality,
+ *     such as printing additional diagnostic info
+ *     (exit code, stdout, stderr, command line, etc.)
+ * @library /testlibrary
+ */
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import com.oracle.java.testlibrary.OutputAnalyzer;
+import com.oracle.java.testlibrary.ProcessTools;
+
+
+public class OutputAnalyzerReportingTest {
+
+    public static void main(String[] args) throws Exception {
+        // Create the output analyzer under test
+        String stdout = "aaaaaa";
+        String stderr = "bbbbbb";
+        OutputAnalyzer output = new OutputAnalyzer(stdout, stderr);
+
+        // Expected summary values should be the same for all cases,
+        // since the outputAnalyzer object is the same
+        String expectedExitValue = "-1";
+        String expectedSummary =
+                " stdout: [" + stdout + "];\n" +
+                " stderr: [" + stderr + "]\n" +
+                " exitValue = " + expectedExitValue + "\n";
+
+
+        DiagnosticSummaryTestRunner testRunner =
+                new DiagnosticSummaryTestRunner();
+
+        // should have exit value
+        testRunner.init(expectedSummary);
+        int unexpectedExitValue = 2;
+        try {
+            output.shouldHaveExitValue(unexpectedExitValue);
+        } catch (RuntimeException e) { }
+        testRunner.closeAndCheckResults();
+
+        // should not contain
+        testRunner.init(expectedSummary);
+        try {
+            output.shouldNotContain(stdout);
+        } catch (RuntimeException e) { }
+        testRunner.closeAndCheckResults();
+
+        // should contain
+        testRunner.init(expectedSummary);
+        try {
+            output.shouldContain("unexpected-stuff");
+        } catch (RuntimeException e) { }
+        testRunner.closeAndCheckResults();
+
+        // should not match
+        testRunner.init(expectedSummary);
+        try {
+            output.shouldNotMatch("[a]");
+        } catch (RuntimeException e) { }
+        testRunner.closeAndCheckResults();
+
+        // should match
+        testRunner.init(expectedSummary);
+        try {
+            output.shouldMatch("[qwerty]");
+        } catch (RuntimeException e) { }
+        testRunner.closeAndCheckResults();
+
+    }
+
+    private static class DiagnosticSummaryTestRunner {
+        private ByteArrayOutputStream byteStream =
+                new ByteArrayOutputStream(10000);
+
+        private String expectedSummary = "";
+        private PrintStream errStream;
+
+
+        public void init(String expectedSummary) {
+            this.expectedSummary = expectedSummary;
+            byteStream.reset();
+            errStream = new PrintStream(byteStream);
+            System.setErr(errStream);
+        }
+
+        public void closeAndCheckResults() {
+            // check results
+            errStream.close();
+            String stdErrStr = byteStream.toString();
+            if (!stdErrStr.contains(expectedSummary)) {
+                throw new RuntimeException("The output does not contain "
+                    + "the diagnostic message, or the message is incorrect");
+            }
+        }
+    }
+
+}
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/OutputAnalyzer.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/OutputAnalyzer.java	Wed Jul 05 19:07:19 2017 +0200
@@ -76,7 +76,8 @@
    */
   public void shouldContain(String expectedString) {
     if (!stdout.contains(expectedString) && !stderr.contains(expectedString)) {
-      throw new RuntimeException("'" + expectedString + "' missing from stdout/stderr: [" + stdout + stderr + "]\n");
+        reportDiagnosticSummary();
+        throw new RuntimeException("'" + expectedString + "' missing from stdout/stderr \n");
     }
   }
 
@@ -88,7 +89,8 @@
    */
   public void stdoutShouldContain(String expectedString) {
     if (!stdout.contains(expectedString)) {
-      throw new RuntimeException("'" + expectedString + "' missing from stdout: [" + stdout + "]\n");
+        reportDiagnosticSummary();
+        throw new RuntimeException("'" + expectedString + "' missing from stdout \n");
     }
   }
 
@@ -100,7 +102,8 @@
    */
   public void stderrShouldContain(String expectedString) {
     if (!stderr.contains(expectedString)) {
-      throw new RuntimeException("'" + expectedString + "' missing from stderr: [" + stderr + "]\n");
+        reportDiagnosticSummary();
+        throw new RuntimeException("'" + expectedString + "' missing from stderr \n");
     }
   }
 
@@ -112,10 +115,12 @@
    */
   public void shouldNotContain(String notExpectedString) {
     if (stdout.contains(notExpectedString)) {
-      throw new RuntimeException("'" + notExpectedString + "' found in stdout: [" + stdout + "]\n");
+        reportDiagnosticSummary();
+        throw new RuntimeException("'" + notExpectedString + "' found in stdout \n");
     }
     if (stderr.contains(notExpectedString)) {
-      throw new RuntimeException("'" + notExpectedString + "' found in stderr: [" + stderr + "]\n");
+        reportDiagnosticSummary();
+        throw new RuntimeException("'" + notExpectedString + "' found in stderr \n");
     }
   }
 
@@ -127,7 +132,8 @@
    */
   public void stdoutShouldNotContain(String notExpectedString) {
     if (stdout.contains(notExpectedString)) {
-      throw new RuntimeException("'" + notExpectedString + "' found in stdout: [" + stdout + "]\n");
+        reportDiagnosticSummary();
+        throw new RuntimeException("'" + notExpectedString + "' found in stdout \n");
     }
   }
 
@@ -139,7 +145,8 @@
    */
   public void stderrShouldNotContain(String notExpectedString) {
     if (stderr.contains(notExpectedString)) {
-      throw new RuntimeException("'" + notExpectedString + "' found in stderr: [" + stderr + "]\n");
+        reportDiagnosticSummary();
+        throw new RuntimeException("'" + notExpectedString + "' found in stderr \n");
     }
   }
 
@@ -154,9 +161,9 @@
       Matcher stdoutMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
       Matcher stderrMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
       if (!stdoutMatcher.find() && !stderrMatcher.find()) {
+          reportDiagnosticSummary();
           throw new RuntimeException("'" + pattern
-                  + "' missing from stdout/stderr: [" + stdout + stderr
-                  + "]\n");
+                + "' missing from stdout/stderr \n");
       }
   }
 
@@ -170,8 +177,9 @@
   public void stdoutShouldMatch(String pattern) {
       Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
       if (!matcher.find()) {
+          reportDiagnosticSummary();
           throw new RuntimeException("'" + pattern
-                  + "' missing from stdout: [" + stdout + "]\n");
+                + "' missing from stdout \n");
       }
   }
 
@@ -185,8 +193,9 @@
   public void stderrShouldMatch(String pattern) {
       Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
       if (!matcher.find()) {
+          reportDiagnosticSummary();
           throw new RuntimeException("'" + pattern
-                  + "' missing from stderr: [" + stderr + "]\n");
+                + "' missing from stderr \n");
       }
   }
 
@@ -200,13 +209,15 @@
   public void shouldNotMatch(String pattern) {
       Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
       if (matcher.find()) {
+          reportDiagnosticSummary();
           throw new RuntimeException("'" + pattern
-                  + "' found in stdout: [" + stdout + "]\n");
+                  + "' found in stdout \n");
       }
       matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
       if (matcher.find()) {
+          reportDiagnosticSummary();
           throw new RuntimeException("'" + pattern
-                  + "' found in stderr: [" + stderr + "]\n");
+                  + "' found in stderr \n");
       }
   }
 
@@ -220,8 +231,9 @@
   public void stdoutShouldNotMatch(String pattern) {
       Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
       if (matcher.find()) {
+          reportDiagnosticSummary();
           throw new RuntimeException("'" + pattern
-                  + "' found in stdout: [" + stdout + "]\n");
+                  + "' found in stdout \n");
       }
   }
 
@@ -235,23 +247,45 @@
   public void stderrShouldNotMatch(String pattern) {
       Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
       if (matcher.find()) {
+          reportDiagnosticSummary();
           throw new RuntimeException("'" + pattern
-                  + "' found in stderr: [" + stderr + "]\n");
+                  + "' found in stderr \n");
       }
   }
 
   /**
-   * Verifiy the exit value of the process
+   * Verify the exit value of the process
    *
    * @param expectedExitValue Expected exit value from process
    * @throws RuntimeException If the exit value from the process did not match the expected value
    */
   public void shouldHaveExitValue(int expectedExitValue) {
       if (getExitValue() != expectedExitValue) {
-          throw new RuntimeException("Exit value " + getExitValue() + " , expected to get " + expectedExitValue);
+          reportDiagnosticSummary();
+          throw new RuntimeException("Expected to get exit value of ["
+                  + expectedExitValue + "]\n");
       }
   }
 
+
+  /**
+   * Report summary that will help to diagnose the problem
+   * Currently includes:
+   *  - standard input produced by the process under test
+   *  - standard output
+   *  - exit code
+   *  Note: the command line is printed by the ProcessTools
+   */
+    private void reportDiagnosticSummary() {
+        String msg =
+            " stdout: [" + stdout + "];\n" +
+            " stderr: [" + stderr + "]\n" +
+            " exitValue = " + getExitValue() + "\n";
+
+        System.err.println(msg);
+    }
+
+
   /**
    * Get the contents of the output buffer (stdout and stderr)
    *
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java	Wed Jul 05 19:07:19 2017 +0200
@@ -27,6 +27,7 @@
   private static final String osName = System.getProperty("os.name");
   private static final String dataModel = System.getProperty("sun.arch.data.model");
   private static final String vmVersion = System.getProperty("java.vm.version");
+  private static final String osArch = System.getProperty("os.arch");
 
   public static boolean is64bit() {
     return dataModel.equals("64");
@@ -59,4 +60,14 @@
   public static String getVMVersion() {
     return vmVersion;
   }
+
+  // Returns true for sparc and sparcv9.
+  public static boolean isSparc() {
+    return osArch.toLowerCase().startsWith("sparc");
+  }
+
+  public static String getOsArch() {
+    return osArch;
+  }
+
 }
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/ProcessTools.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/ProcessTools.java	Wed Jul 05 19:07:19 2017 +0200
@@ -31,6 +31,7 @@
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
 
 import sun.management.VMManagement;
 
@@ -107,6 +108,22 @@
   }
 
   /**
+   * Get the string containing input arguments passed to the VM
+   *
+   * @return arguments
+   */
+  public static String getVmInputArguments() {
+    RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
+
+    List<String> args = runtime.getInputArguments();
+    StringBuilder result = new StringBuilder();
+    for (String arg : args)
+        result.append(arg).append(' ');
+
+    return result.toString();
+  }
+
+  /**
    * Get platform specific VM arguments (e.g. -d64 on 64bit Solaris)
    *
    * @return String[] with platform specific arguments, empty if there are none
@@ -132,8 +149,13 @@
     Collections.addAll(args, getPlatformSpecificVMArgs());
     Collections.addAll(args, command);
 
+    // Reporting
+    StringBuilder cmdLine = new StringBuilder();
+    for (String cmd : args)
+        cmdLine.append(cmd).append(' ');
+    System.out.println("Command line: [" + cmdLine.toString() + "]");
+
     return new ProcessBuilder(args.toArray(new String[args.size()]));
-
   }
 
 }
--- a/jdk/.hgtags	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/.hgtags	Wed Jul 05 19:07:19 2017 +0200
@@ -223,3 +223,4 @@
 6a099a36589bd933957272ba63e5263bede29971 jdk8-b99
 5be9c5bfcfe9b2a40412b4fb364377d49de014eb jdk8-b100
 6901612328239fbd471d20823113c1cf3fdaebee jdk8-b101
+8ed8e2b4b90e0ac9aa5b3efef51cd576a9db96a9 jdk8-b102
--- a/jdk/makefiles/CompileNativeLibraries.gmk	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/makefiles/CompileNativeLibraries.gmk	Wed Jul 05 19:07:19 2017 +0200
@@ -798,6 +798,16 @@
 	LIBAWT_XAWT_CFLAGS += -DFUNCPROTO=15
 endif
 
+ifeq ($(OPENJDK_TARGET_OS),linux)
+ifndef OPENJDK
+include $(JDK_TOPDIR)/make/closed/xawt.gmk
+endif
+
+ifeq ($(DISABLE_XRENDER),true)
+	LIBAWT_XAWT_CFLAGS += -DDISABLE_XRENDER_BY_DEFAULT=true
+endif
+endif
+
 ifeq ($(MILESTONE),internal)
 	LIBAWT_XAWT_CFLAGS += -DINTERNAL_BUILD
 endif
--- a/jdk/src/macosx/classes/com/apple/laf/AquaTabbedPaneCopyFromBasicUI.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/macosx/classes/com/apple/laf/AquaTabbedPaneCopyFromBasicUI.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1856,7 +1856,10 @@
         // If we're not valid that means we will shortly be validated and
         // painted, which means we don't have to do anything here.
         if (!isRunsDirty && index >= 0 && index < tabPane.getTabCount()) {
-            tabPane.repaint(getTabBounds(tabPane, index));
+            Rectangle rect = getTabBounds(tabPane, index);
+            if (rect != null) {
+                tabPane.repaint(rect);
+            }
         }
     }
 
--- a/jdk/src/macosx/classes/com/apple/laf/AquaTabbedPaneUI.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/macosx/classes/com/apple/laf/AquaTabbedPaneUI.java	Wed Jul 05 19:07:19 2017 +0200
@@ -702,6 +702,20 @@
     }
 
     /**
+     * Returns the bounds of the specified tab index.  The bounds are
+     * with respect to the JTabbedPane's coordinate space.  If the tab at this
+     * index is not currently visible in the UI, then returns null.
+     */
+    @Override
+    public Rectangle getTabBounds(final JTabbedPane pane, final int i) {
+        if (visibleTabState.needsScrollTabs()
+                && (visibleTabState.isBefore(i) || visibleTabState.isAfter(i))) {
+            return null;
+        }
+        return super.getTabBounds(pane, i);
+    }
+
+    /**
      * Returns the tab index which intersects the specified point
      * in the JTabbedPane's coordinate space.
      */
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java	Wed Jul 05 19:07:19 2017 +0200
@@ -830,18 +830,19 @@
     //                          UTILITY METHODS
     // ----------------------------------------------------------------------
 
-    /*
-     * Find image to install into Title or into Application icon.
-     * First try icons installed for toplevel. If there is no icon
-     * use default Duke image.
-     * This method shouldn't return null.
+    /**
+     * Find image to install into Title or into Application icon. First try
+     * icons installed for toplevel. Null is returned, if there is no icon and
+     * default Duke image should be used.
      */
     private CImage getImageForTarget() {
-        List<Image> icons = target.getIconImages();
-        if (icons == null || icons.size() == 0) {
-            return null;
+        CImage icon = null;
+        try {
+            icon = CImage.getCreator().createFromImages(target.getIconImages());
+        } catch (Exception ignored) {
+            // Perhaps the icon passed into Java is broken. Skipping this icon.
         }
-        return CImage.getCreator().createFromImages(icons);
+        return icon;
     }
 
     /*
--- a/jdk/src/macosx/native/java/util/SCDynamicStoreConfig.m	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/macosx/native/java/util/SCDynamicStoreConfig.m	Wed Jul 05 19:07:19 2017 +0200
@@ -103,7 +103,6 @@
         CFTypeRef realmInfo = SCDynamicStoreCopyValue(store, (CFStringRef) [NSString stringWithFormat:@"Kerberos:%@", realm]);
 
         if (CFGetTypeID(realmInfo) != CFDictionaryGetTypeID()) {
-            NSLog(@"Unexpected CFType for realm Info: %lu", CFGetTypeID(realmInfo));
             return nil;
         }
 
@@ -140,7 +139,6 @@
 
     SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java"), _SCDynamicStoreCallBack, NULL);
     if (store == NULL) {
-        NSLog(@"Unable to load SCDynamicStore to install NotificationCallback");
         return;
     }
 
@@ -171,19 +169,11 @@
 
     SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java-kerberos"), NULL, NULL);
     if (store == NULL) {
-        NSLog(@"Unable to load SCDynamicStore");
-        return NULL;
-    }
-
-    // Create the store if it is NULL and set it.
-    if (store == NULL) {
-        NSLog(@"Invalid value for SCDynamicStore");
         return NULL;
     }
 
     CFTypeRef realms = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALMS);
     if (realms == NULL || CFGetTypeID(realms) != CFArrayGetTypeID()) {
-        NSLog(@"Unable to load realm info from SCDynamicStore");
         if (realms) CFRelease(realms);
         CFRelease(store);
         return NULL;
@@ -192,7 +182,6 @@
     CFTypeRef realmMappings = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALM_MAPPINGS);
 
     if (realmMappings == NULL || CFGetTypeID(realmMappings) != CFArrayGetTypeID()) {
-        NSLog(@"Unable to load realm mapping info from SCDynamicStore");
         if (realmMappings) CFRelease(realmMappings);
         CFRelease(realms);
         CFRelease(store);
--- a/jdk/src/share/classes/com/sun/security/auth/PolicyFile.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/com/sun/security/auth/PolicyFile.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -47,6 +47,10 @@
 
 import sun.security.util.PropertyExpander;
 
+import sun.security.provider.PolicyParser.PrincipalEntry;
+import sun.security.provider.PolicyParser.GrantEntry;
+import sun.security.provider.PolicyParser.PermissionEntry;
+
 /**
  * This class represents a default implementation for
  * <code>javax.security.auth.Policy</code>.
@@ -469,7 +473,8 @@
      * @param policyFile the policy Reader object.
      */
     private void init(URL policy) {
-        PolicyParser pp = new PolicyParser(expandProperties);
+        sun.security.provider.PolicyParser pp =
+                new sun.security.provider.PolicyParser(expandProperties);
         try {
             InputStreamReader isr
                 = new InputStreamReader(getInputStream(policy));
@@ -477,12 +482,12 @@
             isr.close();
             KeyStore keyStore = initKeyStore(policy, pp.getKeyStoreUrl(),
                                              pp.getKeyStoreType());
-            Enumeration<PolicyParser.GrantEntry> enum_ = pp.grantElements();
+            Enumeration<GrantEntry> enum_ = pp.grantElements();
             while (enum_.hasMoreElements()) {
-                PolicyParser.GrantEntry ge = enum_.nextElement();
+                GrantEntry ge = enum_.nextElement();
                 addGrantEntry(ge, keyStore);
             }
-        } catch (PolicyParser.ParsingException pe) {
+        } catch (sun.security.provider.PolicyParser.ParsingException pe) {
             System.err.println(AUTH_POLICY +
                                 rb.getString(".error.parsing.") + policy);
             System.err.println(AUTH_POLICY +
@@ -521,8 +526,8 @@
      *
      * @return null if signedBy alias is not recognized
      */
-    CodeSource getCodeSource(PolicyParser.GrantEntry ge, KeyStore keyStore)
-        throws java.net.MalformedURLException
+    CodeSource getCodeSource(GrantEntry ge, KeyStore keyStore)
+            throws java.net.MalformedURLException
     {
         Certificate[] certs = null;
         if (ge.signedBy != null) {
@@ -559,20 +564,18 @@
     /**
      * Add one policy entry to the vector.
      */
-    private void addGrantEntry(PolicyParser.GrantEntry ge,
-                               KeyStore keyStore) {
+    private void addGrantEntry(GrantEntry ge, KeyStore keyStore) {
 
         if (debug != null) {
             debug.println("Adding policy entry: ");
             debug.println("  signedBy " + ge.signedBy);
             debug.println("  codeBase " + ge.codeBase);
             if (ge.principals != null && ge.principals.size() > 0) {
-                ListIterator<PolicyParser.PrincipalEntry> li =
-                                                ge.principals.listIterator();
+                ListIterator<PrincipalEntry> li = ge.principals.listIterator();
                 while (li.hasNext()) {
-                    PolicyParser.PrincipalEntry pppe = li.next();
-                    debug.println("  " + pppe.principalClass +
-                                        " " + pppe.principalName);
+                    PrincipalEntry pppe = li.next();
+                    debug.println("  " + pppe.getPrincipalClass() +
+                                        " " + pppe.getPrincipalName());
                 }
             }
             debug.println();
@@ -584,10 +587,9 @@
             if (codesource == null) return;
 
             PolicyEntry entry = new PolicyEntry(codesource);
-            Enumeration<PolicyParser.PermissionEntry> enum_ =
-                                                ge.permissionElements();
+            Enumeration<PermissionEntry> enum_ = ge.permissionElements();
             while (enum_.hasMoreElements()) {
-                PolicyParser.PermissionEntry pe = enum_.nextElement();
+                PermissionEntry pe = enum_.nextElement();
                 try {
                     // XXX special case PrivateCredentialPermission-SELF
                     Permission perm;
@@ -998,11 +1000,11 @@
                 return true;
             }
 
-            ListIterator<PolicyParser.PrincipalEntry> pli =
-                                        scs.getPrincipals().listIterator();
+            ListIterator<PrincipalEntry> pli =
+                    scs.getPrincipals().listIterator();
             while (pli.hasNext()) {
 
-                PolicyParser.PrincipalEntry principal = pli.next();
+                PrincipalEntry principal = pli.next();
 
                 // XXX
                 //      if the Policy entry's Principal does not contain a
@@ -1050,30 +1052,29 @@
      *                  if (y == 1), it's the principal name.
      */
     private String[][] getPrincipalInfo
-                (PolicyParser.PrincipalEntry principal,
-                final CodeSource accCs) {
+                (PrincipalEntry principal, final CodeSource accCs) {
 
         // there are 3 possibilities:
         // 1) the entry's Principal class and name are not wildcarded
         // 2) the entry's Principal name is wildcarded only
         // 3) the entry's Principal class and name are wildcarded
 
-        if (!principal.principalClass.equals
-                (PolicyParser.PrincipalEntry.WILDCARD_CLASS) &&
-            !principal.principalName.equals
-                (PolicyParser.PrincipalEntry.WILDCARD_NAME)) {
+        if (!principal.getPrincipalClass().equals
+                (PrincipalEntry.WILDCARD_CLASS) &&
+            !principal.getPrincipalName().equals
+                (PrincipalEntry.WILDCARD_NAME)) {
 
             // build a PrivateCredentialPermission for the principal
             // from the Policy entry
             String[][] info = new String[1][2];
-            info[0][0] = principal.principalClass;
-            info[0][1] = principal.principalName;
+            info[0][0] = principal.getPrincipalClass();
+            info[0][1] = principal.getPrincipalName();
             return info;
 
-        } else if (!principal.principalClass.equals
-                (PolicyParser.PrincipalEntry.WILDCARD_CLASS) &&
-            principal.principalName.equals
-                (PolicyParser.PrincipalEntry.WILDCARD_NAME)) {
+        } else if (!principal.getPrincipalClass().equals
+                (PrincipalEntry.WILDCARD_CLASS) &&
+            principal.getPrincipalName().equals
+                (PrincipalEntry.WILDCARD_NAME)) {
 
             // build a PrivateCredentialPermission for all
             // the Subject's principals that are instances of principalClass
@@ -1088,7 +1089,7 @@
                 // If it doesn't, we should stop here with a ClassCastException.
                 @SuppressWarnings("unchecked")
                 Class<? extends Principal> pClass = (Class<? extends Principal>)
-                        Class.forName(principal.principalClass, false,
+                        Class.forName(principal.getPrincipalClass(), false,
                                       ClassLoader.getSystemClassLoader());
                 principalSet = scs.getSubject().getPrincipals(pClass);
             } catch (Exception e) {
@@ -1387,6 +1388,7 @@
     }
 }
 
+@SuppressWarnings("deprecation")
 class PolicyPermissions extends PermissionCollection {
 
     private static final long serialVersionUID = -1954188373270545523L;
--- a/jdk/src/share/classes/com/sun/security/auth/SubjectCodeSource.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/com/sun/security/auth/SubjectCodeSource.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -33,6 +33,7 @@
 import java.lang.reflect.Constructor;
 
 import javax.security.auth.Subject;
+import sun.security.provider.PolicyParser.PrincipalEntry;
 
 /**
  * <p> This <code>SubjectCodeSource</code> class contains
@@ -57,7 +58,7 @@
         });
 
     private Subject subject;
-    private LinkedList<PolicyParser.PrincipalEntry> principals;
+    private LinkedList<PrincipalEntry> principals;
     private static final Class[] PARAMS = { String.class };
     private static final sun.security.util.Debug debug =
         sun.security.util.Debug.getInstance("auth", "\t[Auth Access]");
@@ -87,14 +88,14 @@
      *                  <code>SubjectCodeSource</code> <p>
      */
     SubjectCodeSource(Subject subject,
-        LinkedList<PolicyParser.PrincipalEntry> principals,
+        LinkedList<PrincipalEntry> principals,
         URL url, Certificate[] certs) {
 
         super(url, certs);
         this.subject = subject;
         this.principals = (principals == null ?
-                new LinkedList<PolicyParser.PrincipalEntry>() :
-                new LinkedList<PolicyParser.PrincipalEntry>(principals));
+                new LinkedList<PrincipalEntry>() :
+                new LinkedList<PrincipalEntry>(principals));
         sysClassLoader = java.security.AccessController.doPrivileged
         (new java.security.PrivilegedAction<ClassLoader>() {
             public ClassLoader run() {
@@ -114,7 +115,7 @@
      *          <code>SubjectCodeSource</code> as a <code>LinkedList</code>
      *          of <code>PolicyParser.PrincipalEntry</code> objects.
      */
-    LinkedList<PolicyParser.PrincipalEntry> getPrincipals() {
+    LinkedList<PrincipalEntry> getPrincipals() {
         return principals;
     }
 
@@ -167,7 +168,7 @@
      */
     public boolean implies(CodeSource codesource) {
 
-        LinkedList<PolicyParser.PrincipalEntry> subjectList = null;
+        LinkedList<PrincipalEntry> subjectList = null;
 
         if (codesource == null ||
             !(codesource instanceof SubjectCodeSource) ||
@@ -197,20 +198,19 @@
             return false;
         }
 
-        ListIterator<PolicyParser.PrincipalEntry> li =
-                this.principals.listIterator(0);
+        ListIterator<PrincipalEntry> li = this.principals.listIterator(0);
         while (li.hasNext()) {
-            PolicyParser.PrincipalEntry pppe = li.next();
+            PrincipalEntry pppe = li.next();
             try {
 
                 // handle PrincipalComparators
 
                 Class<?> principalComparator = Class.forName(
-                        pppe.principalClass, true, sysClassLoader);
+                        pppe.getPrincipalClass(), true, sysClassLoader);
                 Constructor<?> c = principalComparator.getConstructor(PARAMS);
                 PrincipalComparator pc =
                         (PrincipalComparator)c.newInstance
-                        (new Object[] { pppe.principalName });
+                        (new Object[] { pppe.getPrincipalName() });
 
                 if (!pc.implies(that.getSubject())) {
                     if (debug != null)
@@ -236,11 +236,10 @@
                     Iterator<Principal> i =
                                 that.getSubject().getPrincipals().iterator();
 
-                    subjectList = new LinkedList<PolicyParser.PrincipalEntry>();
+                    subjectList = new LinkedList<PrincipalEntry>();
                     while (i.hasNext()) {
                         Principal p = i.next();
-                        PolicyParser.PrincipalEntry spppe =
-                                new PolicyParser.PrincipalEntry
+                        PrincipalEntry spppe = new PrincipalEntry
                                 (p.getClass().getName(), p.getName());
                         subjectList.add(spppe);
                     }
@@ -281,23 +280,19 @@
      *          <i>pppe</i> argument.
      */
     private boolean subjectListImpliesPrincipalEntry(
-                LinkedList<PolicyParser.PrincipalEntry> subjectList,
-                PolicyParser.PrincipalEntry pppe) {
+                LinkedList<PrincipalEntry> subjectList, PrincipalEntry pppe) {
 
-        ListIterator<PolicyParser.PrincipalEntry> li =
-                                        subjectList.listIterator(0);
+        ListIterator<PrincipalEntry> li = subjectList.listIterator(0);
         while (li.hasNext()) {
-            PolicyParser.PrincipalEntry listPppe = li.next();
+            PrincipalEntry listPppe = li.next();
 
-            if (pppe.principalClass.equals
-                        (PolicyParser.PrincipalEntry.WILDCARD_CLASS) ||
-                pppe.principalClass.equals
-                        (listPppe.principalClass)) {
-
-                if (pppe.principalName.equals
-                        (PolicyParser.PrincipalEntry.WILDCARD_NAME) ||
-                    pppe.principalName.equals
-                        (listPppe.principalName))
+            if (pppe.getPrincipalClass().equals
+                        (PrincipalEntry.WILDCARD_CLASS) ||
+                pppe.getPrincipalClass().equals(listPppe.getPrincipalClass()))
+            {
+                if (pppe.getPrincipalName().equals
+                        (PrincipalEntry.WILDCARD_NAME) ||
+                    pppe.getPrincipalName().equals(listPppe.getPrincipalName()))
                     return true;
             }
         }
@@ -390,13 +385,12 @@
             }
         }
         if (principals != null) {
-            ListIterator<PolicyParser.PrincipalEntry> li =
-                                        principals.listIterator();
+            ListIterator<PrincipalEntry> li = principals.listIterator();
             while (li.hasNext()) {
-                PolicyParser.PrincipalEntry pppe = li.next();
+                PrincipalEntry pppe = li.next();
                 returnMe = returnMe + rb.getString("NEWLINE") +
-                        pppe.principalClass + " " +
-                        pppe.principalName;
+                        pppe.getPrincipalClass() + " " +
+                        pppe.getPrincipalName();
             }
         }
         return returnMe;
--- a/jdk/src/share/classes/com/sun/tools/hat/resources/hat.js	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/com/sun/tools/hat/resources/hat.js	Wed Jul 05 19:07:19 2017 +0200
@@ -151,7 +151,7 @@
         while (tmp != null) {
             res[res.length] = tmp;
             tmp = tmp.superclass;
-        } 
+        }
         return res;
     }
 
@@ -263,16 +263,19 @@
     
                     if (name == 'class') {
                         return wrapJavaValue(instance.clazz);
-                    } else if (name == 'toString') {
-                        return function() { 
-                            return instance.toString();
-                        }
                     } else if (name == 'wrapped-object') {
                         return instance;
                     } 
     
                     return undefined;
-            }
+            },
+            __call__: function(name) {
+                if (name == 'toString') {
+                    return instance.toString();
+                } else {
+                    return undefined;
+                }
+            } 
         }				
     }
 
@@ -297,7 +300,7 @@
                         return true;
                     }					
                 }
-                return theJavaClassProto[name] != undefined;
+                return false;
             },
             __get__ : function(name) {
                 for (var i in fields) {
@@ -305,7 +308,7 @@
                         return wrapJavaValue(fields[i].value);	
                     }					
                 }
-                return theJavaClassProto[name];
+                return undefined;
             }
         }
     		
@@ -322,7 +325,12 @@
         this.name = jclass.name; 
         this.fields = jclass.fields;
         this['wrapped-object'] = jclass;
-        this.__proto__ = this.statics;
+    }
+
+    for (var i in theJavaClassProto) {
+        if (typeof theJavaClassProto[i] == 'function') {
+           JavaClassWrapper.prototype[i] = theJavaClassProto[i];
+        }
     }
     
     // returns wrapper for Java object arrays
@@ -334,32 +342,35 @@
             __getIds__ : function() {
                 var res = new Array(elements.length);
                 for (var i = 0; i < elements.length; i++) {
-                    res[i] = i;
+                    res[i] = String(i);
                 }
                 return res;
             },
             __has__: function(name) {
-                return (typeof(name) == 'number' &&
-                        name >= 0 && name < elements.length)  ||
+                return (name >= 0 && name < elements.length)  ||
                         name == 'length' || name == 'class' ||
                         name == 'toString' || name == 'wrapped-object';
             },
             __get__ : function(name) {
-                if (typeof(name) == 'number' &&
-                    name >= 0 && name < elements.length) {
+                if (name >= 0 && name < elements.length) {
                     return wrapJavaValue(elements[name]);
                 } else if (name == 'length') {
                     return elements.length;
                 } else if (name == 'class') {
                     return wrapJavaValue(array.clazz);
-                } else if (name == 'toString') {
-                    return function() { return array.toString(); }          
                 } else if (name == 'wrapped-object') {
                     return array;
                 } else {
                     return undefined;
                 }				
-            }
+            },
+            __call__: function(name) {
+                if (name == 'toString') {
+                    return array.toString();
+                } else {
+                    return undefined;
+                }
+            } 
         }			
     }
     
@@ -373,26 +384,22 @@
             __getIds__ : function() {
                 var r = new Array(array.length);
                 for (var i = 0; i < array.length; i++) {
-                    r[i] = i;
+                    r[i] = String(i);
                 }
                 return r;
             },
             __has__: function(name) {
-                return (typeof(name) == 'number' &&
-                        name >= 0 && name < array.length) ||
+                return (name >= 0 && name < array.length) ||
                         name == 'length' || name == 'class' ||
                         name == 'toString' || name == 'wrapped-object';
             },
             __get__: function(name) {
-                if (typeof(name) == 'number' &&
-                    name >= 0 && name < array.length) {
+                if (name >= 0 && name < array.length) {
                     return elements[name];
                 }
     
                 if (name == 'length') {
                     return array.length;
-                } else if (name == 'toString') {
-                    return function() { return array.valueString(true); } 
                 } else if (name == 'wrapped-object') {
                     return array;
                 } else if (name == 'class') {
@@ -400,7 +407,14 @@
                 } else {
                     return undefined;
                 }
-            }
+            },
+            __call__: function(name) {
+                if (name == 'toString') {
+                    return array.valueString(true);
+                } else {
+                    return undefined;
+                }
+            } 
         }
     }
     return javaObject(thing);
@@ -673,34 +687,33 @@
                     __getIds__ : function() {
                         var res = new Array(path.length);
                         for (var i = 0; i < path.length; i++) {
-                            res[i] = i;
+                            res[i] = String(i);
                         }
                         return res;
                     },
                     __has__ : function (name) {
-                        return (typeof(name) == 'number' &&
-                            name >= 0 && name < path.length) ||
+                        return (name >= 0 && name < path.length) ||
                             name == 'length' || name == 'toHtml' ||
                             name == 'toString';
                     },
                     __get__ : function(name) {
-                        if (typeof(name) == 'number' &&
-                            name >= 0 && name < path.length) {
+                        if (name >= 0 && name < path.length) {
                             return path[name];
                         } else if (name == 'length') {
                             return path.length;
-                        } else if (name == 'toHtml') {
-                            return function() { 
-                               return computeDescription(true);
-                            }
-                        } else if (name == 'toString') {
-                            return function() {
-                               return computeDescription(false);
-                            }
                         } else {
                             return undefined;
                         }
                     },
+                    __call__: function(name) {
+                        if (name == 'toHtml') {
+                            return computeDescription(true);
+                        } else if (name == 'toString') {
+                            return computeDescription(false);
+                        } else {
+                            return undefined;
+                        }
+                    }
                 };
             }
 
@@ -1005,22 +1018,8 @@
             return "<a href='/object/" + id + "'>" +
                    name + "@" + id + "</a>";
         }
-    } else if ((typeof(obj) == 'object') || (obj instanceof JSAdapter)) {
-        if (obj instanceof java.lang.Object) {
-            // script wrapped Java object
-            obj = wrapIterator(obj);
-            // special case for enumeration
-            if (obj instanceof java.util.Enumeration) {
-                var res = "[ ";
-                while (obj.hasMoreElements()) {
-                    res += toHtml(obj.nextElement()) + ", ";
-                }
-                res += "]";
-                return res; 
-            } else {
-                return obj;
-            }
-        } else if (obj instanceof Array) {
+    } else if (obj instanceof Object) {
+        if (Array.isArray(obj)) {
             // script array
             var res = "[ ";
             for (var i in obj) {
@@ -1047,8 +1046,19 @@
             }
         }
     } else {
-        // JavaScript primitive value
-        return obj;
+        // a Java object
+        obj = wrapIterator(obj);
+        // special case for enumeration
+        if (obj instanceof java.util.Enumeration) {
+            var res = "[ ";
+            while (obj.hasMoreElements()) {
+                res += toHtml(obj.nextElement()) + ", ";
+            }
+            res += "]";
+            return res; 
+        } else {
+            return obj;
+        }
     }
 }
 
--- a/jdk/src/share/classes/com/sun/tools/hat/resources/oqlhelp.html	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/com/sun/tools/hat/resources/oqlhelp.html	Wed Jul 05 19:07:19 2017 +0200
@@ -79,7 +79,7 @@
 <li>select all Strings of length 100 or more
 <pre>
 <code>
-    select s from java.lang.String s where s.count >= 100
+    select s from java.lang.String s where s.value.length >= 100
 </code>
 </pre>
 <li>select all int arrays of length 256 or more
@@ -92,7 +92,7 @@
 <pre>
 <code>
     select s.value.toString() from java.lang.String s 
-    where /java/(s.value.toString())
+    where /java/.test(s.value.toString())
 </code>
 </pre>
 <li>show path value of all File objects
@@ -219,7 +219,6 @@
 <pre>
 <code>
     select heap.findClass("java.lang.System").statics.props
-    select heap.findClass("java.lang.System").props
 </code>
 </pre>
 <li>get number of fields of java.lang.String class 
@@ -237,7 +236,7 @@
 <li>select all classes that have name pattern java.net.*
 <pre>
 <code>
-    select <a href="#filter">filter</a>(heap.classes(), "/java.net./(it.name)")
+    select <a href="#filter">filter</a>(heap.classes(), "/java.net./.test(it.name)")
 </code>
 </pre>
 </ul>
@@ -536,7 +535,7 @@
 Example: print number of classes that have specific name pattern
 <pre>
 <code>
-    select count(<a href="#classes">heap.classes()</a>, "/java.io./(it.name)")
+    select count(<a href="#classes">heap.classes()</a>, "/java.io./.test(it.name)")
 </code>
 </pre>
 
@@ -559,14 +558,14 @@
 <li>show all classes that have java.io.* name pattern
 <pre>
 <code>
-    select filter(<a href="#classes">heap.classes</a>(), "/java.io./(it.name)")
+    select filter(<a href="#classes">heap.classes</a>(), "/java.io./.test(it.name)")
 </code>
 </pre>
 <li> show all referrers of URL object where the referrer is not from
 java.net package
 <pre>
 <code>
-    select filter(<a href="#referrers">referrers</a>(u), "! /java.net./(<a href="#classof">classof</a>(it).name)")
+    select filter(<a href="#referrers">referrers</a>(u), "! /java.net./.test(<a href="#classof">classof</a>(it).name)")
     from java.net.URL u
 </code>
 </pre>
@@ -619,13 +618,13 @@
 <li>find the maximum length of any String instance
 <pre>
 <code>
-    select max(map(heap.objects('java.lang.String', false), 'it.count'))
+    select max(map(heap.objects('java.lang.String', false), 'it.value.length'))
 </code>
 </pre>
 <li>find string instance that has the maximum length
 <pre>
 <code>
-    select max(heap.objects('java.lang.String'), 'lhs.count > rhs.count')
+    select max(heap.objects('java.lang.String'), 'lhs.value.length > rhs.value.length')
 </code>
 </pre>
 </ul>
@@ -775,7 +774,7 @@
 
 <pre>
 <code>
-   select <a href="#map">map</a>(<a href="#filter">filter(<a href="#findClass">heap.findClass</a>('java.lang.System').props.table, 'it != null'), 
+   select <a href="#map">map</a>(<a href="#filter">filter(<a href="#findClass">heap.findClass</a>('java.lang.System').statics.props.table, 'it != null'), 
             function (it) {
                 var res = "";
                 while (it != null) {
--- a/jdk/src/share/classes/java/applet/AppletContext.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/applet/AppletContext.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 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
@@ -56,7 +56,7 @@
 
     /**
      * Returns an <code>Image</code> object that can then be painted on
-     * the screen. The <code>url</code> argument<code> </code>that is
+     * the screen. The <code>url</code> argument that is
      * passed as an argument must specify an absolute URL.
      * <p>
      * This method always returns immediately, whether or not the image
@@ -157,7 +157,7 @@
      * @param stream stream to be associated with the specified key. If this
      *               parameter is <code>null</code>, the specified key is removed
      *               in this applet context.
-     * @throws <code>IOException</code> if the stream size exceeds a certain
+     * @throws IOException if the stream size exceeds a certain
      *         size limit. Size limit is decided by the implementor of this
      *         interface.
      * @since 1.4
--- a/jdk/src/share/classes/java/awt/event/ContainerListener.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/event/ContainerListener.java	Wed Jul 05 19:07:19 2017 +0200
@@ -42,7 +42,7 @@
  * Container events are provided for notification purposes ONLY;
  * The AWT will automatically handle add and remove operations
  * internally so the program works properly regardless of
- * whether the program registers a <code>ComponentListener</code> or not.
+ * whether the program registers a {@code ContainerListener} or not.
  *
  * @see ContainerAdapter
  * @see ContainerEvent
--- a/jdk/src/share/classes/java/awt/image/BufferStrategy.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/BufferStrategy.java	Wed Jul 05 19:07:19 2017 +0200
@@ -55,7 +55,7 @@
  * Alternatively, the contents of the back buffer can be copied, or
  * <i>blitted</i> forward in a chain instead of moving the video pointer.
  * <p>
- * <pre>
+ * <pre>{@code
  * Double buffering:
  *
  *                    ***********         ***********
@@ -72,7 +72,7 @@
  *          *         * <------ *         * <----- *         *
  *          ***********         ***********        ***********
  *
- * </pre>
+ * }</pre>
  * <p>
  * Here is an example of how buffer strategies can be created and used:
  * <pre><code>
--- a/jdk/src/share/classes/java/awt/image/BufferedImage.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/BufferedImage.java	Wed Jul 05 19:07:19 2017 +0200
@@ -602,12 +602,12 @@
      *                  the raster has been premultiplied with alpha.
      * @param properties <code>Hashtable</code> of
      *                  <code>String</code>/<code>Object</code> pairs.
-     * @exception <code>RasterFormatException</code> if the number and
+     * @exception RasterFormatException if the number and
      * types of bands in the <code>SampleModel</code> of the
      * <code>Raster</code> do not match the number and types required by
      * the <code>ColorModel</code> to represent its color and alpha
      * components.
-     * @exception <code>IllegalArgumentException</code> if
+     * @exception IllegalArgumentException if
      *          <code>raster</code> is incompatible with <code>cm</code>
      * @see ColorModel
      * @see Raster
@@ -927,7 +927,7 @@
      * each color component in the returned data when
      * using this method.  With a specified coordinate (x,&nbsp;y) in the
      * image, the ARGB pixel can be accessed in this way:
-     * </p>
+     * <p>
      *
      * <pre>
      *    pixel   = rgbArray[offset + (y-startY)*scansize + (x-startX)]; </pre>
@@ -1131,7 +1131,7 @@
      * @return an {@link Object} that is the property referred to by the
      *          specified <code>name</code> or <code>null</code> if the
      *          properties of this image are not yet known.
-     * @throws <code>NullPointerException</code> if the property name is null.
+     * @throws NullPointerException if the property name is null.
      * @see ImageObserver
      * @see java.awt.Image#UndefinedProperty
      */
@@ -1144,7 +1144,7 @@
      * @param name the property name
      * @return an <code>Object</code> that is the property referred to by
      *          the specified <code>name</code>.
-     * @throws <code>NullPointerException</code> if the property name is null.
+     * @throws NullPointerException if the property name is null.
      */
     public Object getProperty(String name) {
         if (name == null) {
@@ -1196,7 +1196,7 @@
      * @param h the height of the specified rectangular region
      * @return a <code>BufferedImage</code> that is the subimage of this
      *          <code>BufferedImage</code>.
-     * @exception <code>RasterFormatException</code> if the specified
+     * @exception RasterFormatException if the specified
      * area is not contained within this <code>BufferedImage</code>.
      */
     public BufferedImage getSubimage (int x, int y, int w, int h) {
@@ -1388,7 +1388,7 @@
      * @param tileY the y index of the requested tile in the tile array
      * @return a <code>Raster</code> that is the tile defined by the
      *          arguments <code>tileX</code> and <code>tileY</code>.
-     * @exception <code>ArrayIndexOutOfBoundsException</code> if both
+     * @exception ArrayIndexOutOfBoundsException if both
      *          <code>tileX</code> and <code>tileY</code> are not
      *          equal to 0
      */
@@ -1558,7 +1558,7 @@
      * @return <code>true</code> if the tile specified by the specified
      *          indices is checked out for writing; <code>false</code>
      *          otherwise.
-     * @exception <code>ArrayIndexOutOfBoundsException</code> if both
+     * @exception ArrayIndexOutOfBoundsException if both
      *          <code>tileX</code> and <code>tileY</code> are not equal
      *          to 0
      */
--- a/jdk/src/share/classes/java/awt/image/ByteLookupTable.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/ByteLookupTable.java	Wed Jul 05 19:07:19 2017 +0200
@@ -171,7 +171,7 @@
      * @exception ArrayIndexOutOfBoundsException if <code>src</code> is
      *            longer than <code>dst</code> or if for any element
      *            <code>i</code> of <code>src</code>,
-     *            <code>(src[i]&0xff)-offset</code> is either less than
+     *            {@code (src[i]&0xff)-offset} is either less than
      *            zero or greater than or equal to the length of the
      *            lookup table for any band.
      */
--- a/jdk/src/share/classes/java/awt/image/ColorModel.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/ColorModel.java	Wed Jul 05 19:07:19 2017 +0200
@@ -692,12 +692,12 @@
      * <code>DataBuffer.TYPE_INT</code>.
      * @param inData an array of pixel values
      * @return the value of the green component of the specified pixel.
-     * @throws <code>ClassCastException</code> if <code>inData</code>
+     * @throws ClassCastException if <code>inData</code>
      *  is not a primitive array of type <code>transferType</code>
-     * @throws <code>ArrayIndexOutOfBoundsException</code> if
+     * @throws ArrayIndexOutOfBoundsException if
      *  <code>inData</code> is not large enough to hold a pixel value
      *  for this <code>ColorModel</code>
-     * @throws <code>UnsupportedOperationException</code> if this
+     * @throws UnsupportedOperationException if this
      *  <code>tranferType</code> is not supported by this
      *  <code>ColorModel</code>
      */
--- a/jdk/src/share/classes/java/awt/image/DirectColorModel.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/DirectColorModel.java	Wed Jul 05 19:07:19 2017 +0200
@@ -642,12 +642,12 @@
      * @param inData the specified pixel
      * @return the alpha component of the specified pixel, scaled from
      *         0 to 255.
-     * @exception <code>ClassCastException</code> if <code>inData</code>
+     * @exception ClassCastException if <code>inData</code>
      *  is not a primitive array of type <code>transferType</code>
-     * @exception <code>ArrayIndexOutOfBoundsException</code> if
+     * @exception ArrayIndexOutOfBoundsException if
      *  <code>inData</code> is not large enough to hold a pixel value
      *  for this <code>ColorModel</code>
-     * @exception <code>UnsupportedOperationException</code> if this
+     * @exception UnsupportedOperationException if this
      *  <code>tranferType</code> is not supported by this
      *  <code>ColorModel</code>
      */
@@ -1055,7 +1055,7 @@
      * begin retrieving the color and alpha components
      * @return an <code>int</code> pixel value in this
      * <code>ColorModel</code> corresponding to the specified components.
-     * @exception <code>ArrayIndexOutOfBoundsException</code> if
+     * @exception ArrayIndexOutOfBoundsException if
      *  the <code>components</code> array is not large enough to
      *  hold all of the color and alpha components starting at
      *  <code>offset</code>
@@ -1097,9 +1097,9 @@
      * and alpha components
      * @return an <code>Object</code> representing an array of color and
      * alpha components.
-     * @exception <code>ClassCastException</code> if <code>obj</code>
+     * @exception ClassCastException if <code>obj</code>
      *  is not a primitive array of type <code>transferType</code>
-     * @exception <code>ArrayIndexOutOfBoundsException</code> if
+     * @exception ArrayIndexOutOfBoundsException if
      *  <code>obj</code> is not large enough to hold a pixel value
      *  for this <code>ColorModel</code> or the <code>components</code>
      *  array is not large enough to hold all of the color and alpha
--- a/jdk/src/share/classes/java/awt/image/ImageProducer.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/ImageProducer.java	Wed Jul 05 19:07:19 2017 +0200
@@ -100,11 +100,11 @@
      * <code>ImageProducer</code> should respond by executing
      * the following minimum set of <code>ImageConsumer</code>
      * method calls:
-     * <pre>
+     * <pre>{@code
      *  ic.setHints(TOPDOWNLEFTRIGHT | < otherhints >);
      *  ic.setPixels(...);      // As many times as needed
      *  ic.imageComplete();
-     * </pre>
+     * }</pre>
      * @param ic the specified <code>ImageConsumer</code>
      * @see ImageConsumer#setHints
      */
--- a/jdk/src/share/classes/java/awt/image/IndexColorModel.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/IndexColorModel.java	Wed Jul 05 19:07:19 2017 +0200
@@ -98,6 +98,7 @@
  * Index values greater than or equal to the map size, but less than
  * 2<sup><em>n</em></sup>, are undefined and return 0 for all color and
  * alpha components.
+ * </a>
  * <p>
  * For those methods that use a primitive array pixel representation of
  * type <code>transferType</code>, the array length is always one.
--- a/jdk/src/share/classes/java/awt/image/MemoryImageSource.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/MemoryImageSource.java	Wed Jul 05 19:07:19 2017 +0200
@@ -37,7 +37,7 @@
  * uses an array to produce pixel values for an Image.  Here is an example
  * which calculates a 100x100 image representing a fade from black to blue
  * along the X axis and a fade from black to red along the Y axis:
- * <pre>
+ * <pre>{@code
  *
  *      int w = 100;
  *      int h = 100;
@@ -52,12 +52,12 @@
  *      }
  *      Image img = createImage(new MemoryImageSource(w, h, pix, 0, w));
  *
- * </pre>
+ * }</pre>
  * The MemoryImageSource is also capable of managing a memory image which
  * varies over time to allow animation or custom rendering.  Here is an
  * example showing how to set up the animation source and signal changes
  * in the data (adapted from the MemoryAnimationSourceDemo by Garth Dickie):
- * <pre>
+ * <pre>{@code
  *
  *      int pixels[];
  *      MemoryImageSource source;
@@ -96,7 +96,7 @@
  *          }
  *      }
  *
- * </pre>
+ * }</pre>
  *
  * @see ImageProducer
  *
--- a/jdk/src/share/classes/java/awt/image/MultiPixelPackedSampleModel.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/MultiPixelPackedSampleModel.java	Wed Jul 05 19:07:19 2017 +0200
@@ -52,14 +52,14 @@
  * <code>x,&nbsp;y</code> from <code>DataBuffer</code> <code>data</code>
  * and storing the pixel data in data elements of type
  * <code>dataType</code>:
- * <pre>
+ * <pre>{@code
  *      int dataElementSize = DataBuffer.getDataTypeSize(dataType);
  *      int bitnum = dataBitOffset + x*pixelBitStride;
  *      int element = data.getElem(y*scanlineStride + bitnum/dataElementSize);
  *      int shift = dataElementSize - (bitnum & (dataElementSize-1))
  *                  - pixelBitStride;
  *      int pixel = (element >> shift) & ((1 << pixelBitStride) - 1);
- * </pre>
+ * }</pre>
  */
 
 public class MultiPixelPackedSampleModel extends SampleModel
--- a/jdk/src/share/classes/java/awt/image/PixelGrabber.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/PixelGrabber.java	Wed Jul 05 19:07:19 2017 +0200
@@ -35,7 +35,7 @@
  * The PixelGrabber class implements an ImageConsumer which can be attached
  * to an Image or ImageProducer object to retrieve a subset of the pixels
  * in that image.  Here is an example:
- * <pre>
+ * <pre>{@code
  *
  * public void handlesinglepixel(int x, int y, int pixel) {
  *      int alpha = (pixel >> 24) & 0xff;
@@ -65,7 +65,7 @@
  *      }
  * }
  *
- * </pre>
+ * }</pre>
  *
  * @see ColorModel#getRGBdefault
  *
@@ -165,8 +165,8 @@
      * accumulated in the default RGB ColorModel.  If the forceRGB
      * parameter is true, then the pixels will be accumulated in the
      * default RGB ColorModel anyway.  A buffer is allocated by the
-     * PixelGrabber to hold the pixels in either case.  If (w < 0) or
-     * (h < 0), then they will default to the remaining width and
+     * PixelGrabber to hold the pixels in either case.  If {@code (w < 0)} or
+     * {@code (h < 0)}, then they will default to the remaining width and
      * height of the source data when that information is delivered.
      * @param img the image to retrieve the image data from
      * @param x the x coordinate of the upper left corner of the rectangle
@@ -233,10 +233,10 @@
      * behaves in the following ways, depending on the value of
      * <code>ms</code>:
      * <ul>
-     * <li> If <code>ms</code> == 0, waits until all pixels are delivered
-     * <li> If <code>ms</code> > 0, waits until all pixels are delivered
+     * <li> If {@code ms == 0}, waits until all pixels are delivered
+     * <li> If {@code ms > 0}, waits until all pixels are delivered
      * as timeout expires.
-     * <li> If <code>ms</code> < 0, returns <code>true</code> if all pixels
+     * <li> If {@code ms < 0}, returns <code>true</code> if all pixels
      * are grabbed, <code>false</code> otherwise and does not wait.
      * </ul>
      * @param ms the number of milliseconds to wait for the image pixels
--- a/jdk/src/share/classes/java/awt/image/RGBImageFilter.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/RGBImageFilter.java	Wed Jul 05 19:07:19 2017 +0200
@@ -39,7 +39,7 @@
  * The only method which needs to be defined to create a useable image
  * filter is the filterRGB method.  Here is an example of a definition
  * of a filter which swaps the red and blue components of an image:
- * <pre>
+ * <pre>{@code
  *
  *      class RedBlueSwapFilter extends RGBImageFilter {
  *          public RedBlueSwapFilter() {
@@ -56,7 +56,7 @@
  *          }
  *      }
  *
- * </pre>
+ * }</pre>
  *
  * @see FilteredImageSource
  * @see ImageFilter
--- a/jdk/src/share/classes/java/awt/image/ShortLookupTable.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/ShortLookupTable.java	Wed Jul 05 19:07:19 2017 +0200
@@ -114,7 +114,7 @@
      * @exception ArrayIndexOutOfBoundsException if <code>src</code> is
      *            longer than <code>dst</code> or if for any element
      *            <code>i</code> of <code>src</code>,
-     *            <code>(src[i]&0xffff)-offset</code> is either less than
+     *            {@code (src[i]&0xffff)-offset} is either less than
      *            zero or greater than or equal to the length of the
      *            lookup table for any band.
      */
@@ -165,7 +165,7 @@
      * @exception ArrayIndexOutOfBoundsException if <code>src</code> is
      *            longer than <code>dst</code> or if for any element
      *            <code>i</code> of <code>src</code>,
-     *            <code>(src[i]&0xffff)-offset</code> is either less than
+     *            {@code (src[i]&0xffff)-offset} is either less than
      *            zero or greater than or equal to the length of the
      *            lookup table for any band.
      */
--- a/jdk/src/share/classes/java/awt/image/SinglePixelPackedSampleModel.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/SinglePixelPackedSampleModel.java	Wed Jul 05 19:07:19 2017 +0200
@@ -57,10 +57,10 @@
  * The following code illustrates extracting the bits of the sample
  * representing band <code>b</code> for pixel <code>x,y</code>
  * from DataBuffer <code>data</code>:
- * <pre>
+ * <pre>{@code
  *      int sample = data.getElem(y * scanlineStride + x);
  *      sample = (sample & bitMasks[b]) >>> bitOffsets[b];
- * </pre>
+ * }</pre>
  */
 
 public class SinglePixelPackedSampleModel extends SampleModel
--- a/jdk/src/share/classes/java/awt/image/WritableRaster.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/awt/image/WritableRaster.java	Wed Jul 05 19:07:19 2017 +0200
@@ -372,13 +372,13 @@
      * integral type and less than or equal to 32 bits in size, then calling
      * this method is equivalent to executing the following code for all
      * <code>x,y</code> addresses valid in both Rasters.
-     * <pre>
+     * <pre>{@code
      *       Raster srcRaster;
      *       WritableRaster dstRaster;
      *       for (int b = 0; b < srcRaster.getNumBands(); b++) {
      *           dstRaster.setSample(x, y, b, srcRaster.getSample(x, y, b));
      *       }
-     * </pre>
+     * }</pre>
      * Thus, when copying an integral type source to an integral type
      * destination, if the source sample size is greater than the destination
      * sample size for a particular band, the high order bits of the source
--- a/jdk/src/share/classes/java/beans/AppletInitializer.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/AppletInitializer.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2000, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -68,7 +68,6 @@
      * the Applet with its Container during the subsequent invocation of its
      * addChildren() method.
      * </ol>
-     * </p>
      *
      * @param newAppletBean  The newly instantiated JavaBean
      * @param bCtxt          The BeanContext intended for this Applet, or
--- a/jdk/src/share/classes/java/beans/Beans.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/Beans.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -62,7 +62,7 @@
      * <p>
      * Instantiate a JavaBean.
      * </p>
-     *
+     * @return a JavaBean
      * @param     cls         the class-loader from which we should create
      *                        the bean.  If this is null, then the system
      *                        class-loader is used.
@@ -82,6 +82,7 @@
      * <p>
      * Instantiate a JavaBean.
      * </p>
+     * @return a JavaBean
      *
      * @param     cls         the class-loader from which we should create
      *                        the bean.  If this is null, then the system
@@ -137,6 +138,7 @@
      * the JDK appletviewer (for a reference browser environment) and the
      * BDK BeanBox (for a reference bean container).
      *
+     * @return a JavaBean
      * @param     cls         the class-loader from which we should create
      *                        the bean.  If this is null, then the system
      *                        class-loader is used.
@@ -361,6 +363,8 @@
      * This method is provided in Beans 1.0 as a hook to allow the
      * addition of more flexible bean behaviour in the future.
      *
+     * @return an object representing a specified type view of the
+     * source object
      * @param bean        Object from which we want to obtain a view.
      * @param targetType  The type of view we'd like to get.
      *
@@ -384,7 +388,6 @@
         return Introspector.isSubclass(bean.getClass(), targetType);
     }
 
-
     /**
      * Test if we are in design-mode.
      *
--- a/jdk/src/share/classes/java/beans/ConstructorProperties.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/ConstructorProperties.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -61,7 +61,7 @@
    the {@code getY()} method.  Since parameter names are not in
    general available at runtime, without the annotation there would be
    no way to know whether the parameters correspond to {@code getX()}
-   and {@code getY()} or the other way around.</p>
+   and {@code getY()} or the other way around.
 
    @since 1.6
 */
--- a/jdk/src/share/classes/java/beans/DefaultPersistenceDelegate.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/DefaultPersistenceDelegate.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -382,6 +382,7 @@
      * a class such that no property value depends on the value of
      * a subsequent property.
      *
+     * @param type the type of the instances
      * @param oldInstance The instance to be copied.
      * @param newInstance The instance that is to be modified.
      * @param out The stream to which any initialization statements should be written.
--- a/jdk/src/share/classes/java/beans/EventHandler.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/EventHandler.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -515,6 +515,7 @@
      *</pre>
      *</blockquote>
      *
+     * @param <T> the type to create
      * @param listenerInterface the listener interface to create a proxy for
      * @param target the object that will perform the action
      * @param action the name of a (possibly qualified) property or method on
@@ -570,6 +571,7 @@
      *</pre>
      *</blockquote>
      *
+     * @param <T> the type to create
      * @param listenerInterface the listener interface to create a proxy for
      * @param target the object that will perform the action
      * @param action the name of a (possibly qualified) property or method on
@@ -659,6 +661,7 @@
      * </pre>
      *</blockquote>
      *
+     * @param <T> the type to create
      * @param listenerInterface the listener interface to create a proxy for
      * @param target the object that will perform the action
      * @param action the name of a (possibly qualified) property or method on
--- a/jdk/src/share/classes/java/beans/Expression.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/Expression.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -139,7 +139,7 @@
      * replaces this default value in the same way that any other value
      * would, ensuring that expressions are never evaluated more than once.
      * <p>
-     * See the <code>excecute</code> method for details on how
+     * See the <code>execute</code> method for details on how
      * methods are chosen using the dynamic types of the target
      * and arguments.
      *
@@ -147,6 +147,8 @@
      * @see #setValue
      *
      * @return The result of applying this method to these arguments.
+     * @throws Exception if the method with the specified methodName
+     * throws an exception
      */
     public Object getValue() throws Exception {
         if (value == unbound) {
--- a/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java	Wed Jul 05 19:07:19 2017 +0200
@@ -207,6 +207,8 @@
      * Sets the method that should be used to read an indexed property value.
      *
      * @param readMethod The new indexed read method.
+     * @throws IntrospectionException if an exception occurs during
+     * introspection.
      */
     public synchronized void setIndexedReadMethod(Method readMethod)
         throws IntrospectionException {
@@ -285,6 +287,8 @@
      * Sets the method that should be used to write an indexed property value.
      *
      * @param writeMethod The new indexed write method.
+     * @throws IntrospectionException if an exception occurs during
+     * introspection.
      */
     public synchronized void setIndexedWriteMethod(Method writeMethod)
         throws IntrospectionException {
--- a/jdk/src/share/classes/java/beans/Introspector.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/Introspector.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -93,8 +93,17 @@
 public class Introspector {
 
     // Flags that can be used to control getBeanInfo:
+    /**
+     * Flag to indicate to use of all beaninfo.
+     */
     public final static int USE_ALL_BEANINFO           = 1;
+    /**
+     * Flag to indicate to ignore immediate beaninfo.
+     */
     public final static int IGNORE_IMMEDIATE_BEANINFO  = 2;
+    /**
+     * Flag to indicate to ignore all beaninfo.
+     */
     public final static int IGNORE_ALL_BEANINFO        = 3;
 
     // Static Caches to speed up introspection.
@@ -202,7 +211,7 @@
      * If the BeanInfo class for a Java Bean has been previously Introspected
      * based on the same arguments, then the BeanInfo class is retrieved
      * from the BeanInfo cache.
-     *
+     * @return the BeanInfo for the bean
      * @param beanClass The bean class to be analyzed.
      * @param stopClass The baseclass at which to stop the analysis.  Any
      *    methods/properties/events in the stopClass or in its baseclasses
--- a/jdk/src/share/classes/java/beans/PersistenceDelegate.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/PersistenceDelegate.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -197,6 +197,7 @@
      * The default implementation, calls the <code>initialize</code>
      * method of the type's superclass.
      *
+     * @param type the type of the instances
      * @param oldInstance The instance to be copied.
      * @param newInstance The instance that is to be modified.
      * @param out The stream to which any initialization statements should be written.
--- a/jdk/src/share/classes/java/beans/PropertyChangeSupport.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/PropertyChangeSupport.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -156,7 +156,7 @@
      * <code>PropertyChangeListenerProxy</code>, perform the cast, and examine
      * the parameter.
      *
-     * <pre>
+     * <pre>{@code
      * PropertyChangeListener[] listeners = bean.getPropertyChangeListeners();
      * for (int i = 0; i < listeners.length; i++) {
      *   if (listeners[i] instanceof PropertyChangeListenerProxy) {
@@ -168,7 +168,7 @@
      *     }
      *   }
      * }
-     *</pre>
+     * }</pre>
      *
      * @see PropertyChangeListenerProxy
      * @return all of the <code>PropertyChangeListeners</code> added or an
--- a/jdk/src/share/classes/java/beans/PropertyDescriptor.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/PropertyDescriptor.java	Wed Jul 05 19:07:19 2017 +0200
@@ -243,6 +243,7 @@
      * Sets the method that should be used to read the property value.
      *
      * @param readMethod The new read method.
+     * @throws IntrospectionException if the read method is invalid
      */
     public synchronized void setReadMethod(Method readMethod)
                                 throws IntrospectionException {
@@ -313,6 +314,7 @@
      * Sets the method that should be used to write the property value.
      *
      * @param writeMethod The new write method.
+     * @throws IntrospectionException if the write method is invalid
      */
     public synchronized void setWriteMethod(Method writeMethod)
                                 throws IntrospectionException {
--- a/jdk/src/share/classes/java/beans/Transient.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/Transient.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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
@@ -40,7 +40,7 @@
  * A {@code true} value for the "transient" attribute
  * indicates to encoders derived from {@link Encoder}
  * that this feature should be ignored.
- * <p/>
+ * <p>
  * The {@code Transient} annotation may be be used
  * in any of the methods that are involved
  * in a {@link FeatureDescriptor} subclass
@@ -49,7 +49,7 @@
  * to put the annotation and it is this declaration
  * that takes precedence in the case of multiple annotations
  * being defined for the same feature.
- * <p/>
+ * <p>
  * To declare a feature non-transient in a class
  * whose superclass declares it transient,
  * use {@code @Transient(false)}.
@@ -64,5 +64,11 @@
 @Target({METHOD})
 @Retention(RUNTIME)
 public @interface Transient {
+    /**
+     * Returns whether or not the {@code Introspector} should
+     * construct artifacts for the annotated method.
+     * @return whether or not the {@code Introspector} should
+     * construct artifacts for the annotated method
+     */
     boolean value() default true;
 }
--- a/jdk/src/share/classes/java/beans/VetoableChangeSupport.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/VetoableChangeSupport.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -42,7 +42,7 @@
  * <p>
  * Here is an example of {@code VetoableChangeSupport} usage that follows
  * the rules and recommendations laid out in the JavaBeans&trade; specification:
- * <pre>
+ * <pre>{@code
  * public class MyBean {
  *     private final VetoableChangeSupport vcs = new VetoableChangeSupport(this);
  *
@@ -68,7 +68,7 @@
  *
  *     [...]
  * }
- * </pre>
+ * }</pre>
  * <p>
  * A {@code VetoableChangeSupport} instance is thread-safe.
  * <p>
@@ -156,7 +156,7 @@
      * <code>VetoableChangeListenerProxy</code>, perform the cast, and examine
      * the parameter.
      *
-     * <pre>
+     * <pre>{@code
      * VetoableChangeListener[] listeners = bean.getVetoableChangeListeners();
      * for (int i = 0; i < listeners.length; i++) {
      *        if (listeners[i] instanceof VetoableChangeListenerProxy) {
@@ -168,7 +168,7 @@
      *     }
      *   }
      * }
-     *</pre>
+     * }</pre>
      *
      * @see VetoableChangeListenerProxy
      * @return all of the <code>VetoableChangeListeners</code> added or an
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContext.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/beancontext/BeanContext.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -64,10 +64,12 @@
      * and is defined by the
      * <code>java.beans.Beans.instantiate()</code> method.
      *
+     * @return a javaBean named as a child of this
+     * <code>BeanContext</code>
      * @param beanName The name of the JavaBean to instantiate
      * as a child of this <code>BeanContext</code>
-     * @throws <code>IOException</code>
-     * @throws <code>ClassNotFoundException</code> if the class identified
+     * @throws IOException if an IO problem occurs
+     * @throws ClassNotFoundException if the class identified
      * by the beanName parameter is not found
      */
     Object instantiateChild(String beanName) throws IOException, ClassNotFoundException;
@@ -83,7 +85,7 @@
      * @return an <code>InputStream</code> for reading the resource,
      * or <code>null</code> if the resource could not
      * be found.
-     * @throws <code>IllegalArgumentException</code> if
+     * @throws IllegalArgumentException if
      * the resource is not valid
      */
     InputStream getResourceAsStream(String name, BeanContextChild bcc) throws IllegalArgumentException;
@@ -98,7 +100,7 @@
      * @param bcc the specified child
      * @return a <code>URL</code> for the named
      * resource for the specified child
-     * @throws <code>IllegalArgumentException</code>
+     * @throws IllegalArgumentException
      * if the resource is not valid
      */
     URL getResource(String name, BeanContextChild bcc) throws IllegalArgumentException;
@@ -109,7 +111,7 @@
       * this <code>BeanContext</code> whenever it adds
       * or removes a child <code>Component</code>(s).
       *
-      * @param bcml the <code>BeanContextMembershipListener</code> to be added
+      * @param bcml the BeanContextMembershipListener to be added
       */
     void addBeanContextMembershipListener(BeanContextMembershipListener bcml);
 
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextChild.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextChild.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -82,7 +82,7 @@
      * </p>
      * @param bc The <code>BeanContext</code> with which
      * to associate this <code>BeanContextChild</code>.
-     * @throws <code>PropertyVetoException</code> if the
+     * @throws PropertyVetoException if the
      * addition of the specified <code>BeanContext</code> is refused.
      */
     void setBeanContext(BeanContext bc) throws PropertyVetoException;
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextChildSupport.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextChildSupport.java	Wed Jul 05 19:07:19 2017 +0200
@@ -78,6 +78,7 @@
      * construct a BeanContextChildSupport where the JavaBean component
      * itself implements BeanContextChild, and encapsulates this, delegating
      * that interface to this implementation
+     * @param bcc the underlying bean context child
      */
 
     public BeanContextChildSupport(BeanContextChild bcc) {
@@ -94,7 +95,7 @@
      * this <code>BeanContextChildSupport</code>.
      * @param bc the new value to be assigned to the <code>BeanContext</code>
      * property
-     * @throws <code>PropertyVetoException</code> if the change is rejected
+     * @throws PropertyVetoException if the change is rejected
      */
     public synchronized void setBeanContext(BeanContext bc) throws PropertyVetoException {
         if (bc == beanContext) return;
@@ -361,6 +362,9 @@
     */
     protected VetoableChangeSupport vcSupport;
 
+    /**
+     * The bean context.
+     */
     protected transient BeanContext           beanContext;
 
    /**
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -103,6 +103,7 @@
      * Is the child specified affected by the event?
      * @return <code>true</code> if affected, <code>false</code>
      * if not
+     * @param child the object to check for being affected
      */
     public boolean contains(Object child) {
         return children.contains(child);
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextServices.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextServices.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -60,6 +60,7 @@
      * @param serviceClass     the service to add
      * @param serviceProvider  the <code>BeanContextServiceProvider</code>
      * associated with the service
+     * @return true if the service was successful added, false otherwise
      */
     boolean addService(Class serviceClass, BeanContextServiceProvider serviceProvider);
 
@@ -108,7 +109,7 @@
      * @param bcsrl the
      * <code>BeanContextServiceRevokedListener</code> to notify
      * if the service should later become revoked
-     * @throws TooManyListenersException
+     * @throws TooManyListenersException if there are too many listeners
      * @return a reference to this context's named
      * Service as requested or <code>null</code>
      */
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -603,12 +603,16 @@
                 serviceProvider = bcsp;
             }
 
+            /**
+             * Returns the service provider.
+             * @return the service provider
+             */
             protected BeanContextServiceProvider getServiceProvider() {
                 return serviceProvider;
             }
 
-            /*
-             * fields
+            /**
+             * The service provider.
              */
 
             protected BeanContextServiceProvider serviceProvider;
@@ -618,6 +622,9 @@
          * subclasses can override this method to create new subclasses of
          * BCSSServiceProvider without having to overrride addService() in
          * order to instantiate.
+         * @param sc the class
+         * @param bcsp the service provider
+         * @return a service provider without overriding addService()
          */
 
         protected BCSSServiceProvider createBCSSServiceProvider(Class sc, BeanContextServiceProvider bcsp) {
@@ -629,7 +636,7 @@
     /**
      * add a BeanContextServicesListener
      *
-     * @throws NullPointerException
+     * @throws NullPointerException if the argument is null
      */
 
     public void addBeanContextServicesListener(BeanContextServicesListener bcsl) {
@@ -660,6 +667,8 @@
 
     /**
      * add a service
+     * @param serviceClass the service class
+     * @param bcsp the service provider
      */
 
     public boolean addService(Class serviceClass, BeanContextServiceProvider bcsp) {
@@ -668,6 +677,10 @@
 
     /**
      * add a service
+     * @param serviceClass the service class
+     * @param bcsp the service provider
+     * @param fireEvent whether or not an event should be fired
+     * @return true if the service was successfully added
      */
 
     protected boolean addService(Class serviceClass, BeanContextServiceProvider bcsp, boolean fireEvent) {
@@ -709,6 +722,9 @@
 
     /**
      * remove a service
+     * @param serviceClass the service class
+     * @param bcsp the service provider
+     * @param revokeCurrentServicesNow whether or not to revoke the service
      */
 
     public void revokeService(Class serviceClass, BeanContextServiceProvider bcsp, boolean revokeCurrentServicesNow) {
@@ -1067,6 +1083,7 @@
 
     /**
      * Fires a <tt>BeanContextServiceEvent</tt> notifying of a new service.
+     * @param serviceClass the service class
      */
     protected final void fireServiceAdded(Class serviceClass) {
         BeanContextServiceAvailableEvent bcssae = new BeanContextServiceAvailableEvent(getBeanContextServicesPeer(), serviceClass);
@@ -1109,6 +1126,8 @@
      * Fires a <tt>BeanContextServiceRevokedEvent</tt>
      * indicating that a particular service is
      * no longer available.
+     * @param serviceClass the service class
+     * @param revokeNow whether or not the event should be revoked now
      */
     protected final void fireServiceRevoked(Class serviceClass, boolean revokeNow) {
         Object[]                       copy;
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextSupport.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextSupport.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -62,7 +62,6 @@
 /**
  * This helper class provides a utility implementation of the
  * java.beans.beancontext.BeanContext interface.
- * </p>
  * <p>
  * Since this class directly implements the BeanContext interface, the class
  * can, and is intended to be used either by subclassing this implementation,
@@ -351,9 +350,8 @@
      * of Child without having to override add() or the other Collection
      * methods that add children to the set.
      * </p>
-     *
      * @param targetChild the child to create the Child on behalf of
-     * @param peer        the peer if the tragetChild and the peer are related by an implementation of BeanContextProxy
+     * @param peer        the peer if the tragetChild and the peer are related by an implementation of BeanContextProxy     * @return Subtype-specific subclass of Child without overriding collection methods
      */
 
     protected BCSChild createBCSChild(Object targetChild, Object peer) {
@@ -492,6 +490,7 @@
      * @param callChildSetBC used to indicate that
      * the child should be notified that it is no
      * longer nested in this <tt>BeanContext</tt>.
+     * @return whether or not was present before being removed
      */
     protected boolean remove(Object targetChild, boolean callChildSetBC) {
 
@@ -580,7 +579,8 @@
     /**
      * add Collection to set of Children (Unsupported)
      * implementations must synchronized on the hierarchy lock and "children" protected field
-     * @throws UnsupportedOperationException
+     * @throws UnsupportedOperationException thrown unconditionally by this implementation
+     * @return this implementation unconditionally throws {@code UnsupportedOperationException}
      */
     public boolean addAll(Collection c) {
         throw new UnsupportedOperationException();
@@ -589,7 +589,9 @@
     /**
      * remove all specified children (Unsupported)
      * implementations must synchronized on the hierarchy lock and "children" protected field
-     * @throws UnsupportedOperationException
+     * @throws UnsupportedOperationException thrown unconditionally by this implementation
+     * @return this implementation unconditionally throws {@code UnsupportedOperationException}
+
      */
     public boolean removeAll(Collection c) {
         throw new UnsupportedOperationException();
@@ -599,7 +601,8 @@
     /**
      * retain only specified children (Unsupported)
      * implementations must synchronized on the hierarchy lock and "children" protected field
-     * @throws UnsupportedOperationException
+     * @throws UnsupportedOperationException thrown unconditionally by this implementation
+     * @return this implementation unconditionally throws {@code UnsupportedOperationException}
      */
     public boolean retainAll(Collection c) {
         throw new UnsupportedOperationException();
@@ -608,7 +611,7 @@
     /**
      * clear the children (Unsupported)
      * implementations must synchronized on the hierarchy lock and "children" protected field
-     * @throws UnsupportedOperationException
+     * @throws UnsupportedOperationException thrown unconditionally by this implementation
      */
     public void clear() {
         throw new UnsupportedOperationException();
@@ -618,7 +621,7 @@
      * Adds a BeanContextMembershipListener
      *
      * @param  bcml the BeanContextMembershipListener to add
-     * @throws NullPointerException
+     * @throws NullPointerException if the argument is null
      */
 
     public void addBeanContextMembershipListener(BeanContextMembershipListener bcml) {
@@ -636,7 +639,7 @@
      * Removes a BeanContextMembershipListener
      *
      * @param  bcml the BeanContextMembershipListener to remove
-     * @throws NullPointerException
+     * @throws NullPointerException if the argument is null
      */
 
     public void removeBeanContextMembershipListener(BeanContextMembershipListener bcml) {
@@ -655,7 +658,7 @@
      * @param bcc  the child object making the request.
      *
      * @return  the requested resource as an InputStream
-     * @throws  NullPointerException
+     * @throws  NullPointerException if the argument is null
      */
 
     public InputStream getResourceAsStream(String name, BeanContextChild bcc) {
@@ -849,6 +852,8 @@
      *
      * This method should not however be used by subclasses to replace their
      * own implementation (if any) of writeObject().
+     * @param oos the {@code ObjectOutputStream} to use during serialization
+     * @throws IOException if serialization failed
      */
 
     protected void bcsPreSerializationHook(ObjectOutputStream oos) throws IOException {
@@ -864,6 +869,9 @@
      *
      * This method should not however be used by subclasses to replace their
      * own implementation (if any) of readObject().
+     * @param ois the {@code ObjectInputStream} to use during deserialization
+     * @throws IOException if deserialization failed
+     * @throws ClassNotFoundException if needed classes are not found
      */
 
     protected void bcsPreDeserializationHook(ObjectInputStream ois) throws IOException, ClassNotFoundException {
@@ -914,6 +922,8 @@
      * used by readObject to deserialize a collection.
      * @param ois the ObjectInputStream to use
      * @param coll the Collection
+     * @throws IOException if deserialization failed
+     * @throws ClassNotFoundException if needed classes are not found
      */
     protected final void deserialize(ObjectInputStream ois, Collection coll) throws IOException, ClassNotFoundException {
         int count = 0;
@@ -1005,6 +1015,9 @@
      * When an instance of this class is used as a delegate for the
      * implementation of the BeanContext protocols (and its subprotocols)
      * there exists a 'chicken and egg' problem during deserialization
+     * @param ois the ObjectInputStream to use
+     * @throws IOException if deserialization failed
+     * @throws ClassNotFoundException if needed classes are not found
      */
 
     public final void readChildren(ObjectInputStream ois) throws IOException, ClassNotFoundException {
@@ -1122,6 +1135,7 @@
      * immediately prior to their being added to the BeanContext.
      * </p>
      *
+     * @param targetChild the child to create the Child on behalf of
      * @return true iff the child may be added to this BeanContext, otherwise false.
      */
 
@@ -1136,6 +1150,7 @@
      * immediately prior to their being removed from the BeanContext.
      * </p>
      *
+     * @param targetChild the child to create the Child on behalf of
      * @return true iff the child may be removed from this BeanContext, otherwise false.
      */
 
@@ -1147,6 +1162,8 @@
      * subclasses may override this method to simply extend add() semantics
      * after the child has been added and before the event notification has
      * occurred. The method is called with the child synchronized.
+     * @param child the child
+     * @param bcsc the BCSChild
      */
 
     protected void childJustAddedHook(Object child, BCSChild bcsc) {
@@ -1156,6 +1173,8 @@
      * subclasses may override this method to simply extend remove() semantics
      * after the child has been removed and before the event notification has
      * occurred. The method is called with the child synchronized.
+     * @param child the child
+     * @param bcsc the BCSChild
      */
 
     protected void childJustRemovedHook(Object child, BCSChild bcsc) {
@@ -1254,6 +1273,7 @@
 
     /**
      * Fire a BeanContextshipEvent on the BeanContextMembershipListener interface
+     * @param bcme the event to fire
      */
 
     protected final void fireChildrenAdded(BeanContextMembershipEvent bcme) {
@@ -1267,6 +1287,7 @@
 
     /**
      * Fire a BeanContextshipEvent on the BeanContextMembershipListener interface
+     * @param bcme the event to fire
      */
 
     protected final void fireChildrenRemoved(BeanContextMembershipEvent bcme) {
--- a/jdk/src/share/classes/java/net/SocketAddress.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/net/SocketAddress.java	Wed Jul 05 19:07:19 2017 +0200
@@ -39,4 +39,7 @@
  * @since 1.4
  */
 public abstract class SocketAddress implements java.io.Serializable {
+
+    static final long serialVersionUID = 5215720748342549866L;
+
 }
--- a/jdk/src/share/classes/java/nio/file/Files.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/nio/file/Files.java	Wed Jul 05 19:07:19 2017 +0200
@@ -25,10 +25,10 @@
 
 package java.nio.file;
 
-import java.nio.ByteBuffer;
 import java.nio.file.attribute.*;
 import java.nio.file.spi.FileSystemProvider;
 import java.nio.file.spi.FileTypeDetector;
+import java.nio.channels.Channels;
 import java.nio.channels.FileChannel;
 import java.nio.channels.SeekableByteChannel;
 import java.io.Closeable;
@@ -2965,7 +2965,63 @@
     }
 
     /**
-     * Read all the bytes from a file. The method ensures that the file is
+     * The maximum size of array to allocate.
+     * Some VMs reserve some header words in an array.
+     * Attempts to allocate larger arrays may result in
+     * OutOfMemoryError: Requested array size exceeds VM limit
+     */
+    private static final int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;
+
+    /**
+     * Reads all the bytes from an input stream. Uses {@code initialSize} as a hint
+     * about how many bytes the stream will have.
+     *
+     * @param   source
+     *          the input stream to read from
+     * @param   initialSize
+     *          the initial size of the byte array to allocate
+     *
+     * @return  a byte array containing the bytes read from the file
+     *
+     * @throws  IOException
+     *          if an I/O error occurs reading from the stream
+     * @throws  OutOfMemoryError
+     *          if an array of the required size cannot be allocated
+     */
+    private static byte[] read(InputStream source, int initialSize)
+            throws IOException
+    {
+        int capacity = initialSize;
+        byte[] buf = new byte[capacity];
+        int nread = 0;
+        int n;
+        for (;;) {
+            // read to EOF which may read more or less than initialSize (eg: file
+            // is truncated while we are reading)
+            while ((n = source.read(buf, nread, capacity - nread)) > 0)
+                nread += n;
+
+            // if last call to source.read() returned -1, we are done
+            // otherwise, try to read one more byte; if that failed we're done too
+            if (n < 0 || (n = source.read()) < 0)
+                break;
+
+            // one more byte was read; need to allocate a larger buffer
+            if (capacity <= MAX_BUFFER_SIZE - capacity) {
+                capacity = Math.max(capacity << 1, BUFFER_SIZE);
+            } else {
+                if (capacity == MAX_BUFFER_SIZE)
+                    throw new OutOfMemoryError("Required array size too large");
+                capacity = MAX_BUFFER_SIZE;
+            }
+            buf = Arrays.copyOf(buf, capacity);
+            buf[nread++] = (byte)n;
+        }
+        return (capacity == nread) ? buf : Arrays.copyOf(buf, nread);
+    }
+
+    /**
+     * Reads all the bytes from a file. The method ensures that the file is
      * closed when all bytes have been read or an I/O error, or other runtime
      * exception, is thrown.
      *
@@ -2989,22 +3045,13 @@
      *          method is invoked to check read access to the file.
      */
     public static byte[] readAllBytes(Path path) throws IOException {
-        try (FileChannel fc = FileChannel.open(path)) {
+        try (FileChannel fc = FileChannel.open(path);
+             InputStream is = Channels.newInputStream(fc)) {
             long size = fc.size();
-            if (size > (long)Integer.MAX_VALUE)
+            if (size > (long)MAX_BUFFER_SIZE)
                 throw new OutOfMemoryError("Required array size too large");
 
-            byte[] arr = new byte[(int)size];
-            ByteBuffer bb = ByteBuffer.wrap(arr);
-            while (bb.hasRemaining()) {
-                if (fc.read(bb) < 0) {
-                    // truncated
-                    break;
-                }
-            }
-
-            int nread = bb.position();
-            return (nread == size) ? arr : Arrays.copyOf(arr, nread);
+            return read(is, (int)size);
         }
     }
 
--- a/jdk/src/share/classes/java/rmi/server/RMISocketFactory.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/rmi/server/RMISocketFactory.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -33,15 +33,47 @@
  * in order to obtain client and server sockets for RMI calls.  An
  * application may use the <code>setSocketFactory</code> method to
  * request that the RMI runtime use its socket factory instance
- * instead of the default implementation.<p>
+ * instead of the default implementation.
  *
- * The default socket factory implementation used goes through a
+ * <p>The default socket factory implementation performs a
  * three-tiered approach to creating client sockets. First, a direct
  * socket connection to the remote VM is attempted.  If that fails
  * (due to a firewall), the runtime uses HTTP with the explicit port
  * number of the server.  If the firewall does not allow this type of
  * communication, then HTTP to a cgi-bin script on the server is used
- * to POST the RMI call.<p>
+ * to POST the RMI call.
+ *
+ * <p>The default socket factory implementation creates server sockets that
+ * are bound to the wildcard address, which accepts requests from all network
+ * interfaces.
+ *
+ * @implNote
+ * <p>You can use the {@code RMISocketFactory} class to create a server socket that
+ * is bound to a specific address, restricting the origin of requests. For example,
+ * the following code implements a socket factory that binds server sockets to the
+ * loopback address. This restricts RMI to processing requests only from the local host.
+ *
+ * <pre>{@code
+ *     class LoopbackSocketFactory extends RMISocketFactory {
+ *         public ServerSocket createServerSocket(int port) throws IOException {
+ *             return new ServerSocket(port, 5, InetAddress.getLoopbackAddress());
+ *         }
+ *
+ *         public Socket createSocket(String host, int port) throws IOException {
+ *             // just call the default client socket factory
+ *             return RMISocketFactory.getDefaultSocketFactory()
+ *                                    .createSocket(host, port);
+ *         }
+ *     }
+ *
+ *     // ...
+ *
+ *     RMISocketFactory.setSocketFactory(new LoopbackSocketFactory());
+ * }</pre>
+ *
+ * Set the {@code java.rmi.server.hostname} system property
+ * to a host name (typically {@code localhost}) that resolves to the loopback
+ * interface to ensure that the generated stubs use the right network interface.
  *
  * @author  Ann Wollrath
  * @author  Peter Jones
--- a/jdk/src/share/classes/java/rmi/server/UnicastRemoteObject.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/rmi/server/UnicastRemoteObject.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -100,6 +100,26 @@
  * </ul>
  * </ul>
  *
+ * <p>If an object is exported with the
+ * {@link #exportObject(Remote) exportObject(Remote)}
+ * or
+ * {@link #exportObject(Remote, int) exportObject(Remote, port)}
+ * methods, or if a subclass constructor invokes one of the
+ * {@link #UnicastRemoteObject()}
+ * or
+ * {@link #UnicastRemoteObject(int) UnicastRemoteObject(port)}
+ * constructors, the object is exported with a server socket created using the
+ * {@link RMISocketFactory}
+ * class.
+ *
+ * @implNote
+ * <p>By default, server sockets created by the {@link RMISocketFactory} class
+ * listen on all network interfaces. See the
+ * {@link RMISocketFactory} class and the section
+ * <a href="{@docRoot}/../platform/rmi/spec/rmi-server29.html">RMI Socket Factories</a>
+ * in the
+ * <a href="{@docRoot}/../platform/rmi/spec/rmiTOC.html">Java RMI Specification</a>.
+ *
  * @author  Ann Wollrath
  * @author  Peter Jones
  * @since   JDK1.1
--- a/jdk/src/share/classes/java/security/Security.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/security/Security.java	Wed Jul 05 19:07:19 2017 +0200
@@ -326,17 +326,13 @@
      *
      * <p>A provider cannot be added if it is already installed.
      *
-     * <p>First, if there is a security manager, its
-     * {@code checkSecurityAccess}
-     * method is called with the string
-     * {@code "insertProvider."+provider.getName()}
-     * to see if it's ok to add a new provider.
-     * If the default implementation of {@code checkSecurityAccess}
-     * is used (i.e., that method is not overriden), then this will result in
-     * a call to the security manager's {@code checkPermission} method
-     * with a
-     * {@code SecurityPermission("insertProvider."+provider.getName())}
-     * permission.
+     * <p>If there is a security manager, the
+     * {@link java.lang.SecurityManager#checkSecurityAccess} method is called
+     * with the {@code "insertProvider"} permission target name to see if
+     * it's ok to add a new provider. If this permission check is denied,
+     * {@code checkSecurityAccess} is called again with the
+     * {@code "insertProvider."+provider.getName()} permission target name. If
+     * both checks are denied, a {@code SecurityException} is thrown.
      *
      * @param provider the provider to be added.
      *
@@ -360,7 +356,7 @@
     public static synchronized int insertProviderAt(Provider provider,
             int position) {
         String providerName = provider.getName();
-        check("insertProvider." + providerName);
+        checkInsertProvider(providerName);
         ProviderList list = Providers.getFullProviderList();
         ProviderList newList = ProviderList.insertAt(list, provider, position - 1);
         if (list == newList) {
@@ -373,17 +369,13 @@
     /**
      * Adds a provider to the next position available.
      *
-     * <p>First, if there is a security manager, its
-     * {@code checkSecurityAccess}
-     * method is called with the string
-     * {@code "insertProvider."+provider.getName()}
-     * to see if it's ok to add a new provider.
-     * If the default implementation of {@code checkSecurityAccess}
-     * is used (i.e., that method is not overriden), then this will result in
-     * a call to the security manager's {@code checkPermission} method
-     * with a
-     * {@code SecurityPermission("insertProvider."+provider.getName())}
-     * permission.
+     * <p>If there is a security manager, the
+     * {@link java.lang.SecurityManager#checkSecurityAccess} method is called
+     * with the {@code "insertProvider"} permission target name to see if
+     * it's ok to add a new provider. If this permission check is denied,
+     * {@code checkSecurityAccess} is called again with the
+     * {@code "insertProvider."+provider.getName()} permission target name. If
+     * both checks are denied, a {@code SecurityException} is thrown.
      *
      * @param provider the provider to be added.
      *
@@ -863,6 +855,23 @@
         }
     }
 
+    private static void checkInsertProvider(String name) {
+        SecurityManager security = System.getSecurityManager();
+        if (security != null) {
+            try {
+                security.checkSecurityAccess("insertProvider");
+            } catch (SecurityException se1) {
+                try {
+                    security.checkSecurityAccess("insertProvider." + name);
+                } catch (SecurityException se2) {
+                    // throw first exception, but add second to suppressed
+                    se1.addSuppressed(se2);
+                    throw se1;
+                }
+            }
+        }
+    }
+
     /*
     * Returns all providers who satisfy the specified
     * criterion.
--- a/jdk/src/share/classes/java/security/SecurityPermission.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/security/SecurityPermission.java	Wed Jul 05 19:07:19 2017 +0200
@@ -130,14 +130,17 @@
  * </tr>
  *
  * <tr>
- *   <td>insertProvider.{provider name}</td>
- *   <td>Addition of a new provider, with the specified name</td>
+ *   <td>insertProvider</td>
+ *   <td>Addition of a new provider</td>
  *   <td>This would allow somebody to introduce a possibly
  * malicious provider (e.g., one that discloses the private keys passed
  * to it) as the highest-priority provider. This would be possible
  * because the Security object (which manages the installed providers)
  * currently does not check the integrity or authenticity of a provider
- * before attaching it.</td>
+ * before attaching it. The "insertProvider" permission subsumes the
+ * "insertProvider.{provider name}" permission (see the section below for
+ * more information).
+ * </td>
  * </tr>
  *
  * <tr>
@@ -186,9 +189,10 @@
  * </table>
  *
  * <P>
- * The following permissions are associated with classes that have been
- * deprecated: {@link Identity}, {@link IdentityScope}, {@link Signer}. Use of
- * them is discouraged. See the applicable classes for more information.
+ * The following permissions have been superseded by newer permissions or are
+ * associated with classes that have been deprecated: {@link Identity},
+ * {@link IdentityScope}, {@link Signer}. Use of them is discouraged. See the
+ * applicable classes for more information.
  * <P>
  *
  * <table border=1 cellpadding=5 summary="target name,what the permission allows, and associated risks">
@@ -199,6 +203,23 @@
  * </tr>
  *
  * <tr>
+ *   <td>insertProvider.{provider name}</td>
+ *   <td>Addition of a new provider, with the specified name</td>
+ *   <td>Use of this permission is discouraged from further use because it is
+ * possible to circumvent the name restrictions by overriding the
+ * {@link java.security.Provider#getName} method. Also, there is an equivalent
+ * level of risk associated with granting code permission to insert a provider
+ * with a specific name, or any name it chooses. Users should use the
+ * "insertProvider" permission instead.
+ * <p>This would allow somebody to introduce a possibly
+ * malicious provider (e.g., one that discloses the private keys passed
+ * to it) as the highest-priority provider. This would be possible
+ * because the Security object (which manages the installed providers)
+ * currently does not check the integrity or authenticity of a provider
+ * before attaching it.</td>
+ * </tr>
+ *
+ * <tr>
  *   <td>setSystemScope</td>
  *   <td>Setting of the system identity scope</td>
  *   <td>This would allow an attacker to configure the system identity scope with
@@ -306,7 +327,6 @@
      * @throws NullPointerException if {@code name} is {@code null}.
      * @throws IllegalArgumentException if {@code name} is empty.
      */
-
     public SecurityPermission(String name)
     {
         super(name);
@@ -323,7 +343,6 @@
      * @throws NullPointerException if {@code name} is {@code null}.
      * @throws IllegalArgumentException if {@code name} is empty.
      */
-
     public SecurityPermission(String name, String actions)
     {
         super(name, actions);
--- a/jdk/src/share/classes/java/util/ArrayPrefixHelpers.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/ArrayPrefixHelpers.java	Wed Jul 05 19:07:19 2017 +0200
@@ -128,6 +128,7 @@
             this.lo = lo; this.hi = hi;
         }
 
+        @SuppressWarnings("unchecked")
         public final void compute() {
             final BinaryOperator<T> fn;
             final T[] a;
@@ -692,6 +693,4 @@
             }
         }
     }
-
-
-}
\ No newline at end of file
+}
--- a/jdk/src/share/classes/java/util/Collections.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/Collections.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1143,6 +1143,7 @@
         public boolean removeIf(Predicate<? super E> filter) {
             throw new UnsupportedOperationException();
         }
+        @SuppressWarnings("unchecked")
         @Override
         public Spliterator<E> spliterator() {
             return (Spliterator<E>)c.spliterator();
@@ -1900,7 +1901,7 @@
 
             private static final long serialVersionUID = -2239321462712562324L;
 
-            EmptyNavigableMap()                       { super(new TreeMap()); }
+            EmptyNavigableMap()                       { super(new TreeMap<K,V>()); }
 
             @Override
             public NavigableSet<K> navigableKeySet()
@@ -1928,46 +1929,52 @@
         public K ceilingKey(K key)               { return nm.ceilingKey(key); }
         public K higherKey(K key)                 { return nm.higherKey(key); }
 
+        @SuppressWarnings("unchecked")
         public Entry<K, V> lowerEntry(K key) {
             Entry<K,V> lower = (Entry<K, V>) nm.lowerEntry(key);
             return (null != lower)
-                ? new UnmodifiableEntrySet.UnmodifiableEntry(lower)
+                ? new UnmodifiableEntrySet.UnmodifiableEntry<>(lower)
                 : null;
         }
 
+        @SuppressWarnings("unchecked")
         public Entry<K, V> floorEntry(K key) {
             Entry<K,V> floor = (Entry<K, V>) nm.floorEntry(key);
             return (null != floor)
-                ? new UnmodifiableEntrySet.UnmodifiableEntry(floor)
+                ? new UnmodifiableEntrySet.UnmodifiableEntry<>(floor)
                 : null;
         }
 
+        @SuppressWarnings("unchecked")
         public Entry<K, V> ceilingEntry(K key) {
             Entry<K,V> ceiling = (Entry<K, V>) nm.ceilingEntry(key);
             return (null != ceiling)
-                ? new UnmodifiableEntrySet.UnmodifiableEntry(ceiling)
+                ? new UnmodifiableEntrySet.UnmodifiableEntry<>(ceiling)
                 : null;
         }
 
 
+        @SuppressWarnings("unchecked")
         public Entry<K, V> higherEntry(K key) {
             Entry<K,V> higher = (Entry<K, V>) nm.higherEntry(key);
             return (null != higher)
-                ? new UnmodifiableEntrySet.UnmodifiableEntry(higher)
+                ? new UnmodifiableEntrySet.UnmodifiableEntry<>(higher)
                 : null;
         }
 
+        @SuppressWarnings("unchecked")
         public Entry<K, V> firstEntry() {
             Entry<K,V> first = (Entry<K, V>) nm.firstEntry();
             return (null != first)
-                ? new UnmodifiableEntrySet.UnmodifiableEntry(first)
+                ? new UnmodifiableEntrySet.UnmodifiableEntry<>(first)
                 : null;
         }
 
+        @SuppressWarnings("unchecked")
         public Entry<K, V> lastEntry() {
             Entry<K,V> last = (Entry<K, V>) nm.lastEntry();
             return (null != last)
-                ? new UnmodifiableEntrySet.UnmodifiableEntry(last)
+                ? new UnmodifiableEntrySet.UnmodifiableEntry<>(last)
                 : null;
         }
 
@@ -2360,7 +2367,7 @@
         }
         public NavigableSet<E> tailSet(E fromElement) {
             synchronized (mutex) {
-                return new SynchronizedNavigableSet(ns.tailSet(fromElement, true), mutex);
+                return new SynchronizedNavigableSet<>(ns.tailSet(fromElement, true), mutex);
             }
         }
 
@@ -2925,7 +2932,7 @@
         public NavigableMap<K, V> descendingMap() {
             synchronized (mutex) {
                 return
-                    new SynchronizedNavigableMap(nm.descendingMap(), mutex);
+                    new SynchronizedNavigableMap<>(nm.descendingMap(), mutex);
             }
         }
 
@@ -2935,13 +2942,13 @@
 
         public NavigableSet<K> navigableKeySet() {
             synchronized (mutex) {
-                return new SynchronizedNavigableSet(nm.navigableKeySet(), mutex);
+                return new SynchronizedNavigableSet<>(nm.navigableKeySet(), mutex);
             }
         }
 
         public NavigableSet<K> descendingKeySet() {
             synchronized (mutex) {
-                return new SynchronizedNavigableSet(nm.descendingKeySet(), mutex);
+                return new SynchronizedNavigableSet<>(nm.descendingKeySet(), mutex);
             }
         }
 
@@ -2959,27 +2966,27 @@
         }
         public SortedMap<K,V> tailMap(K fromKey) {
             synchronized (mutex) {
-               return new SynchronizedNavigableMap<>(nm.tailMap(fromKey, true),mutex);
+        return new SynchronizedNavigableMap<>(nm.tailMap(fromKey, true),mutex);
             }
         }
 
         public NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
             synchronized (mutex) {
-                return new SynchronizedNavigableMap(
+                return new SynchronizedNavigableMap<>(
                     nm.subMap(fromKey, fromInclusive, toKey, toInclusive), mutex);
             }
         }
 
         public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
             synchronized (mutex) {
-                return new SynchronizedNavigableMap(
+                return new SynchronizedNavigableMap<>(
                         nm.headMap(toKey, inclusive), mutex);
             }
         }
 
         public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
             synchronized (mutex) {
-                return new SynchronizedNavigableMap(
+                return new SynchronizedNavigableMap<>(
                     nm.tailMap(fromKey, inclusive), mutex);
             }
         }
@@ -4081,7 +4088,7 @@
         public Entry<K, V> lowerEntry(K key) {
             Entry<K,V> lower = nm.lowerEntry(key);
             return (null != lower)
-                ? new CheckedMap.CheckedEntrySet.CheckedEntry(lower, valueType)
+                ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(lower, valueType)
                 : null;
         }
 
@@ -4090,7 +4097,7 @@
         public Entry<K, V> floorEntry(K key) {
             Entry<K,V> floor = nm.floorEntry(key);
             return (null != floor)
-                ? new CheckedMap.CheckedEntrySet.CheckedEntry(floor, valueType)
+                ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(floor, valueType)
                 : null;
         }
 
@@ -4099,7 +4106,7 @@
         public Entry<K, V> ceilingEntry(K key) {
             Entry<K,V> ceiling = nm.ceilingEntry(key);
             return (null != ceiling)
-                ? new CheckedMap.CheckedEntrySet.CheckedEntry(ceiling, valueType)
+                ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(ceiling, valueType)
                 : null;
         }
 
@@ -4108,7 +4115,7 @@
         public Entry<K, V> higherEntry(K key) {
             Entry<K,V> higher = nm.higherEntry(key);
             return (null != higher)
-                ? new CheckedMap.CheckedEntrySet.CheckedEntry(higher, valueType)
+                ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(higher, valueType)
                 : null;
         }
 
@@ -4117,14 +4124,14 @@
         public Entry<K, V> firstEntry() {
             Entry<K,V> first = nm.firstEntry();
             return (null != first)
-                ? new CheckedMap.CheckedEntrySet.CheckedEntry(first, valueType)
+                ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(first, valueType)
                 : null;
         }
 
         public Entry<K, V> lastEntry() {
             Entry<K,V> last = nm.lastEntry();
             return (null != last)
-                ? new CheckedMap.CheckedEntrySet.CheckedEntry(last, valueType)
+                ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(last, valueType)
                 : null;
         }
 
@@ -4132,14 +4139,14 @@
             Entry<K,V> entry = nm.pollFirstEntry();
             return (null == entry)
                 ? null
-                : new CheckedMap.CheckedEntrySet.CheckedEntry(entry, valueType);
+                : new CheckedMap.CheckedEntrySet.CheckedEntry<>(entry, valueType);
         }
 
         public Entry<K, V> pollLastEntry() {
             Entry<K,V> entry = nm.pollLastEntry();
             return (null == entry)
                 ? null
-                : new CheckedMap.CheckedEntrySet.CheckedEntry(entry, valueType);
+                : new CheckedMap.CheckedEntrySet.CheckedEntry<>(entry, valueType);
         }
 
         public NavigableMap<K, V> descendingMap() {
--- a/jdk/src/share/classes/java/util/Comparator.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/Comparator.java	Wed Jul 05 19:07:19 2017 +0200
@@ -352,6 +352,7 @@
      * @see Comparable
      * @since 1.8
      */
+    @SuppressWarnings("unchecked")
     public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {
         return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE;
     }
@@ -374,7 +375,7 @@
      * @since 1.8
      */
     public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) {
-        return new Comparators.NullComparator(true, comparator);
+        return new Comparators.NullComparator<>(true, comparator);
     }
 
     /**
@@ -395,7 +396,7 @@
      * @since 1.8
      */
     public static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) {
-        return new Comparators.NullComparator(false, comparator);
+        return new Comparators.NullComparator<>(false, comparator);
     }
 
     /**
--- a/jdk/src/share/classes/java/util/Comparators.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/Comparators.java	Wed Jul 05 19:07:19 2017 +0200
@@ -87,12 +87,12 @@
         @Override
         public Comparator<T> thenComparing(Comparator<? super T> other) {
             Objects.requireNonNull(other);
-            return new NullComparator(nullFirst, real == null ? other : real.thenComparing(other));
+            return new NullComparator<>(nullFirst, real == null ? other : real.thenComparing(other));
         }
 
         @Override
         public Comparator<T> reversed() {
-            return new NullComparator(!nullFirst, real == null ? null : real.reversed());
+            return new NullComparator<>(!nullFirst, real == null ? null : real.reversed());
         }
     }
 }
--- a/jdk/src/share/classes/java/util/Deque.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/Deque.java	Wed Jul 05 19:07:19 2017 +0200
@@ -38,7 +38,7 @@
 /**
  * A linear collection that supports element insertion and removal at
  * both ends.  The name <i>deque</i> is short for "double ended queue"
- * and is usually pronounced "deck".  Most <tt>Deque</tt>
+ * and is usually pronounced "deck".  Most {@code Deque}
  * implementations place no fixed limits on the number of elements
  * they may contain, but this interface supports capacity-restricted
  * deques as well as those with no fixed size limit.
@@ -47,10 +47,10 @@
  * ends of the deque.  Methods are provided to insert, remove, and
  * examine the element.  Each of these methods exists in two forms:
  * one throws an exception if the operation fails, the other returns a
- * special value (either <tt>null</tt> or <tt>false</tt>, depending on
+ * special value (either {@code null} or {@code false}, depending on
  * the operation).  The latter form of the insert operation is
  * designed specifically for use with capacity-restricted
- * <tt>Deque</tt> implementations; in most implementations, insert
+ * {@code Deque} implementations; in most implementations, insert
  * operations cannot fail.
  *
  * <p>The twelve methods described above are summarized in the
@@ -58,6 +58,7 @@
  *
  * <p>
  * <table BORDER CELLPADDING=3 CELLSPACING=1>
+ * <caption>Summary of Deque methods</caption>
  *  <tr>
  *    <td></td>
  *    <td ALIGN=CENTER COLSPAN = 2> <b>First Element (Head)</b></td>
@@ -72,38 +73,39 @@
  *  </tr>
  *  <tr>
  *    <td><b>Insert</b></td>
- *    <td>{@link #addFirst addFirst(e)}</td>
- *    <td>{@link #offerFirst offerFirst(e)}</td>
- *    <td>{@link #addLast addLast(e)}</td>
- *    <td>{@link #offerLast offerLast(e)}</td>
+ *    <td>{@link Deque#addFirst addFirst(e)}</td>
+ *    <td>{@link Deque#offerFirst offerFirst(e)}</td>
+ *    <td>{@link Deque#addLast addLast(e)}</td>
+ *    <td>{@link Deque#offerLast offerLast(e)}</td>
  *  </tr>
  *  <tr>
  *    <td><b>Remove</b></td>
- *    <td>{@link #removeFirst removeFirst()}</td>
- *    <td>{@link #pollFirst pollFirst()}</td>
- *    <td>{@link #removeLast removeLast()}</td>
- *    <td>{@link #pollLast pollLast()}</td>
+ *    <td>{@link Deque#removeFirst removeFirst()}</td>
+ *    <td>{@link Deque#pollFirst pollFirst()}</td>
+ *    <td>{@link Deque#removeLast removeLast()}</td>
+ *    <td>{@link Deque#pollLast pollLast()}</td>
  *  </tr>
  *  <tr>
  *    <td><b>Examine</b></td>
- *    <td>{@link #getFirst getFirst()}</td>
- *    <td>{@link #peekFirst peekFirst()}</td>
- *    <td>{@link #getLast getLast()}</td>
- *    <td>{@link #peekLast peekLast()}</td>
+ *    <td>{@link Deque#getFirst getFirst()}</td>
+ *    <td>{@link Deque#peekFirst peekFirst()}</td>
+ *    <td>{@link Deque#getLast getLast()}</td>
+ *    <td>{@link Deque#peekLast peekLast()}</td>
  *  </tr>
  * </table>
  *
  * <p>This interface extends the {@link Queue} interface.  When a deque is
  * used as a queue, FIFO (First-In-First-Out) behavior results.  Elements are
  * added at the end of the deque and removed from the beginning.  The methods
- * inherited from the <tt>Queue</tt> interface are precisely equivalent to
- * <tt>Deque</tt> methods as indicated in the following table:
+ * inherited from the {@code Queue} interface are precisely equivalent to
+ * {@code Deque} methods as indicated in the following table:
  *
  * <p>
  * <table BORDER CELLPADDING=3 CELLSPACING=1>
+ * <caption>Comparison of Queue and Deque methods</caption>
  *  <tr>
- *    <td ALIGN=CENTER> <b><tt>Queue</tt> Method</b></td>
- *    <td ALIGN=CENTER> <b>Equivalent <tt>Deque</tt> Method</b></td>
+ *    <td ALIGN=CENTER> <b>{@code Queue} Method</b></td>
+ *    <td ALIGN=CENTER> <b>Equivalent {@code Deque} Method</b></td>
  *  </tr>
  *  <tr>
  *    <td>{@link java.util.Queue#add add(e)}</td>
@@ -135,13 +137,14 @@
  * interface should be used in preference to the legacy {@link Stack} class.
  * When a deque is used as a stack, elements are pushed and popped from the
  * beginning of the deque.  Stack methods are precisely equivalent to
- * <tt>Deque</tt> methods as indicated in the table below:
+ * {@code Deque} methods as indicated in the table below:
  *
  * <p>
  * <table BORDER CELLPADDING=3 CELLSPACING=1>
+ * <caption>Comparison of Stack and Deque methods</caption>
  *  <tr>
  *    <td ALIGN=CENTER> <b>Stack Method</b></td>
- *    <td ALIGN=CENTER> <b>Equivalent <tt>Deque</tt> Method</b></td>
+ *    <td ALIGN=CENTER> <b>Equivalent {@code Deque} Method</b></td>
  *  </tr>
  *  <tr>
  *    <td>{@link #push push(e)}</td>
@@ -168,18 +171,18 @@
  * <p>Unlike the {@link List} interface, this interface does not
  * provide support for indexed access to elements.
  *
- * <p>While <tt>Deque</tt> implementations are not strictly required
+ * <p>While {@code Deque} implementations are not strictly required
  * to prohibit the insertion of null elements, they are strongly
- * encouraged to do so.  Users of any <tt>Deque</tt> implementations
+ * encouraged to do so.  Users of any {@code Deque} implementations
  * that do allow null elements are strongly encouraged <i>not</i> to
  * take advantage of the ability to insert nulls.  This is so because
- * <tt>null</tt> is used as a special return value by various methods
+ * {@code null} is used as a special return value by various methods
  * to indicated that the deque is empty.
  *
- * <p><tt>Deque</tt> implementations generally do not define
- * element-based versions of the <tt>equals</tt> and <tt>hashCode</tt>
+ * <p>{@code Deque} implementations generally do not define
+ * element-based versions of the {@code equals} and {@code hashCode}
  * methods, but instead inherit the identity-based versions from class
- * <tt>Object</tt>.
+ * {@code Object}.
  *
  * <p>This interface is a member of the <a
  * href="{@docRoot}/../technotes/guides/collections/index.html"> Java Collections
@@ -190,13 +193,13 @@
  * @since  1.6
  * @param <E> the type of elements held in this collection
  */
-
 public interface Deque<E> extends Queue<E> {
     /**
      * Inserts the specified element at the front of this deque if it is
-     * possible to do so immediately without violating capacity restrictions.
-     * When using a capacity-restricted deque, it is generally preferable to
-     * use method {@link #offerFirst}.
+     * possible to do so immediately without violating capacity restrictions,
+     * throwing an {@code IllegalStateException} if no space is currently
+     * available.  When using a capacity-restricted deque, it is generally
+     * preferable to use method {@link #offerFirst}.
      *
      * @param e the element to add
      * @throws IllegalStateException if the element cannot be added at this
@@ -212,9 +215,10 @@
 
     /**
      * Inserts the specified element at the end of this deque if it is
-     * possible to do so immediately without violating capacity restrictions.
-     * When using a capacity-restricted deque, it is generally preferable to
-     * use method {@link #offerLast}.
+     * possible to do so immediately without violating capacity restrictions,
+     * throwing an {@code IllegalStateException} if no space is currently
+     * available.  When using a capacity-restricted deque, it is generally
+     * preferable to use method {@link #offerLast}.
      *
      * <p>This method is equivalent to {@link #add}.
      *
@@ -237,8 +241,8 @@
      * which can fail to insert an element only by throwing an exception.
      *
      * @param e the element to add
-     * @return <tt>true</tt> if the element was added to this deque, else
-     *         <tt>false</tt>
+     * @return {@code true} if the element was added to this deque, else
+     *         {@code false}
      * @throws ClassCastException if the class of the specified element
      *         prevents it from being added to this deque
      * @throws NullPointerException if the specified element is null and this
@@ -255,8 +259,8 @@
      * which can fail to insert an element only by throwing an exception.
      *
      * @param e the element to add
-     * @return <tt>true</tt> if the element was added to this deque, else
-     *         <tt>false</tt>
+     * @return {@code true} if the element was added to this deque, else
+     *         {@code false}
      * @throws ClassCastException if the class of the specified element
      *         prevents it from being added to this deque
      * @throws NullPointerException if the specified element is null and this
@@ -288,17 +292,17 @@
 
     /**
      * Retrieves and removes the first element of this deque,
-     * or returns <tt>null</tt> if this deque is empty.
+     * or returns {@code null} if this deque is empty.
      *
-     * @return the head of this deque, or <tt>null</tt> if this deque is empty
+     * @return the head of this deque, or {@code null} if this deque is empty
      */
     E pollFirst();
 
     /**
      * Retrieves and removes the last element of this deque,
-     * or returns <tt>null</tt> if this deque is empty.
+     * or returns {@code null} if this deque is empty.
      *
-     * @return the tail of this deque, or <tt>null</tt> if this deque is empty
+     * @return the tail of this deque, or {@code null} if this deque is empty
      */
     E pollLast();
 
@@ -325,31 +329,31 @@
 
     /**
      * Retrieves, but does not remove, the first element of this deque,
-     * or returns <tt>null</tt> if this deque is empty.
+     * or returns {@code null} if this deque is empty.
      *
-     * @return the head of this deque, or <tt>null</tt> if this deque is empty
+     * @return the head of this deque, or {@code null} if this deque is empty
      */
     E peekFirst();
 
     /**
      * Retrieves, but does not remove, the last element of this deque,
-     * or returns <tt>null</tt> if this deque is empty.
+     * or returns {@code null} if this deque is empty.
      *
-     * @return the tail of this deque, or <tt>null</tt> if this deque is empty
+     * @return the tail of this deque, or {@code null} if this deque is empty
      */
     E peekLast();
 
     /**
      * Removes the first occurrence of the specified element from this deque.
      * If the deque does not contain the element, it is unchanged.
-     * More formally, removes the first element <tt>e</tt> such that
+     * More formally, removes the first element {@code e} such that
      * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>
      * (if such an element exists).
-     * Returns <tt>true</tt> if this deque contained the specified element
+     * Returns {@code true} if this deque contained the specified element
      * (or equivalently, if this deque changed as a result of the call).
      *
      * @param o element to be removed from this deque, if present
-     * @return <tt>true</tt> if an element was removed as a result of this call
+     * @return {@code true} if an element was removed as a result of this call
      * @throws ClassCastException if the class of the specified element
      *         is incompatible with this deque
      * (<a href="Collection.html#optional-restrictions">optional</a>)
@@ -362,14 +366,14 @@
     /**
      * Removes the last occurrence of the specified element from this deque.
      * If the deque does not contain the element, it is unchanged.
-     * More formally, removes the last element <tt>e</tt> such that
+     * More formally, removes the last element {@code e} such that
      * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>
      * (if such an element exists).
-     * Returns <tt>true</tt> if this deque contained the specified element
+     * Returns {@code true} if this deque contained the specified element
      * (or equivalently, if this deque changed as a result of the call).
      *
      * @param o element to be removed from this deque, if present
-     * @return <tt>true</tt> if an element was removed as a result of this call
+     * @return {@code true} if an element was removed as a result of this call
      * @throws ClassCastException if the class of the specified element
      *         is incompatible with this deque
      * (<a href="Collection.html#optional-restrictions">optional</a>)
@@ -385,15 +389,15 @@
      * Inserts the specified element into the queue represented by this deque
      * (in other words, at the tail of this deque) if it is possible to do so
      * immediately without violating capacity restrictions, returning
-     * <tt>true</tt> upon success and throwing an
-     * <tt>IllegalStateException</tt> if no space is currently available.
+     * {@code true} upon success and throwing an
+     * {@code IllegalStateException} if no space is currently available.
      * When using a capacity-restricted deque, it is generally preferable to
      * use {@link #offer(Object) offer}.
      *
      * <p>This method is equivalent to {@link #addLast}.
      *
      * @param e the element to add
-     * @return <tt>true</tt> (as specified by {@link Collection#add})
+     * @return {@code true} (as specified by {@link Collection#add})
      * @throws IllegalStateException if the element cannot be added at this
      *         time due to capacity restrictions
      * @throws ClassCastException if the class of the specified element
@@ -409,7 +413,7 @@
      * Inserts the specified element into the queue represented by this deque
      * (in other words, at the tail of this deque) if it is possible to do so
      * immediately without violating capacity restrictions, returning
-     * <tt>true</tt> upon success and <tt>false</tt> if no space is currently
+     * {@code true} upon success and {@code false} if no space is currently
      * available.  When using a capacity-restricted deque, this method is
      * generally preferable to the {@link #add} method, which can fail to
      * insert an element only by throwing an exception.
@@ -417,8 +421,8 @@
      * <p>This method is equivalent to {@link #offerLast}.
      *
      * @param e the element to add
-     * @return <tt>true</tt> if the element was added to this deque, else
-     *         <tt>false</tt>
+     * @return {@code true} if the element was added to this deque, else
+     *         {@code false}
      * @throws ClassCastException if the class of the specified element
      *         prevents it from being added to this deque
      * @throws NullPointerException if the specified element is null and this
@@ -444,11 +448,11 @@
     /**
      * Retrieves and removes the head of the queue represented by this deque
      * (in other words, the first element of this deque), or returns
-     * <tt>null</tt> if this deque is empty.
+     * {@code null} if this deque is empty.
      *
      * <p>This method is equivalent to {@link #pollFirst()}.
      *
-     * @return the first element of this deque, or <tt>null</tt> if
+     * @return the first element of this deque, or {@code null} if
      *         this deque is empty
      */
     E poll();
@@ -469,12 +473,12 @@
     /**
      * Retrieves, but does not remove, the head of the queue represented by
      * this deque (in other words, the first element of this deque), or
-     * returns <tt>null</tt> if this deque is empty.
+     * returns {@code null} if this deque is empty.
      *
      * <p>This method is equivalent to {@link #peekFirst()}.
      *
      * @return the head of the queue represented by this deque, or
-     *         <tt>null</tt> if this deque is empty
+     *         {@code null} if this deque is empty
      */
     E peek();
 
@@ -484,9 +488,8 @@
     /**
      * Pushes an element onto the stack represented by this deque (in other
      * words, at the head of this deque) if it is possible to do so
-     * immediately without violating capacity restrictions, returning
-     * <tt>true</tt> upon success and throwing an
-     * <tt>IllegalStateException</tt> if no space is currently available.
+     * immediately without violating capacity restrictions, throwing an
+     * {@code IllegalStateException} if no space is currently available.
      *
      * <p>This method is equivalent to {@link #addFirst}.
      *
@@ -520,16 +523,16 @@
     /**
      * Removes the first occurrence of the specified element from this deque.
      * If the deque does not contain the element, it is unchanged.
-     * More formally, removes the first element <tt>e</tt> such that
+     * More formally, removes the first element {@code e} such that
      * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>
      * (if such an element exists).
-     * Returns <tt>true</tt> if this deque contained the specified element
+     * Returns {@code true} if this deque contained the specified element
      * (or equivalently, if this deque changed as a result of the call).
      *
-     * <p>This method is equivalent to {@link #removeFirstOccurrence}.
+     * <p>This method is equivalent to {@link #removeFirstOccurrence(Object)}.
      *
      * @param o element to be removed from this deque, if present
-     * @return <tt>true</tt> if an element was removed as a result of this call
+     * @return {@code true} if an element was removed as a result of this call
      * @throws ClassCastException if the class of the specified element
      *         is incompatible with this deque
      * (<a href="Collection.html#optional-restrictions">optional</a>)
@@ -540,13 +543,13 @@
     boolean remove(Object o);
 
     /**
-     * Returns <tt>true</tt> if this deque contains the specified element.
-     * More formally, returns <tt>true</tt> if and only if this deque contains
-     * at least one element <tt>e</tt> such that
+     * Returns {@code true} if this deque contains the specified element.
+     * More formally, returns {@code true} if and only if this deque contains
+     * at least one element {@code e} such that
      * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
      *
      * @param o element whose presence in this deque is to be tested
-     * @return <tt>true</tt> if this deque contains the specified element
+     * @return {@code true} if this deque contains the specified element
      * @throws ClassCastException if the type of the specified element
      *         is incompatible with this deque
      * (<a href="Collection.html#optional-restrictions">optional</a>)
--- a/jdk/src/share/classes/java/util/DoubleSummaryStatistics.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/DoubleSummaryStatistics.java	Wed Jul 05 19:07:19 2017 +0200
@@ -25,6 +25,7 @@
 package java.util;
 
 import java.util.function.DoubleConsumer;
+import java.util.stream.Collector;
 
 /**
  * A state object for collecting statistics such as count, min, max, sum, and
@@ -35,24 +36,24 @@
  * summary statistics on a stream of doubles with:
  * <pre> {@code
  * DoubleSummaryStatistics stats = doubleStream.collect(DoubleSummaryStatistics::new,
- *     DoubleSummaryStatistics::accept,
- *     DoubleSummaryStatistics::combine);
+ *                                                      DoubleSummaryStatistics::accept,
+ *                                                      DoubleSummaryStatistics::combine);
  * }</pre>
  *
  * <p>{@code DoubleSummaryStatistics} can be used as a
- * {@linkplain java.util.stream.Stream#reduce(java.util.function.BinaryOperator) reduction}
+ * {@linkplain java.util.stream.Stream#collect(Collector) reduction}
  * target for a {@linkplain java.util.stream.Stream stream}. For example:
  *
  * <pre> {@code
  * DoubleSummaryStatistics stats = people.stream()
- *     .collect(Collectors.toDoubleSummaryStatistics(Person::getWeight));
+ *     .collect(Collectors.summarizingDouble(Person::getWeight));
  *}</pre>
  *
  * This computes, in a single pass, the count of people, as well as the minimum,
  * maximum, sum, and average of their weights.
  *
  * @implNote This implementation is not thread safe. However, it is safe to use
- * {@link java.util.stream.Collectors#toDoubleSummaryStatistics(java.util.function.ToDoubleFunction)
+ * {@link java.util.stream.Collectors#summarizingDouble(java.util.function.ToDoubleFunction)
  * Collectors.toDoubleStatistics()} on a parallel stream, because the parallel
  * implementation of {@link java.util.stream.Stream#collect Stream.collect()}
  * provides the necessary partitioning, isolation, and merging of results for
@@ -152,7 +153,7 @@
     }
 
     /**
-     * Returns the average of values recorded, or zero if no values have been
+     * Returns the arithmetic mean of values recorded, or zero if no values have been
      * recorded. The average returned can vary depending upon the order in
      * which values are recorded. This is due to accumulated rounding error in
      * addition of values of differing magnitudes. Values sorted by increasing
@@ -160,7 +161,7 @@
      * value is a {@code NaN} or the sum is at any point a {@code NaN} then the
      * average will be {@code NaN}.
      *
-     * @return the average of values, or zero if none
+     * @return the arithmetic mean of values, or zero if none
      */
     public final double getAverage() {
         return getCount() > 0 ? getSum() / getCount() : 0.0d;
--- a/jdk/src/share/classes/java/util/Formatter.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/Formatter.java	Wed Jul 05 19:07:19 2017 +0200
@@ -626,12 +626,11 @@
  * <p> For general argument types, the precision is the maximum number of
  * characters to be written to the output.
  *
- * <p> For the floating-point conversions {@code 'e'}, {@code 'E'}, and
- * {@code 'f'} the precision is the number of digits after the decimal
- * separator.  If the conversion is {@code 'g'} or {@code 'G'}, then the
+ * <p> For the floating-point conversions {@code 'a'}, {@code 'A'}, {@code 'e'},
+ * {@code 'E'}, and {@code 'f'} the precision is the number of digits after the
+ * radix point.  If the conversion is {@code 'g'} or {@code 'G'}, then the
  * precision is the total number of digits in the resulting magnitude after
- * rounding.  If the conversion is {@code 'a'} or {@code 'A'}, then the
- * precision must not be specified.
+ * rounding.
  *
  * <p> For character, integral, and date/time argument types and the percent
  * and line separator conversions, the precision is not applicable; if a
@@ -1297,14 +1296,21 @@
  *     of the significand as a fraction.  The exponent is represented by
  *     {@code 'p'} (<tt>'&#92;u0070'</tt>) followed by a decimal string of the
  *     unbiased exponent as if produced by invoking {@link
- *     Integer#toString(int) Integer.toString} on the exponent value.
+ *     Integer#toString(int) Integer.toString} on the exponent value.  If the
+ *     precision is specified, the value is rounded to the given number of
+ *     hexadecimal digits.
  *
  *     <li> If <i>m</i> is a {@code double} value with a subnormal
- *     representation then the significand is represented by the characters
- *     {@code '0x0.'} followed by the hexadecimal representation of the rest
- *     of the significand as a fraction.  The exponent is represented by
- *     {@code 'p-1022'}.  Note that there must be at least one nonzero digit
- *     in a subnormal significand.
+ *     representation then, unless the precision is specified to be in the range
+ *     1 through 12, inclusive, the significand is represented by the characters
+ *     {@code '0x0.'} followed by the hexadecimal representation of the rest of
+ *     the significand as a fraction, and the exponent represented by
+ *     {@code 'p-1022'}.  If the precision is in the interval
+ *     [1,&nbsp;12], the subnormal value is normalized such that it
+ *     begins with the characters {@code '0x1.'}, rounded to the number of
+ *     hexadecimal digits of precision, and the exponent adjusted
+ *     accordingly.  Note that there must be at least one nonzero digit in a
+ *     subnormal significand.
  *
  *     </ul>
  *
@@ -1367,7 +1373,7 @@
  * {@code 1}.
  *
  * <p> If the conversion is {@code 'a'} or {@code 'A'}, then the precision
- * is the number of hexadecimal digits after the decimal separator.  If the
+ * is the number of hexadecimal digits after the radix point.  If the
  * precision is not provided, then all of the digits as returned by {@link
  * Double#toHexString(double)} will be output.
  *
--- a/jdk/src/share/classes/java/util/HashMap.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/HashMap.java	Wed Jul 05 19:07:19 2017 +0200
@@ -876,13 +876,9 @@
 
     private static int roundUpToPowerOf2(int number) {
         // assert number >= 0 : "number must be non-negative";
-        int rounded = number >= MAXIMUM_CAPACITY
+        return number >= MAXIMUM_CAPACITY
                 ? MAXIMUM_CAPACITY
-                : (rounded = Integer.highestOneBit(number)) != 0
-                    ? (Integer.bitCount(number) > 1) ? rounded << 1 : rounded
-                    : 1;
-
-        return rounded;
+                : (number > 1) ? Integer.highestOneBit((number - 1) << 1) : 1;
     }
 
     /**
--- a/jdk/src/share/classes/java/util/Hashtable.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/Hashtable.java	Wed Jul 05 19:07:19 2017 +0200
@@ -928,6 +928,7 @@
         return (null == result) ? defaultValue : result;
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public synchronized void forEach(BiConsumer<? super K, ? super V> action) {
         Objects.requireNonNull(action);     // explicit check required in case
@@ -947,6 +948,7 @@
         }
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public synchronized void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
         Objects.requireNonNull(function);     // explicit check required in case
--- a/jdk/src/share/classes/java/util/IdentityHashMap.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/IdentityHashMap.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1339,6 +1339,7 @@
         tab[i + 1] = value;
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public void forEach(BiConsumer<? super K, ? super V> action) {
         Objects.requireNonNull(action);
@@ -1357,6 +1358,7 @@
         }
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
         Objects.requireNonNull(function);
--- a/jdk/src/share/classes/java/util/IntSummaryStatistics.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/IntSummaryStatistics.java	Wed Jul 05 19:07:19 2017 +0200
@@ -25,6 +25,7 @@
 package java.util;
 
 import java.util.function.IntConsumer;
+import java.util.stream.Collector;
 
 /**
  * A state object for collecting statistics such as count, min, max, sum, and
@@ -35,24 +36,24 @@
  * summary statistics on a stream of ints with:
  * <pre> {@code
  * IntSummaryStatistics stats = intStream.collect(IntSummaryStatistics::new,
- *     IntSummaryStatistics::accept,
- *     IntSummaryStatistics::combine);
+ *                                                IntSummaryStatistics::accept,
+ *                                                IntSummaryStatistics::combine);
  * }</pre>
  *
  * <p>{@code IntSummaryStatistics} can be used as a
- * {@linkplain java.util.stream.Stream#reduce(java.util.function.BinaryOperator) reduction}
+ * {@linkplain java.util.stream.Stream#collect(Collector) reduction}
  * target for a {@linkplain java.util.stream.Stream stream}. For example:
  *
  * <pre> {@code
  * IntSummaryStatistics stats = people.stream()
- *     .collect(Collectors.toIntSummaryStatistics(Person::getDependents));
+ *                                    .collect(Collectors.summarizingInt(Person::getDependents));
  *}</pre>
  *
  * This computes, in a single pass, the count of people, as well as the minimum,
  * maximum, sum, and average of their number of dependents.
  *
  * @implNote This implementation is not thread safe. However, it is safe to use
- * {@link java.util.stream.Collectors#toIntSummaryStatistics(java.util.function.ToIntFunction)
+ * {@link java.util.stream.Collectors#summarizingInt(java.util.function.ToIntFunction)
  * Collectors.toIntStatistics()} on a parallel stream, because the parallel
  * implementation of {@link java.util.stream.Stream#collect Stream.collect()}
  * provides the necessary partitioning, isolation, and merging of results for
@@ -140,10 +141,10 @@
     }
 
     /**
-     * Returns the average of values recorded, or zero if no values have been
+     * Returns the arithmetic mean of values recorded, or zero if no values have been
      * recorded.
      *
-     * @return the average of values, or zero if none
+     * @return the arithmetic mean of values, or zero if none
      */
     public final double getAverage() {
         return getCount() > 0 ? (double) getSum() / getCount() : 0.0d;
--- a/jdk/src/share/classes/java/util/LongSummaryStatistics.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/LongSummaryStatistics.java	Wed Jul 05 19:07:19 2017 +0200
@@ -26,6 +26,7 @@
 
 import java.util.function.IntConsumer;
 import java.util.function.LongConsumer;
+import java.util.stream.Collector;
 
 /**
  * A state object for collecting statistics such as count, min, max, sum, and
@@ -36,24 +37,24 @@
  * summary statistics on a stream of longs with:
  * <pre> {@code
  * LongSummaryStatistics stats = longStream.collect(LongSummaryStatistics::new,
- *     LongSummaryStatistics::accept,
- *     LongSummaryStatistics::combine);
+ *                                                  LongSummaryStatistics::accept,
+ *                                                  LongSummaryStatistics::combine);
  * }</pre>
  *
  * <p>{@code LongSummaryStatistics} can be used as a
- * {@linkplain java.util.stream.Stream#reduce(java.util.function.BinaryOperator) reduction}
+ * {@linkplain java.util.stream.Stream#collect(Collector)} reduction}
  * target for a {@linkplain java.util.stream.Stream stream}. For example:
  *
  * <pre> {@code
  * LongSummaryStatistics stats = people.stream()
- *     .collect(Collectors.toLongSummaryStatistics(Person::getAge));
+ *                                     .collect(Collectors.summarizingLong(Person::getAge));
  *}</pre>
  *
  * This computes, in a single pass, the count of people, as well as the minimum,
- * maximum, sum, and average of their ages in milliseconds.
+ * maximum, sum, and average of their ages.
  *
  * @implNote This implementation is not thread safe. However, it is safe to use
- * {@link java.util.stream.Collectors#toLongSummaryStatistics(java.util.function.ToLongFunction)
+ * {@link java.util.stream.Collectors#summarizingLong(java.util.function.ToLongFunction)
  * Collectors.toLongStatistics()} on a parallel stream, because the parallel
  * implementation of {@link java.util.stream.Stream#collect Stream.collect()}
  * provides the necessary partitioning, isolation, and merging of results for
@@ -152,10 +153,10 @@
     }
 
     /**
-     * Returns the average of values recorded, or zero if no values have been
+     * Returns the arithmetic mean of values recorded, or zero if no values have been
      * recorded.
      *
-     * @return The average of values, or zero if none
+     * @return The arithmetic mean of values, or zero if none
      */
     public final double getAverage() {
         return getCount() > 0 ? (double) getSum() / getCount() : 0.0d;
--- a/jdk/src/share/classes/java/util/Optional.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/Optional.java	Wed Jul 05 19:07:19 2017 +0200
@@ -307,7 +307,7 @@
             return false;
         }
 
-        Optional other = (Optional) obj;
+        Optional<?> other = (Optional<?>) obj;
         return Objects.equals(value, other.value);
     }
 
--- a/jdk/src/share/classes/java/util/Queue.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/Queue.java	Wed Jul 05 19:07:19 2017 +0200
@@ -41,14 +41,15 @@
  * queues provide additional insertion, extraction, and inspection
  * operations.  Each of these methods exists in two forms: one throws
  * an exception if the operation fails, the other returns a special
- * value (either <tt>null</tt> or <tt>false</tt>, depending on the
+ * value (either {@code null} or {@code false}, depending on the
  * operation).  The latter form of the insert operation is designed
- * specifically for use with capacity-restricted <tt>Queue</tt>
+ * specifically for use with capacity-restricted {@code Queue}
  * implementations; in most implementations, insert operations cannot
  * fail.
  *
  * <p>
  * <table BORDER CELLPADDING=3 CELLSPACING=1>
+ * <caption>Summary of Queue methods</caption>
  *  <tr>
  *    <td></td>
  *    <td ALIGN=CENTER><em>Throws exception</em></td>
@@ -56,18 +57,18 @@
  *  </tr>
  *  <tr>
  *    <td><b>Insert</b></td>
- *    <td>{@link #add add(e)}</td>
- *    <td>{@link #offer offer(e)}</td>
+ *    <td>{@link Queue#add add(e)}</td>
+ *    <td>{@link Queue#offer offer(e)}</td>
  *  </tr>
  *  <tr>
  *    <td><b>Remove</b></td>
- *    <td>{@link #remove remove()}</td>
- *    <td>{@link #poll poll()}</td>
+ *    <td>{@link Queue#remove remove()}</td>
+ *    <td>{@link Queue#poll poll()}</td>
  *  </tr>
  *  <tr>
  *    <td><b>Examine</b></td>
- *    <td>{@link #element element()}</td>
- *    <td>{@link #peek peek()}</td>
+ *    <td>{@link Queue#element element()}</td>
+ *    <td>{@link Queue#peek peek()}</td>
  *  </tr>
  * </table>
  *
@@ -79,15 +80,15 @@
  * Whatever the ordering used, the <em>head</em> of the queue is that
  * element which would be removed by a call to {@link #remove() } or
  * {@link #poll()}.  In a FIFO queue, all new elements are inserted at
- * the <em> tail</em> of the queue. Other kinds of queues may use
- * different placement rules.  Every <tt>Queue</tt> implementation
+ * the <em>tail</em> of the queue. Other kinds of queues may use
+ * different placement rules.  Every {@code Queue} implementation
  * must specify its ordering properties.
  *
  * <p>The {@link #offer offer} method inserts an element if possible,
- * otherwise returning <tt>false</tt>.  This differs from the {@link
+ * otherwise returning {@code false}.  This differs from the {@link
  * java.util.Collection#add Collection.add} method, which can fail to
  * add an element only by throwing an unchecked exception.  The
- * <tt>offer</tt> method is designed for use when failure is a normal,
+ * {@code offer} method is designed for use when failure is a normal,
  * rather than exceptional occurrence, for example, in fixed-capacity
  * (or &quot;bounded&quot;) queues.
  *
@@ -95,32 +96,32 @@
  * return the head of the queue.
  * Exactly which element is removed from the queue is a
  * function of the queue's ordering policy, which differs from
- * implementation to implementation. The <tt>remove()</tt> and
- * <tt>poll()</tt> methods differ only in their behavior when the
- * queue is empty: the <tt>remove()</tt> method throws an exception,
- * while the <tt>poll()</tt> method returns <tt>null</tt>.
+ * implementation to implementation. The {@code remove()} and
+ * {@code poll()} methods differ only in their behavior when the
+ * queue is empty: the {@code remove()} method throws an exception,
+ * while the {@code poll()} method returns {@code null}.
  *
  * <p>The {@link #element()} and {@link #peek()} methods return, but do
  * not remove, the head of the queue.
  *
- * <p>The <tt>Queue</tt> interface does not define the <i>blocking queue
+ * <p>The {@code Queue} interface does not define the <i>blocking queue
  * methods</i>, which are common in concurrent programming.  These methods,
  * which wait for elements to appear or for space to become available, are
  * defined in the {@link java.util.concurrent.BlockingQueue} interface, which
  * extends this interface.
  *
- * <p><tt>Queue</tt> implementations generally do not allow insertion
- * of <tt>null</tt> elements, although some implementations, such as
- * {@link LinkedList}, do not prohibit insertion of <tt>null</tt>.
- * Even in the implementations that permit it, <tt>null</tt> should
- * not be inserted into a <tt>Queue</tt>, as <tt>null</tt> is also
- * used as a special return value by the <tt>poll</tt> method to
+ * <p>{@code Queue} implementations generally do not allow insertion
+ * of {@code null} elements, although some implementations, such as
+ * {@link LinkedList}, do not prohibit insertion of {@code null}.
+ * Even in the implementations that permit it, {@code null} should
+ * not be inserted into a {@code Queue}, as {@code null} is also
+ * used as a special return value by the {@code poll} method to
  * indicate that the queue contains no elements.
  *
- * <p><tt>Queue</tt> implementations generally do not define
- * element-based versions of methods <tt>equals</tt> and
- * <tt>hashCode</tt> but instead inherit the identity based versions
- * from class <tt>Object</tt>, because element-based equality is not
+ * <p>{@code Queue} implementations generally do not define
+ * element-based versions of methods {@code equals} and
+ * {@code hashCode} but instead inherit the identity based versions
+ * from class {@code Object}, because element-based equality is not
  * always well-defined for queues with the same elements but different
  * ordering properties.
  *
@@ -145,11 +146,11 @@
     /**
      * Inserts the specified element into this queue if it is possible to do so
      * immediately without violating capacity restrictions, returning
-     * <tt>true</tt> upon success and throwing an <tt>IllegalStateException</tt>
+     * {@code true} upon success and throwing an {@code IllegalStateException}
      * if no space is currently available.
      *
      * @param e the element to add
-     * @return <tt>true</tt> (as specified by {@link Collection#add})
+     * @return {@code true} (as specified by {@link Collection#add})
      * @throws IllegalStateException if the element cannot be added at this
      *         time due to capacity restrictions
      * @throws ClassCastException if the class of the specified element
@@ -169,8 +170,8 @@
      * by throwing an exception.
      *
      * @param e the element to add
-     * @return <tt>true</tt> if the element was added to this queue, else
-     *         <tt>false</tt>
+     * @return {@code true} if the element was added to this queue, else
+     *         {@code false}
      * @throws ClassCastException if the class of the specified element
      *         prevents it from being added to this queue
      * @throws NullPointerException if the specified element is null and
@@ -192,9 +193,9 @@
 
     /**
      * Retrieves and removes the head of this queue,
-     * or returns <tt>null</tt> if this queue is empty.
+     * or returns {@code null} if this queue is empty.
      *
-     * @return the head of this queue, or <tt>null</tt> if this queue is empty
+     * @return the head of this queue, or {@code null} if this queue is empty
      */
     E poll();
 
@@ -210,9 +211,9 @@
 
     /**
      * Retrieves, but does not remove, the head of this queue,
-     * or returns <tt>null</tt> if this queue is empty.
+     * or returns {@code null} if this queue is empty.
      *
-     * @return the head of this queue, or <tt>null</tt> if this queue is empty
+     * @return the head of this queue, or {@code null} if this queue is empty
      */
     E peek();
 }
--- a/jdk/src/share/classes/java/util/StringJoiner.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/StringJoiner.java	Wed Jul 05 19:07:19 2017 +0200
@@ -49,16 +49,17 @@
  * <p>
  * A {@code StringJoiner} may be employed to create formatted output from a
  * {@link java.util.stream.Stream} using
- * {@link java.util.stream.Collectors#toStringJoiner}. For example:
+ * {@link java.util.stream.Collectors#joining(CharSequence)}. For example:
  *
  * <pre> {@code
  * List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
  * String commaSeparatedNumbers = numbers.stream()
  *     .map(i -> i.toString())
- *     .collect(Collectors.toStringJoiner(", ")).toString();
+ *     .collect(Collectors.joining(", "));
  * }</pre>
  *
- * @see java.util.stream.Collectors#toStringJoiner
+ * @see java.util.stream.Collectors#joining(CharSequence)
+ * @see java.util.stream.Collectors#joining(CharSequence, CharSequence, CharSequence)
  * @since  1.8
 */
 public final class StringJoiner {
--- a/jdk/src/share/classes/java/util/Vector.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/Vector.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1164,12 +1164,13 @@
                 if (i >= size) {
                     return;
                 }
-                final Object[] elementData = Vector.this.elementData;
+        @SuppressWarnings("unchecked")
+                final E[] elementData = (E[]) Vector.this.elementData;
                 if (i >= elementData.length) {
                     throw new ConcurrentModificationException();
                 }
                 while (i != size && modCount == expectedModCount) {
-                    action.accept((E) elementData[i++]);
+                    action.accept(elementData[i++]);
                 }
                 // update once at end of iteration to reduce heap write traffic
                 cursor = i;
@@ -1311,8 +1312,8 @@
         modCount++;
     }
 
+    @SuppressWarnings("unchecked")
     @Override
-    @SuppressWarnings("unchecked")
     public synchronized void sort(Comparator<? super E> c) {
         final int expectedModCount = modCount;
         Arrays.sort((E[]) elementData, 0, elementCount, c);
--- a/jdk/src/share/classes/java/util/WeakHashMap.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/WeakHashMap.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1038,6 +1038,7 @@
         }
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public void forEach(BiConsumer<? super K, ? super V> action) {
         Objects.requireNonNull(action);
@@ -1059,6 +1060,7 @@
         }
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
         Objects.requireNonNull(function);
--- a/jdk/src/share/classes/java/util/concurrent/CompletableFuture.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/CompletableFuture.java	Wed Jul 05 19:07:19 2017 +0200
@@ -48,13 +48,16 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.CancellationException;
+import java.util.concurrent.CompletionException;
+import java.util.concurrent.CompletionStage;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.LockSupport;
 
 /**
  * A {@link Future} that may be explicitly completed (setting its
- * value and status), and may include dependent functions and actions
- * that trigger upon its completion.
+ * value and status), and may be used as a {@link CompletionStage},
+ * supporting dependent functions and actions that trigger upon its
+ * completion.
  *
  * <p>When two or more threads attempt to
  * {@link #complete complete},
@@ -62,64 +65,50 @@
  * {@link #cancel cancel}
  * a CompletableFuture, only one of them succeeds.
  *
- * <p>Methods are available for adding dependents based on
- * user-provided Functions, Consumers, or Runnables. The appropriate
- * form to use depends on whether actions require arguments and/or
- * produce results.  Completion of a dependent action will trigger the
- * completion of another CompletableFuture.  Actions may also be
- * triggered after either or both the current and another
- * CompletableFuture complete.  Multiple CompletableFutures may also
- * be grouped as one using {@link #anyOf(CompletableFuture...)} and
- * {@link #allOf(CompletableFuture...)}.
+ * <p>In addition to these and related methods for directly
+ * manipulating status and results, CompletableFuture implements
+ * interface {@link CompletionStage} with the following policies: <ul>
  *
- * <p>CompletableFutures themselves do not execute asynchronously.
- * However, actions supplied for dependent completions of another
- * CompletableFuture may do so, depending on whether they are provided
- * via one of the <em>async</em> methods (that is, methods with names
- * of the form <tt><var>xxx</var>Async</tt>).  The <em>async</em>
- * methods provide a way to commence asynchronous processing of an
- * action using either a given {@link Executor} or by default the
- * {@link ForkJoinPool#commonPool()}. To simplify monitoring,
+ * <li>Actions supplied for dependent completions of
+ * <em>non-async</em> methods may be performed by the thread that
+ * completes the current CompletableFuture, or by any other caller of
+ * a completion method.</li>
+ *
+ * <li>All <em>async</em> methods without an explicit Executor
+ * argument are performed using the {@link ForkJoinPool#commonPool()}
+ * (unless it does not support a parallelism level of at least two, in
+ * which case, a new Thread is used). To simplify monitoring,
  * debugging, and tracking, all generated asynchronous tasks are
- * instances of the marker interface {@link AsynchronousCompletionTask}.
+ * instances of the marker interface {@link
+ * AsynchronousCompletionTask}. </li>
  *
- * <p>Actions supplied for dependent completions of <em>non-async</em>
- * methods may be performed by the thread that completes the current
- * CompletableFuture, or by any other caller of these methods.  There
- * are no guarantees about the order of processing completions unless
- * constrained by these methods.
+ * <li>All CompletionStage methods are implemented independently of
+ * other public methods, so the behavior of one method is not impacted
+ * by overrides of others in subclasses.  </li> </ul>
  *
- * <p>Since (unlike {@link FutureTask}) this class has no direct
- * control over the computation that causes it to be completed,
- * cancellation is treated as just another form of exceptional completion.
- * Method {@link #cancel cancel} has the same effect as
- * {@code completeExceptionally(new CancellationException())}.
+ * <p>CompletableFuture also implements {@link Future} with the following
+ * policies: <ul>
  *
- * <p>Upon exceptional completion (including cancellation), or when a
- * completion entails an additional computation which terminates
- * abruptly with an (unchecked) exception or error, then all of their
- * dependent completions (and their dependents in turn) generally act
- * as {@code completeExceptionally} with a {@link CompletionException}
- * holding that exception as its cause.  However, the {@link
- * #exceptionally exceptionally} and {@link #handle handle}
- * completions <em>are</em> able to handle exceptional completions of
- * the CompletableFutures they depend on.
+ * <li>Since (unlike {@link FutureTask}) this class has no direct
+ * control over the computation that causes it to be completed,
+ * cancellation is treated as just another form of exceptional
+ * completion.  Method {@link #cancel cancel} has the same effect as
+ * {@code completeExceptionally(new CancellationException())}. Method
+ * {@link #isCompletedExceptionally} can be used to determine if a
+ * CompletableFuture completed in any exceptional fashion.</li>
  *
- * <p>In case of exceptional completion with a CompletionException,
+ * <li>In case of exceptional completion with a CompletionException,
  * methods {@link #get()} and {@link #get(long, TimeUnit)} throw an
  * {@link ExecutionException} with the same cause as held in the
- * corresponding CompletionException.  However, in these cases,
- * methods {@link #join()} and {@link #getNow} throw the
- * CompletionException, which simplifies usage.
- *
- * <p>Arguments used to pass a completion result (that is, for parameters
- * of type {@code T}) may be null, but passing a null value for any other
- * parameter will result in a {@link NullPointerException} being thrown.
+ * corresponding CompletionException.  To simplify usage in most
+ * contexts, this class also defines methods {@link #join()} and
+ * {@link #getNow} that instead throw the CompletionException directly
+ * in these cases.</li> </ul>
  *
  * @author Doug Lea
  * @since 1.8
  */
-public class CompletableFuture<T> implements Future<T> {
+public class CompletableFuture<T> implements Future<T>, CompletionStage<T> {
 
     /*
      * Overview:
@@ -438,6 +427,19 @@
         public final void run() { exec(); }
     }
 
+    /**
+     * Starts the given async task using the given executor, unless
+     * the executor is ForkJoinPool.commonPool and it has been
+     * disabled, in which case starts a new thread.
+     */
+    static void execAsync(Executor e, Async r) {
+        if (e == ForkJoinPool.commonPool() &&
+            ForkJoinPool.getCommonPoolParallelism() <= 1)
+            new Thread(r).start();
+        else
+            e.execute(r);
+    }
+
     static final class AsyncRun extends Async {
         final Runnable fn;
         final CompletableFuture<Void> dst;
@@ -538,13 +540,13 @@
     static final class AsyncAccept<T> extends Async {
         final T arg;
         final Consumer<? super T> fn;
-        final CompletableFuture<Void> dst;
+        final CompletableFuture<?> dst;
         AsyncAccept(T arg, Consumer<? super T> fn,
-                    CompletableFuture<Void> dst) {
+                    CompletableFuture<?> dst) {
             this.arg = arg; this.fn = fn; this.dst = dst;
         }
         public final boolean exec() {
-            CompletableFuture<Void> d; Throwable ex;
+            CompletableFuture<?> d; Throwable ex;
             if ((d = this.dst) != null && d.result == null) {
                 try {
                     fn.accept(arg);
@@ -563,14 +565,14 @@
         final T arg1;
         final U arg2;
         final BiConsumer<? super T,? super U> fn;
-        final CompletableFuture<Void> dst;
+        final CompletableFuture<?> dst;
         AsyncAcceptBoth(T arg1, U arg2,
                         BiConsumer<? super T,? super U> fn,
-                        CompletableFuture<Void> dst) {
+                        CompletableFuture<?> dst) {
             this.arg1 = arg1; this.arg2 = arg2; this.fn = fn; this.dst = dst;
         }
         public final boolean exec() {
-            CompletableFuture<Void> d; Throwable ex;
+            CompletableFuture<?> d; Throwable ex;
             if ((d = this.dst) != null && d.result == null) {
                 try {
                     fn.accept(arg1, arg2);
@@ -587,10 +589,10 @@
 
     static final class AsyncCompose<T,U> extends Async {
         final T arg;
-        final Function<? super T, CompletableFuture<U>> fn;
+        final Function<? super T, ? extends CompletionStage<U>> fn;
         final CompletableFuture<U> dst;
         AsyncCompose(T arg,
-                     Function<? super T, CompletableFuture<U>> fn,
+                     Function<? super T, ? extends CompletionStage<U>> fn,
                      CompletableFuture<U> dst) {
             this.arg = arg; this.fn = fn; this.dst = dst;
         }
@@ -598,7 +600,8 @@
             CompletableFuture<U> d, fr; U u; Throwable ex;
             if ((d = this.dst) != null && d.result == null) {
                 try {
-                    fr = fn.apply(arg);
+                    CompletionStage<U> cs = fn.apply(arg);
+                    fr = (cs == null) ? null : cs.toCompletableFuture();
                     ex = (fr == null) ? new NullPointerException() : null;
                 } catch (Throwable rex) {
                     ex = rex;
@@ -626,6 +629,33 @@
         private static final long serialVersionUID = 5232453952276885070L;
     }
 
+    static final class AsyncWhenComplete<T> extends Async {
+        final T arg1;
+        final Throwable arg2;
+        final BiConsumer<? super T,? super Throwable> fn;
+        final CompletableFuture<T> dst;
+        AsyncWhenComplete(T arg1, Throwable arg2,
+                          BiConsumer<? super T,? super Throwable> fn,
+                          CompletableFuture<T> dst) {
+            this.arg1 = arg1; this.arg2 = arg2; this.fn = fn; this.dst = dst;
+        }
+        public final boolean exec() {
+            CompletableFuture<T> d;
+            if ((d = this.dst) != null && d.result == null) {
+                Throwable ex = arg2;
+                try {
+                    fn.accept(arg1, ex);
+                } catch (Throwable rex) {
+                    if (ex == null)
+                        ex = rex;
+                }
+                d.internalComplete(arg1, ex);
+            }
+            return true;
+        }
+        private static final long serialVersionUID = 5232453952276885070L;
+    }
+
     /* ------------- Completions -------------- */
 
     /**
@@ -680,7 +710,7 @@
                 if (ex == null) {
                     try {
                         if (e != null)
-                            e.execute(new AsyncApply<T,U>(t, fn, dst));
+                            execAsync(e, new AsyncApply<T,U>(t, fn, dst));
                         else
                             u = fn.apply(t);
                     } catch (Throwable rex) {
@@ -697,11 +727,11 @@
     static final class ThenAccept<T> extends Completion {
         final CompletableFuture<? extends T> src;
         final Consumer<? super T> fn;
-        final CompletableFuture<Void> dst;
+        final CompletableFuture<?> dst;
         final Executor executor;
         ThenAccept(CompletableFuture<? extends T> src,
                    Consumer<? super T> fn,
-                   CompletableFuture<Void> dst,
+                   CompletableFuture<?> dst,
                    Executor executor) {
             this.src = src; this.fn = fn; this.dst = dst;
             this.executor = executor;
@@ -709,7 +739,7 @@
         public final void run() {
             final CompletableFuture<? extends T> a;
             final Consumer<? super T> fn;
-            final CompletableFuture<Void> dst;
+            final CompletableFuture<?> dst;
             Object r; T t; Throwable ex;
             if ((dst = this.dst) != null &&
                 (fn = this.fn) != null &&
@@ -729,7 +759,7 @@
                 if (ex == null) {
                     try {
                         if (e != null)
-                            e.execute(new AsyncAccept<T>(t, fn, dst));
+                            execAsync(e, new AsyncAccept<T>(t, fn, dst));
                         else
                             fn.accept(t);
                     } catch (Throwable rex) {
@@ -773,7 +803,7 @@
                 if (ex == null) {
                     try {
                         if (e != null)
-                            e.execute(new AsyncRun(fn, dst));
+                            execAsync(e, new AsyncRun(fn, dst));
                         else
                             fn.run();
                     } catch (Throwable rex) {
@@ -839,7 +869,7 @@
                 if (ex == null) {
                     try {
                         if (e != null)
-                            e.execute(new AsyncCombine<T,U,V>(t, u, fn, dst));
+                            execAsync(e, new AsyncCombine<T,U,V>(t, u, fn, dst));
                         else
                             v = fn.apply(t, u);
                     } catch (Throwable rex) {
@@ -904,7 +934,7 @@
                 if (ex == null) {
                     try {
                         if (e != null)
-                            e.execute(new AsyncAcceptBoth<T,U>(t, u, fn, dst));
+                            execAsync(e, new AsyncAcceptBoth<T,U>(t, u, fn, dst));
                         else
                             fn.accept(t, u);
                     } catch (Throwable rex) {
@@ -956,7 +986,7 @@
                 if (ex == null) {
                     try {
                         if (e != null)
-                            e.execute(new AsyncRun(fn, dst));
+                            execAsync(e, new AsyncRun(fn, dst));
                         else
                             fn.run();
                     } catch (Throwable rex) {
@@ -1042,7 +1072,7 @@
                 if (ex == null) {
                     try {
                         if (e != null)
-                            e.execute(new AsyncApply<T,U>(t, fn, dst));
+                            execAsync(e, new AsyncApply<T,U>(t, fn, dst));
                         else
                             u = fn.apply(t);
                     } catch (Throwable rex) {
@@ -1095,7 +1125,7 @@
                 if (ex == null) {
                     try {
                         if (e != null)
-                            e.execute(new AsyncAccept<T>(t, fn, dst));
+                            execAsync(e, new AsyncAccept<T>(t, fn, dst));
                         else
                             fn.accept(t);
                     } catch (Throwable rex) {
@@ -1143,7 +1173,7 @@
                 if (ex == null) {
                     try {
                         if (e != null)
-                            e.execute(new AsyncRun(fn, dst));
+                            execAsync(e, new AsyncRun(fn, dst));
                         else
                             fn.run();
                     } catch (Throwable rex) {
@@ -1226,6 +1256,54 @@
         private static final long serialVersionUID = 5232453952276885070L;
     }
 
+    static final class WhenCompleteCompletion<T> extends Completion {
+        final CompletableFuture<? extends T> src;
+        final BiConsumer<? super T, ? super Throwable> fn;
+        final CompletableFuture<T> dst;
+        final Executor executor;
+        WhenCompleteCompletion(CompletableFuture<? extends T> src,
+                                  BiConsumer<? super T, ? super Throwable> fn,
+                                  CompletableFuture<T> dst,
+                                  Executor executor) {
+            this.src = src; this.fn = fn; this.dst = dst;
+            this.executor = executor;
+        }
+        public final void run() {
+            final CompletableFuture<? extends T> a;
+            final BiConsumer<? super T, ? super Throwable> fn;
+            final CompletableFuture<T> dst;
+            Object r; T t; Throwable ex;
+            if ((dst = this.dst) != null &&
+                (fn = this.fn) != null &&
+                (a = this.src) != null &&
+                (r = a.result) != null &&
+                compareAndSet(0, 1)) {
+                if (r instanceof AltResult) {
+                    ex = ((AltResult)r).ex;
+                    t = null;
+                }
+                else {
+                    ex = null;
+                    @SuppressWarnings("unchecked") T tr = (T) r;
+                    t = tr;
+                }
+                Executor e = executor;
+                Throwable dx = null;
+                try {
+                    if (e != null)
+                        execAsync(e, new AsyncWhenComplete<T>(t, ex, fn, dst));
+                    else
+                        fn.accept(t, ex);
+                } catch (Throwable rex) {
+                    dx = rex;
+                }
+                if (e == null || dx != null)
+                    dst.internalComplete(t, ex != null ? ex : dx);
+            }
+        }
+        private static final long serialVersionUID = 5232453952276885070L;
+    }
+
     static final class ThenCopy<T> extends Completion {
         final CompletableFuture<?> src;
         final CompletableFuture<T> dst;
@@ -1286,10 +1364,13 @@
         final CompletableFuture<? extends T> src;
         final BiFunction<? super T, Throwable, ? extends U> fn;
         final CompletableFuture<U> dst;
+        final Executor executor;
         HandleCompletion(CompletableFuture<? extends T> src,
                          BiFunction<? super T, Throwable, ? extends U> fn,
-                         CompletableFuture<U> dst) {
+                         CompletableFuture<U> dst,
+                          Executor executor) {
             this.src = src; this.fn = fn; this.dst = dst;
+            this.executor = executor;
         }
         public final void run() {
             final CompletableFuture<? extends T> a;
@@ -1310,13 +1391,19 @@
                     @SuppressWarnings("unchecked") T tr = (T) r;
                     t = tr;
                 }
-                U u = null; Throwable dx = null;
+                Executor e = executor;
+                U u = null;
+                Throwable dx = null;
                 try {
-                    u = fn.apply(t, ex);
+                    if (e != null)
+                        execAsync(e, new AsyncCombine<T,Throwable,U>(t, ex, fn, dst));
+                    else
+                        u = fn.apply(t, ex);
                 } catch (Throwable rex) {
                     dx = rex;
                 }
-                dst.internalComplete(u, dx);
+                if (e == null || dx != null)
+                    dst.internalComplete(u, dx);
             }
         }
         private static final long serialVersionUID = 5232453952276885070L;
@@ -1324,11 +1411,11 @@
 
     static final class ThenCompose<T,U> extends Completion {
         final CompletableFuture<? extends T> src;
-        final Function<? super T, CompletableFuture<U>> fn;
+        final Function<? super T, ? extends CompletionStage<U>> fn;
         final CompletableFuture<U> dst;
         final Executor executor;
         ThenCompose(CompletableFuture<? extends T> src,
-                    Function<? super T, CompletableFuture<U>> fn,
+                    Function<? super T, ? extends CompletionStage<U>> fn,
                     CompletableFuture<U> dst,
                     Executor executor) {
             this.src = src; this.fn = fn; this.dst = dst;
@@ -1336,7 +1423,7 @@
         }
         public final void run() {
             final CompletableFuture<? extends T> a;
-            final Function<? super T, CompletableFuture<U>> fn;
+            final Function<? super T, ? extends CompletionStage<U>> fn;
             final CompletableFuture<U> dst;
             Object r; T t; Throwable ex; Executor e;
             if ((dst = this.dst) != null &&
@@ -1358,10 +1445,12 @@
                 boolean complete = false;
                 if (ex == null) {
                     if ((e = executor) != null)
-                        e.execute(new AsyncCompose<T,U>(t, fn, dst));
+                        execAsync(e, new AsyncCompose<T,U>(t, fn, dst));
                     else {
                         try {
-                            if ((c = fn.apply(t)) == null)
+                            CompletionStage<U> cs = fn.apply(t);
+                            c = (cs == null) ? null : cs.toCompletableFuture();
+                            if (c == null)
                                 ex = new NullPointerException();
                         } catch (Throwable rex) {
                             ex = rex;
@@ -1401,6 +1490,619 @@
         private static final long serialVersionUID = 5232453952276885070L;
     }
 
+    // Implementations of stage methods with (plain, async, Executor) forms
+
+    private <U> CompletableFuture<U> doThenApply
+        (Function<? super T,? extends U> fn,
+         Executor e) {
+        if (fn == null) throw new NullPointerException();
+        CompletableFuture<U> dst = new CompletableFuture<U>();
+        ThenApply<T,U> d = null;
+        Object r;
+        if ((r = result) == null) {
+            CompletionNode p = new CompletionNode
+                (d = new ThenApply<T,U>(this, fn, dst, e));
+            while ((r = result) == null) {
+                if (UNSAFE.compareAndSwapObject
+                    (this, COMPLETIONS, p.next = completions, p))
+                    break;
+            }
+        }
+        if (r != null && (d == null || d.compareAndSet(0, 1))) {
+            T t; Throwable ex;
+            if (r instanceof AltResult) {
+                ex = ((AltResult)r).ex;
+                t = null;
+            }
+            else {
+                ex = null;
+                @SuppressWarnings("unchecked") T tr = (T) r;
+                t = tr;
+            }
+            U u = null;
+            if (ex == null) {
+                try {
+                    if (e != null)
+                        execAsync(e, new AsyncApply<T,U>(t, fn, dst));
+                    else
+                        u = fn.apply(t);
+                } catch (Throwable rex) {
+                    ex = rex;
+                }
+            }
+            if (e == null || ex != null)
+                dst.internalComplete(u, ex);
+        }
+        helpPostComplete();
+        return dst;
+    }
+
+    private CompletableFuture<Void> doThenAccept(Consumer<? super T> fn,
+                                                 Executor e) {
+        if (fn == null) throw new NullPointerException();
+        CompletableFuture<Void> dst = new CompletableFuture<Void>();
+        ThenAccept<T> d = null;
+        Object r;
+        if ((r = result) == null) {
+            CompletionNode p = new CompletionNode
+                (d = new ThenAccept<T>(this, fn, dst, e));
+            while ((r = result) == null) {
+                if (UNSAFE.compareAndSwapObject
+                    (this, COMPLETIONS, p.next = completions, p))
+                    break;
+            }
+        }
+        if (r != null && (d == null || d.compareAndSet(0, 1))) {
+            T t; Throwable ex;
+            if (r instanceof AltResult) {
+                ex = ((AltResult)r).ex;
+                t = null;
+            }
+            else {
+                ex = null;
+                @SuppressWarnings("unchecked") T tr = (T) r;
+                t = tr;
+            }
+            if (ex == null) {
+                try {
+                    if (e != null)
+                        execAsync(e, new AsyncAccept<T>(t, fn, dst));
+                    else
+                        fn.accept(t);
+                } catch (Throwable rex) {
+                    ex = rex;
+                }
+            }
+            if (e == null || ex != null)
+                dst.internalComplete(null, ex);
+        }
+        helpPostComplete();
+        return dst;
+    }
+
+    private CompletableFuture<Void> doThenRun(Runnable action,
+                                              Executor e) {
+        if (action == null) throw new NullPointerException();
+        CompletableFuture<Void> dst = new CompletableFuture<Void>();
+        ThenRun d = null;
+        Object r;
+        if ((r = result) == null) {
+            CompletionNode p = new CompletionNode
+                (d = new ThenRun(this, action, dst, e));
+            while ((r = result) == null) {
+                if (UNSAFE.compareAndSwapObject
+                    (this, COMPLETIONS, p.next = completions, p))
+                    break;
+            }
+        }
+        if (r != null && (d == null || d.compareAndSet(0, 1))) {
+            Throwable ex;
+            if (r instanceof AltResult)
+                ex = ((AltResult)r).ex;
+            else
+                ex = null;
+            if (ex == null) {
+                try {
+                    if (e != null)
+                        execAsync(e, new AsyncRun(action, dst));
+                    else
+                        action.run();
+                } catch (Throwable rex) {
+                    ex = rex;
+                }
+            }
+            if (e == null || ex != null)
+                dst.internalComplete(null, ex);
+        }
+        helpPostComplete();
+        return dst;
+    }
+
+    private <U,V> CompletableFuture<V> doThenCombine
+        (CompletableFuture<? extends U> other,
+         BiFunction<? super T,? super U,? extends V> fn,
+         Executor e) {
+        if (other == null || fn == null) throw new NullPointerException();
+        CompletableFuture<V> dst = new CompletableFuture<V>();
+        ThenCombine<T,U,V> d = null;
+        Object r, s = null;
+        if ((r = result) == null || (s = other.result) == null) {
+            d = new ThenCombine<T,U,V>(this, other, fn, dst, e);
+            CompletionNode q = null, p = new CompletionNode(d);
+            while ((r == null && (r = result) == null) ||
+                   (s == null && (s = other.result) == null)) {
+                if (q != null) {
+                    if (s != null ||
+                        UNSAFE.compareAndSwapObject
+                        (other, COMPLETIONS, q.next = other.completions, q))
+                        break;
+                }
+                else if (r != null ||
+                         UNSAFE.compareAndSwapObject
+                         (this, COMPLETIONS, p.next = completions, p)) {
+                    if (s != null)
+                        break;
+                    q = new CompletionNode(d);
+                }
+            }
+        }
+        if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) {
+            T t; U u; Throwable ex;
+            if (r instanceof AltResult) {
+                ex = ((AltResult)r).ex;
+                t = null;
+            }
+            else {
+                ex = null;
+                @SuppressWarnings("unchecked") T tr = (T) r;
+                t = tr;
+            }
+            if (ex != null)
+                u = null;
+            else if (s instanceof AltResult) {
+                ex = ((AltResult)s).ex;
+                u = null;
+            }
+            else {
+                @SuppressWarnings("unchecked") U us = (U) s;
+                u = us;
+            }
+            V v = null;
+            if (ex == null) {
+                try {
+                    if (e != null)
+                        execAsync(e, new AsyncCombine<T,U,V>(t, u, fn, dst));
+                    else
+                        v = fn.apply(t, u);
+                } catch (Throwable rex) {
+                    ex = rex;
+                }
+            }
+            if (e == null || ex != null)
+                dst.internalComplete(v, ex);
+        }
+        helpPostComplete();
+        other.helpPostComplete();
+        return dst;
+    }
+
+    private <U> CompletableFuture<Void> doThenAcceptBoth
+        (CompletableFuture<? extends U> other,
+         BiConsumer<? super T,? super U> fn,
+         Executor e) {
+        if (other == null || fn == null) throw new NullPointerException();
+        CompletableFuture<Void> dst = new CompletableFuture<Void>();
+        ThenAcceptBoth<T,U> d = null;
+        Object r, s = null;
+        if ((r = result) == null || (s = other.result) == null) {
+            d = new ThenAcceptBoth<T,U>(this, other, fn, dst, e);
+            CompletionNode q = null, p = new CompletionNode(d);
+            while ((r == null && (r = result) == null) ||
+                   (s == null && (s = other.result) == null)) {
+                if (q != null) {
+                    if (s != null ||
+                        UNSAFE.compareAndSwapObject
+                        (other, COMPLETIONS, q.next = other.completions, q))
+                        break;
+                }
+                else if (r != null ||
+                         UNSAFE.compareAndSwapObject
+                         (this, COMPLETIONS, p.next = completions, p)) {
+                    if (s != null)
+                        break;
+                    q = new CompletionNode(d);
+                }
+            }
+        }
+        if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) {
+            T t; U u; Throwable ex;
+            if (r instanceof AltResult) {
+                ex = ((AltResult)r).ex;
+                t = null;
+            }
+            else {
+                ex = null;
+                @SuppressWarnings("unchecked") T tr = (T) r;
+                t = tr;
+            }
+            if (ex != null)
+                u = null;
+            else if (s instanceof AltResult) {
+                ex = ((AltResult)s).ex;
+                u = null;
+            }
+            else {
+                @SuppressWarnings("unchecked") U us = (U) s;
+                u = us;
+            }
+            if (ex == null) {
+                try {
+                    if (e != null)
+                        execAsync(e, new AsyncAcceptBoth<T,U>(t, u, fn, dst));
+                    else
+                        fn.accept(t, u);
+                } catch (Throwable rex) {
+                    ex = rex;
+                }
+            }
+            if (e == null || ex != null)
+                dst.internalComplete(null, ex);
+        }
+        helpPostComplete();
+        other.helpPostComplete();
+        return dst;
+    }
+
+    private CompletableFuture<Void> doRunAfterBoth(CompletableFuture<?> other,
+                                                   Runnable action,
+                                                   Executor e) {
+        if (other == null || action == null) throw new NullPointerException();
+        CompletableFuture<Void> dst = new CompletableFuture<Void>();
+        RunAfterBoth d = null;
+        Object r, s = null;
+        if ((r = result) == null || (s = other.result) == null) {
+            d = new RunAfterBoth(this, other, action, dst, e);
+            CompletionNode q = null, p = new CompletionNode(d);
+            while ((r == null && (r = result) == null) ||
+                   (s == null && (s = other.result) == null)) {
+                if (q != null) {
+                    if (s != null ||
+                        UNSAFE.compareAndSwapObject
+                        (other, COMPLETIONS, q.next = other.completions, q))
+                        break;
+                }
+                else if (r != null ||
+                         UNSAFE.compareAndSwapObject
+                         (this, COMPLETIONS, p.next = completions, p)) {
+                    if (s != null)
+                        break;
+                    q = new CompletionNode(d);
+                }
+            }
+        }
+        if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) {
+            Throwable ex;
+            if (r instanceof AltResult)
+                ex = ((AltResult)r).ex;
+            else
+                ex = null;
+            if (ex == null && (s instanceof AltResult))
+                ex = ((AltResult)s).ex;
+            if (ex == null) {
+                try {
+                    if (e != null)
+                        execAsync(e, new AsyncRun(action, dst));
+                    else
+                        action.run();
+                } catch (Throwable rex) {
+                    ex = rex;
+                }
+            }
+            if (e == null || ex != null)
+                dst.internalComplete(null, ex);
+        }
+        helpPostComplete();
+        other.helpPostComplete();
+        return dst;
+    }
+
+    private <U> CompletableFuture<U> doApplyToEither
+        (CompletableFuture<? extends T> other,
+         Function<? super T, U> fn,
+         Executor e) {
+        if (other == null || fn == null) throw new NullPointerException();
+        CompletableFuture<U> dst = new CompletableFuture<U>();
+        ApplyToEither<T,U> d = null;
+        Object r;
+        if ((r = result) == null && (r = other.result) == null) {
+            d = new ApplyToEither<T,U>(this, other, fn, dst, e);
+            CompletionNode q = null, p = new CompletionNode(d);
+            while ((r = result) == null && (r = other.result) == null) {
+                if (q != null) {
+                    if (UNSAFE.compareAndSwapObject
+                        (other, COMPLETIONS, q.next = other.completions, q))
+                        break;
+                }
+                else if (UNSAFE.compareAndSwapObject
+                         (this, COMPLETIONS, p.next = completions, p))
+                    q = new CompletionNode(d);
+            }
+        }
+        if (r != null && (d == null || d.compareAndSet(0, 1))) {
+            T t; Throwable ex;
+            if (r instanceof AltResult) {
+                ex = ((AltResult)r).ex;
+                t = null;
+            }
+            else {
+                ex = null;
+                @SuppressWarnings("unchecked") T tr = (T) r;
+                t = tr;
+            }
+            U u = null;
+            if (ex == null) {
+                try {
+                    if (e != null)
+                        execAsync(e, new AsyncApply<T,U>(t, fn, dst));
+                    else
+                        u = fn.apply(t);
+                } catch (Throwable rex) {
+                    ex = rex;
+                }
+            }
+            if (e == null || ex != null)
+                dst.internalComplete(u, ex);
+        }
+        helpPostComplete();
+        other.helpPostComplete();
+        return dst;
+    }
+
+    private CompletableFuture<Void> doAcceptEither
+        (CompletableFuture<? extends T> other,
+         Consumer<? super T> fn,
+         Executor e) {
+        if (other == null || fn == null) throw new NullPointerException();
+        CompletableFuture<Void> dst = new CompletableFuture<Void>();
+        AcceptEither<T> d = null;
+        Object r;
+        if ((r = result) == null && (r = other.result) == null) {
+            d = new AcceptEither<T>(this, other, fn, dst, e);
+            CompletionNode q = null, p = new CompletionNode(d);
+            while ((r = result) == null && (r = other.result) == null) {
+                if (q != null) {
+                    if (UNSAFE.compareAndSwapObject
+                        (other, COMPLETIONS, q.next = other.completions, q))
+                        break;
+                }
+                else if (UNSAFE.compareAndSwapObject
+                         (this, COMPLETIONS, p.next = completions, p))
+                    q = new CompletionNode(d);
+            }
+        }
+        if (r != null && (d == null || d.compareAndSet(0, 1))) {
+            T t; Throwable ex;
+            if (r instanceof AltResult) {
+                ex = ((AltResult)r).ex;
+                t = null;
+            }
+            else {
+                ex = null;
+                @SuppressWarnings("unchecked") T tr = (T) r;
+                t = tr;
+            }
+            if (ex == null) {
+                try {
+                    if (e != null)
+                        execAsync(e, new AsyncAccept<T>(t, fn, dst));
+                    else
+                        fn.accept(t);
+                } catch (Throwable rex) {
+                    ex = rex;
+                }
+            }
+            if (e == null || ex != null)
+                dst.internalComplete(null, ex);
+        }
+        helpPostComplete();
+        other.helpPostComplete();
+        return dst;
+    }
+
+    private CompletableFuture<Void> doRunAfterEither
+        (CompletableFuture<?> other,
+         Runnable action,
+         Executor e) {
+        if (other == null || action == null) throw new NullPointerException();
+        CompletableFuture<Void> dst = new CompletableFuture<Void>();
+        RunAfterEither d = null;
+        Object r;
+        if ((r = result) == null && (r = other.result) == null) {
+            d = new RunAfterEither(this, other, action, dst, e);
+            CompletionNode q = null, p = new CompletionNode(d);
+            while ((r = result) == null && (r = other.result) == null) {
+                if (q != null) {
+                    if (UNSAFE.compareAndSwapObject
+                        (other, COMPLETIONS, q.next = other.completions, q))
+                        break;
+                }
+                else if (UNSAFE.compareAndSwapObject
+                         (this, COMPLETIONS, p.next = completions, p))
+                    q = new CompletionNode(d);
+            }
+        }
+        if (r != null && (d == null || d.compareAndSet(0, 1))) {
+            Throwable ex;
+            if (r instanceof AltResult)
+                ex = ((AltResult)r).ex;
+            else
+                ex = null;
+            if (ex == null) {
+                try {
+                    if (e != null)
+                        execAsync(e, new AsyncRun(action, dst));
+                    else
+                        action.run();
+                } catch (Throwable rex) {
+                    ex = rex;
+                }
+            }
+            if (e == null || ex != null)
+                dst.internalComplete(null, ex);
+        }
+        helpPostComplete();
+        other.helpPostComplete();
+        return dst;
+    }
+
+    private <U> CompletableFuture<U> doThenCompose
+        (Function<? super T, ? extends CompletionStage<U>> fn,
+         Executor e) {
+        if (fn == null) throw new NullPointerException();
+        CompletableFuture<U> dst = null;
+        ThenCompose<T,U> d = null;
+        Object r;
+        if ((r = result) == null) {
+            dst = new CompletableFuture<U>();
+            CompletionNode p = new CompletionNode
+                (d = new ThenCompose<T,U>(this, fn, dst, e));
+            while ((r = result) == null) {
+                if (UNSAFE.compareAndSwapObject
+                    (this, COMPLETIONS, p.next = completions, p))
+                    break;
+            }
+        }
+        if (r != null && (d == null || d.compareAndSet(0, 1))) {
+            T t; Throwable ex;
+            if (r instanceof AltResult) {
+                ex = ((AltResult)r).ex;
+                t = null;
+            }
+            else {
+                ex = null;
+                @SuppressWarnings("unchecked") T tr = (T) r;
+                t = tr;
+            }
+            if (ex == null) {
+                if (e != null) {
+                    if (dst == null)
+                        dst = new CompletableFuture<U>();
+                    execAsync(e, new AsyncCompose<T,U>(t, fn, dst));
+                }
+                else {
+                    try {
+                        CompletionStage<U> cs = fn.apply(t);
+                        if (cs == null ||
+                            (dst = cs.toCompletableFuture()) == null)
+                            ex = new NullPointerException();
+                    } catch (Throwable rex) {
+                        ex = rex;
+                    }
+                }
+            }
+            if (dst == null)
+                dst = new CompletableFuture<U>();
+            if (e == null || ex != null)
+                dst.internalComplete(null, ex);
+        }
+        helpPostComplete();
+        dst.helpPostComplete();
+        return dst;
+    }
+
+    private CompletableFuture<T> doWhenComplete
+        (BiConsumer<? super T, ? super Throwable> fn,
+         Executor e) {
+        if (fn == null) throw new NullPointerException();
+        CompletableFuture<T> dst = new CompletableFuture<T>();
+        WhenCompleteCompletion<T> d = null;
+        Object r;
+        if ((r = result) == null) {
+            CompletionNode p =
+                new CompletionNode(d = new WhenCompleteCompletion<T>
+                                   (this, fn, dst, e));
+            while ((r = result) == null) {
+                if (UNSAFE.compareAndSwapObject(this, COMPLETIONS,
+                                                p.next = completions, p))
+                    break;
+            }
+        }
+        if (r != null && (d == null || d.compareAndSet(0, 1))) {
+            T t; Throwable ex;
+            if (r instanceof AltResult) {
+                ex = ((AltResult)r).ex;
+                t = null;
+            }
+            else {
+                ex = null;
+                @SuppressWarnings("unchecked") T tr = (T) r;
+                t = tr;
+            }
+            Throwable dx = null;
+            try {
+                if (e != null)
+                    execAsync(e, new AsyncWhenComplete<T>(t, ex, fn, dst));
+                else
+                    fn.accept(t, ex);
+            } catch (Throwable rex) {
+                dx = rex;
+            }
+            if (e == null || dx != null)
+                dst.internalComplete(t, ex != null ? ex : dx);
+        }
+        helpPostComplete();
+        return dst;
+    }
+
+    private <U> CompletableFuture<U> doHandle
+        (BiFunction<? super T, Throwable, ? extends U> fn,
+         Executor e) {
+        if (fn == null) throw new NullPointerException();
+        CompletableFuture<U> dst = new CompletableFuture<U>();
+        HandleCompletion<T,U> d = null;
+        Object r;
+        if ((r = result) == null) {
+            CompletionNode p =
+                new CompletionNode(d = new HandleCompletion<T,U>
+                                   (this, fn, dst, e));
+            while ((r = result) == null) {
+                if (UNSAFE.compareAndSwapObject(this, COMPLETIONS,
+                                                p.next = completions, p))
+                    break;
+            }
+        }
+        if (r != null && (d == null || d.compareAndSet(0, 1))) {
+            T t; Throwable ex;
+            if (r instanceof AltResult) {
+                ex = ((AltResult)r).ex;
+                t = null;
+            }
+            else {
+                ex = null;
+                @SuppressWarnings("unchecked") T tr = (T) r;
+                t = tr;
+            }
+            U u = null;
+            Throwable dx = null;
+            try {
+                if (e != null)
+                    execAsync(e, new AsyncCombine<T,Throwable,U>(t, ex, fn, dst));
+                else {
+                    u = fn.apply(t, ex);
+                    dx = null;
+                }
+            } catch (Throwable rex) {
+                dx = rex;
+                u = null;
+            }
+            if (e == null || dx != null)
+                dst.internalComplete(u, dx);
+        }
+        helpPostComplete();
+        return dst;
+    }
+
+
     // public methods
 
     /**
@@ -1416,13 +2118,13 @@
      *
      * @param supplier a function returning the value to be used
      * to complete the returned CompletableFuture
+     * @param <U> the function's return type
      * @return the new CompletableFuture
      */
     public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
         if (supplier == null) throw new NullPointerException();
         CompletableFuture<U> f = new CompletableFuture<U>();
-        ForkJoinPool.commonPool().
-            execute((ForkJoinTask<?>)new AsyncSupply<U>(supplier, f));
+        execAsync(ForkJoinPool.commonPool(), new AsyncSupply<U>(supplier, f));
         return f;
     }
 
@@ -1434,6 +2136,7 @@
      * @param supplier a function returning the value to be used
      * to complete the returned CompletableFuture
      * @param executor the executor to use for asynchronous execution
+     * @param <U> the function's return type
      * @return the new CompletableFuture
      */
     public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,
@@ -1441,7 +2144,7 @@
         if (executor == null || supplier == null)
             throw new NullPointerException();
         CompletableFuture<U> f = new CompletableFuture<U>();
-        executor.execute(new AsyncSupply<U>(supplier, f));
+        execAsync(executor, new AsyncSupply<U>(supplier, f));
         return f;
     }
 
@@ -1457,8 +2160,7 @@
     public static CompletableFuture<Void> runAsync(Runnable runnable) {
         if (runnable == null) throw new NullPointerException();
         CompletableFuture<Void> f = new CompletableFuture<Void>();
-        ForkJoinPool.commonPool().
-            execute((ForkJoinTask<?>)new AsyncRun(runnable, f));
+        execAsync(ForkJoinPool.commonPool(), new AsyncRun(runnable, f));
         return f;
     }
 
@@ -1477,7 +2179,7 @@
         if (executor == null || runnable == null)
             throw new NullPointerException();
         CompletableFuture<Void> f = new CompletableFuture<Void>();
-        executor.execute(new AsyncRun(runnable, f));
+        execAsync(executor, new AsyncRun(runnable, f));
         return f;
     }
 
@@ -1486,6 +2188,7 @@
      * the given value.
      *
      * @param value the value
+     * @param <U> the type of the value
      * @return the completed CompletableFuture
      */
     public static <U> CompletableFuture<U> completedFuture(U value) {
@@ -1657,60 +2360,18 @@
         return triggered;
     }
 
-    /**
-     * Returns a new CompletableFuture that is completed
-     * when this CompletableFuture completes, with the result of the
-     * given function of this CompletableFuture's result.
-     *
-     * <p>If this CompletableFuture completes exceptionally, or the
-     * supplied function throws an exception, then the returned
-     * CompletableFuture completes exceptionally with a
-     * CompletionException holding the exception as its cause.
-     *
-     * @param fn the function to use to compute the value of
-     * the returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public <U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn) {
+    // CompletionStage methods
+
+    public <U> CompletableFuture<U> thenApply
+        (Function<? super T,? extends U> fn) {
         return doThenApply(fn, null);
     }
 
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when this CompletableFuture completes, with the result of the
-     * given function of this CompletableFuture's result from a
-     * task running in the {@link ForkJoinPool#commonPool()}.
-     *
-     * <p>If this CompletableFuture completes exceptionally, or the
-     * supplied function throws an exception, then the returned
-     * CompletableFuture completes exceptionally with a
-     * CompletionException holding the exception as its cause.
-     *
-     * @param fn the function to use to compute the value of
-     * the returned CompletableFuture
-     * @return the new CompletableFuture
-     */
     public <U> CompletableFuture<U> thenApplyAsync
         (Function<? super T,? extends U> fn) {
         return doThenApply(fn, ForkJoinPool.commonPool());
     }
 
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when this CompletableFuture completes, with the result of the
-     * given function of this CompletableFuture's result from a
-     * task running in the given executor.
-     *
-     * <p>If this CompletableFuture completes exceptionally, or the
-     * supplied function throws an exception, then the returned
-     * CompletableFuture completes exceptionally with a
-     * CompletionException holding the exception as its cause.
-     *
-     * @param fn the function to use to compute the value of
-     * the returned CompletableFuture
-     * @param executor the executor to use for asynchronous execution
-     * @return the new CompletableFuture
-     */
     public <U> CompletableFuture<U> thenApplyAsync
         (Function<? super T,? extends U> fn,
          Executor executor) {
@@ -1718,1149 +2379,228 @@
         return doThenApply(fn, executor);
     }
 
-    private <U> CompletableFuture<U> doThenApply
-        (Function<? super T,? extends U> fn,
-         Executor e) {
-        if (fn == null) throw new NullPointerException();
-        CompletableFuture<U> dst = new CompletableFuture<U>();
-        ThenApply<T,U> d = null;
-        Object r;
-        if ((r = result) == null) {
-            CompletionNode p = new CompletionNode
-                (d = new ThenApply<T,U>(this, fn, dst, e));
-            while ((r = result) == null) {
-                if (UNSAFE.compareAndSwapObject
-                    (this, COMPLETIONS, p.next = completions, p))
-                    break;
-            }
-        }
-        if (r != null && (d == null || d.compareAndSet(0, 1))) {
-            T t; Throwable ex;
-            if (r instanceof AltResult) {
-                ex = ((AltResult)r).ex;
-                t = null;
-            }
-            else {
-                ex = null;
-                @SuppressWarnings("unchecked") T tr = (T) r;
-                t = tr;
-            }
-            U u = null;
-            if (ex == null) {
-                try {
-                    if (e != null)
-                        e.execute(new AsyncApply<T,U>(t, fn, dst));
-                    else
-                        u = fn.apply(t);
-                } catch (Throwable rex) {
-                    ex = rex;
-                }
-            }
-            if (e == null || ex != null)
-                dst.internalComplete(u, ex);
-        }
-        helpPostComplete();
-        return dst;
+    public CompletableFuture<Void> thenAccept
+        (Consumer<? super T> action) {
+        return doThenAccept(action, null);
     }
 
-    /**
-     * Returns a new CompletableFuture that is completed
-     * when this CompletableFuture completes, after performing the given
-     * action with this CompletableFuture's result.
-     *
-     * <p>If this CompletableFuture completes exceptionally, or the
-     * supplied action throws an exception, then the returned
-     * CompletableFuture completes exceptionally with a
-     * CompletionException holding the exception as its cause.
-     *
-     * @param block the action to perform before completing the
-     * returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public CompletableFuture<Void> thenAccept(Consumer<? super T> block) {
-        return doThenAccept(block, null);
+    public CompletableFuture<Void> thenAcceptAsync
+        (Consumer<? super T> action) {
+        return doThenAccept(action, ForkJoinPool.commonPool());
     }
 
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when this CompletableFuture completes, after performing the given
-     * action with this CompletableFuture's result from a task running
-     * in the {@link ForkJoinPool#commonPool()}.
-     *
-     * <p>If this CompletableFuture completes exceptionally, or the
-     * supplied action throws an exception, then the returned
-     * CompletableFuture completes exceptionally with a
-     * CompletionException holding the exception as its cause.
-     *
-     * @param block the action to perform before completing the
-     * returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public CompletableFuture<Void> thenAcceptAsync(Consumer<? super T> block) {
-        return doThenAccept(block, ForkJoinPool.commonPool());
-    }
-
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when this CompletableFuture completes, after performing the given
-     * action with this CompletableFuture's result from a task running
-     * in the given executor.
-     *
-     * <p>If this CompletableFuture completes exceptionally, or the
-     * supplied action throws an exception, then the returned
-     * CompletableFuture completes exceptionally with a
-     * CompletionException holding the exception as its cause.
-     *
-     * @param block the action to perform before completing the
-     * returned CompletableFuture
-     * @param executor the executor to use for asynchronous execution
-     * @return the new CompletableFuture
-     */
-    public CompletableFuture<Void> thenAcceptAsync(Consumer<? super T> block,
-                                                   Executor executor) {
+    public CompletableFuture<Void> thenAcceptAsync
+        (Consumer<? super T> action,
+         Executor executor) {
         if (executor == null) throw new NullPointerException();
-        return doThenAccept(block, executor);
+        return doThenAccept(action, executor);
     }
 
-    private CompletableFuture<Void> doThenAccept(Consumer<? super T> fn,
-                                                 Executor e) {
-        if (fn == null) throw new NullPointerException();
-        CompletableFuture<Void> dst = new CompletableFuture<Void>();
-        ThenAccept<T> d = null;
-        Object r;
-        if ((r = result) == null) {
-            CompletionNode p = new CompletionNode
-                (d = new ThenAccept<T>(this, fn, dst, e));
-            while ((r = result) == null) {
-                if (UNSAFE.compareAndSwapObject
-                    (this, COMPLETIONS, p.next = completions, p))
-                    break;
-            }
-        }
-        if (r != null && (d == null || d.compareAndSet(0, 1))) {
-            T t; Throwable ex;
-            if (r instanceof AltResult) {
-                ex = ((AltResult)r).ex;
-                t = null;
-            }
-            else {
-                ex = null;
-                @SuppressWarnings("unchecked") T tr = (T) r;
-                t = tr;
-            }
-            if (ex == null) {
-                try {
-                    if (e != null)
-                        e.execute(new AsyncAccept<T>(t, fn, dst));
-                    else
-                        fn.accept(t);
-                } catch (Throwable rex) {
-                    ex = rex;
-                }
-            }
-            if (e == null || ex != null)
-                dst.internalComplete(null, ex);
-        }
-        helpPostComplete();
-        return dst;
-    }
-
-    /**
-     * Returns a new CompletableFuture that is completed
-     * when this CompletableFuture completes, after performing the given
-     * action.
-     *
-     * <p>If this CompletableFuture completes exceptionally, or the
-     * supplied action throws an exception, then the returned
-     * CompletableFuture completes exceptionally with a
-     * CompletionException holding the exception as its cause.
-     *
-     * @param action the action to perform before completing the
-     * returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public CompletableFuture<Void> thenRun(Runnable action) {
+    public CompletableFuture<Void> thenRun
+        (Runnable action) {
         return doThenRun(action, null);
     }
 
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when this CompletableFuture completes, after performing the given
-     * action from a task running in the {@link ForkJoinPool#commonPool()}.
-     *
-     * <p>If this CompletableFuture completes exceptionally, or the
-     * supplied action throws an exception, then the returned
-     * CompletableFuture completes exceptionally with a
-     * CompletionException holding the exception as its cause.
-     *
-     * @param action the action to perform before completing the
-     * returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public CompletableFuture<Void> thenRunAsync(Runnable action) {
+    public CompletableFuture<Void> thenRunAsync
+        (Runnable action) {
         return doThenRun(action, ForkJoinPool.commonPool());
     }
 
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when this CompletableFuture completes, after performing the given
-     * action from a task running in the given executor.
-     *
-     * <p>If this CompletableFuture completes exceptionally, or the
-     * supplied action throws an exception, then the returned
-     * CompletableFuture completes exceptionally with a
-     * CompletionException holding the exception as its cause.
-     *
-     * @param action the action to perform before completing the
-     * returned CompletableFuture
-     * @param executor the executor to use for asynchronous execution
-     * @return the new CompletableFuture
-     */
-    public CompletableFuture<Void> thenRunAsync(Runnable action,
-                                                Executor executor) {
+    public CompletableFuture<Void> thenRunAsync
+        (Runnable action,
+         Executor executor) {
         if (executor == null) throw new NullPointerException();
         return doThenRun(action, executor);
     }
 
-    private CompletableFuture<Void> doThenRun(Runnable action,
-                                              Executor e) {
-        if (action == null) throw new NullPointerException();
-        CompletableFuture<Void> dst = new CompletableFuture<Void>();
-        ThenRun d = null;
-        Object r;
-        if ((r = result) == null) {
-            CompletionNode p = new CompletionNode
-                (d = new ThenRun(this, action, dst, e));
-            while ((r = result) == null) {
-                if (UNSAFE.compareAndSwapObject
-                    (this, COMPLETIONS, p.next = completions, p))
-                    break;
-            }
-        }
-        if (r != null && (d == null || d.compareAndSet(0, 1))) {
-            Throwable ex;
-            if (r instanceof AltResult)
-                ex = ((AltResult)r).ex;
-            else
-                ex = null;
-            if (ex == null) {
-                try {
-                    if (e != null)
-                        e.execute(new AsyncRun(action, dst));
-                    else
-                        action.run();
-                } catch (Throwable rex) {
-                    ex = rex;
-                }
-            }
-            if (e == null || ex != null)
-                dst.internalComplete(null, ex);
-        }
-        helpPostComplete();
-        return dst;
+    public <U,V> CompletableFuture<V> thenCombine
+        (CompletionStage<? extends U> other,
+         BiFunction<? super T,? super U,? extends V> fn) {
+        return doThenCombine(other.toCompletableFuture(), fn, null);
     }
 
-    /**
-     * Returns a new CompletableFuture that is completed
-     * when both this and the other given CompletableFuture complete,
-     * with the result of the given function of the results of the two
-     * CompletableFutures.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, or the supplied function throws an exception,
-     * then the returned CompletableFuture completes exceptionally
-     * with a CompletionException holding the exception as its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param fn the function to use to compute the value of
-     * the returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public <U,V> CompletableFuture<V> thenCombine
-        (CompletableFuture<? extends U> other,
+    public <U,V> CompletableFuture<V> thenCombineAsync
+        (CompletionStage<? extends U> other,
          BiFunction<? super T,? super U,? extends V> fn) {
-        return doThenCombine(other, fn, null);
+        return doThenCombine(other.toCompletableFuture(), fn,
+                             ForkJoinPool.commonPool());
     }
 
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when both this and the other given CompletableFuture complete,
-     * with the result of the given function of the results of the two
-     * CompletableFutures from a task running in the
-     * {@link ForkJoinPool#commonPool()}.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, or the supplied function throws an exception,
-     * then the returned CompletableFuture completes exceptionally
-     * with a CompletionException holding the exception as its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param fn the function to use to compute the value of
-     * the returned CompletableFuture
-     * @return the new CompletableFuture
-     */
     public <U,V> CompletableFuture<V> thenCombineAsync
-        (CompletableFuture<? extends U> other,
-         BiFunction<? super T,? super U,? extends V> fn) {
-        return doThenCombine(other, fn, ForkJoinPool.commonPool());
-    }
-
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when both this and the other given CompletableFuture complete,
-     * with the result of the given function of the results of the two
-     * CompletableFutures from a task running in the given executor.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, or the supplied function throws an exception,
-     * then the returned CompletableFuture completes exceptionally
-     * with a CompletionException holding the exception as its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param fn the function to use to compute the value of
-     * the returned CompletableFuture
-     * @param executor the executor to use for asynchronous execution
-     * @return the new CompletableFuture
-     */
-    public <U,V> CompletableFuture<V> thenCombineAsync
-        (CompletableFuture<? extends U> other,
+        (CompletionStage<? extends U> other,
          BiFunction<? super T,? super U,? extends V> fn,
          Executor executor) {
         if (executor == null) throw new NullPointerException();
-        return doThenCombine(other, fn, executor);
+        return doThenCombine(other.toCompletableFuture(), fn, executor);
+    }
+
+    public <U> CompletableFuture<Void> thenAcceptBoth
+        (CompletionStage<? extends U> other,
+         BiConsumer<? super T, ? super U> action) {
+        return doThenAcceptBoth(other.toCompletableFuture(), action, null);
     }
 
-    private <U,V> CompletableFuture<V> doThenCombine
-        (CompletableFuture<? extends U> other,
-         BiFunction<? super T,? super U,? extends V> fn,
-         Executor e) {
-        if (other == null || fn == null) throw new NullPointerException();
-        CompletableFuture<V> dst = new CompletableFuture<V>();
-        ThenCombine<T,U,V> d = null;
-        Object r, s = null;
-        if ((r = result) == null || (s = other.result) == null) {
-            d = new ThenCombine<T,U,V>(this, other, fn, dst, e);
-            CompletionNode q = null, p = new CompletionNode(d);
-            while ((r == null && (r = result) == null) ||
-                   (s == null && (s = other.result) == null)) {
-                if (q != null) {
-                    if (s != null ||
-                        UNSAFE.compareAndSwapObject
-                        (other, COMPLETIONS, q.next = other.completions, q))
-                        break;
-                }
-                else if (r != null ||
-                         UNSAFE.compareAndSwapObject
-                         (this, COMPLETIONS, p.next = completions, p)) {
-                    if (s != null)
-                        break;
-                    q = new CompletionNode(d);
-                }
-            }
-        }
-        if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) {
-            T t; U u; Throwable ex;
-            if (r instanceof AltResult) {
-                ex = ((AltResult)r).ex;
-                t = null;
-            }
-            else {
-                ex = null;
-                @SuppressWarnings("unchecked") T tr = (T) r;
-                t = tr;
-            }
-            if (ex != null)
-                u = null;
-            else if (s instanceof AltResult) {
-                ex = ((AltResult)s).ex;
-                u = null;
-            }
-            else {
-                @SuppressWarnings("unchecked") U us = (U) s;
-                u = us;
-            }
-            V v = null;
-            if (ex == null) {
-                try {
-                    if (e != null)
-                        e.execute(new AsyncCombine<T,U,V>(t, u, fn, dst));
-                    else
-                        v = fn.apply(t, u);
-                } catch (Throwable rex) {
-                    ex = rex;
-                }
-            }
-            if (e == null || ex != null)
-                dst.internalComplete(v, ex);
-        }
-        helpPostComplete();
-        other.helpPostComplete();
-        return dst;
+    public <U> CompletableFuture<Void> thenAcceptBothAsync
+        (CompletionStage<? extends U> other,
+         BiConsumer<? super T, ? super U> action) {
+        return doThenAcceptBoth(other.toCompletableFuture(), action,
+                                ForkJoinPool.commonPool());
     }
 
-    /**
-     * Returns a new CompletableFuture that is completed
-     * when both this and the other given CompletableFuture complete,
-     * after performing the given action with the results of the two
-     * CompletableFutures.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, or the supplied action throws an exception,
-     * then the returned CompletableFuture completes exceptionally
-     * with a CompletionException holding the exception as its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param block the action to perform before completing the
-     * returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public <U> CompletableFuture<Void> thenAcceptBoth
-        (CompletableFuture<? extends U> other,
-         BiConsumer<? super T, ? super U> block) {
-        return doThenAcceptBoth(other, block, null);
+    public <U> CompletableFuture<Void> thenAcceptBothAsync
+        (CompletionStage<? extends U> other,
+         BiConsumer<? super T, ? super U> action,
+         Executor executor) {
+        if (executor == null) throw new NullPointerException();
+        return doThenAcceptBoth(other.toCompletableFuture(), action, executor);
     }
 
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when both this and the other given CompletableFuture complete,
-     * after performing the given action with the results of the two
-     * CompletableFutures from a task running in the {@link
-     * ForkJoinPool#commonPool()}.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, or the supplied action throws an exception,
-     * then the returned CompletableFuture completes exceptionally
-     * with a CompletionException holding the exception as its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param block the action to perform before completing the
-     * returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public <U> CompletableFuture<Void> thenAcceptBothAsync
-        (CompletableFuture<? extends U> other,
-         BiConsumer<? super T, ? super U> block) {
-        return doThenAcceptBoth(other, block, ForkJoinPool.commonPool());
-    }
-
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when both this and the other given CompletableFuture complete,
-     * after performing the given action with the results of the two
-     * CompletableFutures from a task running in the given executor.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, or the supplied action throws an exception,
-     * then the returned CompletableFuture completes exceptionally
-     * with a CompletionException holding the exception as its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param block the action to perform before completing the
-     * returned CompletableFuture
-     * @param executor the executor to use for asynchronous execution
-     * @return the new CompletableFuture
-     */
-    public <U> CompletableFuture<Void> thenAcceptBothAsync
-        (CompletableFuture<? extends U> other,
-         BiConsumer<? super T, ? super U> block,
-         Executor executor) {
-        if (executor == null) throw new NullPointerException();
-        return doThenAcceptBoth(other, block, executor);
+    public CompletableFuture<Void> runAfterBoth
+        (CompletionStage<?> other,
+         Runnable action) {
+        return doRunAfterBoth(other.toCompletableFuture(), action, null);
     }
 
-    private <U> CompletableFuture<Void> doThenAcceptBoth
-        (CompletableFuture<? extends U> other,
-         BiConsumer<? super T,? super U> fn,
-         Executor e) {
-        if (other == null || fn == null) throw new NullPointerException();
-        CompletableFuture<Void> dst = new CompletableFuture<Void>();
-        ThenAcceptBoth<T,U> d = null;
-        Object r, s = null;
-        if ((r = result) == null || (s = other.result) == null) {
-            d = new ThenAcceptBoth<T,U>(this, other, fn, dst, e);
-            CompletionNode q = null, p = new CompletionNode(d);
-            while ((r == null && (r = result) == null) ||
-                   (s == null && (s = other.result) == null)) {
-                if (q != null) {
-                    if (s != null ||
-                        UNSAFE.compareAndSwapObject
-                        (other, COMPLETIONS, q.next = other.completions, q))
-                        break;
-                }
-                else if (r != null ||
-                         UNSAFE.compareAndSwapObject
-                         (this, COMPLETIONS, p.next = completions, p)) {
-                    if (s != null)
-                        break;
-                    q = new CompletionNode(d);
-                }
-            }
-        }
-        if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) {
-            T t; U u; Throwable ex;
-            if (r instanceof AltResult) {
-                ex = ((AltResult)r).ex;
-                t = null;
-            }
-            else {
-                ex = null;
-                @SuppressWarnings("unchecked") T tr = (T) r;
-                t = tr;
-            }
-            if (ex != null)
-                u = null;
-            else if (s instanceof AltResult) {
-                ex = ((AltResult)s).ex;
-                u = null;
-            }
-            else {
-                @SuppressWarnings("unchecked") U us = (U) s;
-                u = us;
-            }
-            if (ex == null) {
-                try {
-                    if (e != null)
-                        e.execute(new AsyncAcceptBoth<T,U>(t, u, fn, dst));
-                    else
-                        fn.accept(t, u);
-                } catch (Throwable rex) {
-                    ex = rex;
-                }
-            }
-            if (e == null || ex != null)
-                dst.internalComplete(null, ex);
-        }
-        helpPostComplete();
-        other.helpPostComplete();
-        return dst;
+    public CompletableFuture<Void> runAfterBothAsync
+        (CompletionStage<?> other,
+         Runnable action) {
+        return doRunAfterBoth(other.toCompletableFuture(), action,
+                              ForkJoinPool.commonPool());
     }
 
-    /**
-     * Returns a new CompletableFuture that is completed
-     * when both this and the other given CompletableFuture complete,
-     * after performing the given action.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, or the supplied action throws an exception,
-     * then the returned CompletableFuture completes exceptionally
-     * with a CompletionException holding the exception as its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param action the action to perform before completing the
-     * returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public CompletableFuture<Void> runAfterBoth(CompletableFuture<?> other,
-                                                Runnable action) {
-        return doRunAfterBoth(other, action, null);
-    }
-
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when both this and the other given CompletableFuture complete,
-     * after performing the given action from a task running in the
-     * {@link ForkJoinPool#commonPool()}.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, or the supplied action throws an exception,
-     * then the returned CompletableFuture completes exceptionally
-     * with a CompletionException holding the exception as its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param action the action to perform before completing the
-     * returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public CompletableFuture<Void> runAfterBothAsync(CompletableFuture<?> other,
-                                                     Runnable action) {
-        return doRunAfterBoth(other, action, ForkJoinPool.commonPool());
+    public CompletableFuture<Void> runAfterBothAsync
+        (CompletionStage<?> other,
+         Runnable action,
+         Executor executor) {
+        if (executor == null) throw new NullPointerException();
+        return doRunAfterBoth(other.toCompletableFuture(), action, executor);
     }
 
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when both this and the other given CompletableFuture complete,
-     * after performing the given action from a task running in the
-     * given executor.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, or the supplied action throws an exception,
-     * then the returned CompletableFuture completes exceptionally
-     * with a CompletionException holding the exception as its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param action the action to perform before completing the
-     * returned CompletableFuture
-     * @param executor the executor to use for asynchronous execution
-     * @return the new CompletableFuture
-     */
-    public CompletableFuture<Void> runAfterBothAsync(CompletableFuture<?> other,
-                                                     Runnable action,
-                                                     Executor executor) {
-        if (executor == null) throw new NullPointerException();
-        return doRunAfterBoth(other, action, executor);
-    }
 
-    private CompletableFuture<Void> doRunAfterBoth(CompletableFuture<?> other,
-                                                   Runnable action,
-                                                   Executor e) {
-        if (other == null || action == null) throw new NullPointerException();
-        CompletableFuture<Void> dst = new CompletableFuture<Void>();
-        RunAfterBoth d = null;
-        Object r, s = null;
-        if ((r = result) == null || (s = other.result) == null) {
-            d = new RunAfterBoth(this, other, action, dst, e);
-            CompletionNode q = null, p = new CompletionNode(d);
-            while ((r == null && (r = result) == null) ||
-                   (s == null && (s = other.result) == null)) {
-                if (q != null) {
-                    if (s != null ||
-                        UNSAFE.compareAndSwapObject
-                        (other, COMPLETIONS, q.next = other.completions, q))
-                        break;
-                }
-                else if (r != null ||
-                         UNSAFE.compareAndSwapObject
-                         (this, COMPLETIONS, p.next = completions, p)) {
-                    if (s != null)
-                        break;
-                    q = new CompletionNode(d);
-                }
-            }
-        }
-        if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) {
-            Throwable ex;
-            if (r instanceof AltResult)
-                ex = ((AltResult)r).ex;
-            else
-                ex = null;
-            if (ex == null && (s instanceof AltResult))
-                ex = ((AltResult)s).ex;
-            if (ex == null) {
-                try {
-                    if (e != null)
-                        e.execute(new AsyncRun(action, dst));
-                    else
-                        action.run();
-                } catch (Throwable rex) {
-                    ex = rex;
-                }
-            }
-            if (e == null || ex != null)
-                dst.internalComplete(null, ex);
-        }
-        helpPostComplete();
-        other.helpPostComplete();
-        return dst;
+    public <U> CompletableFuture<U> applyToEither
+        (CompletionStage<? extends T> other,
+         Function<? super T, U> fn) {
+        return doApplyToEither(other.toCompletableFuture(), fn, null);
     }
 
-    /**
-     * Returns a new CompletableFuture that is completed
-     * when either this or the other given CompletableFuture completes,
-     * with the result of the given function of either this or the other
-     * CompletableFuture's result.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, then the returned CompletableFuture may also do so,
-     * with a CompletionException holding one of these exceptions as its
-     * cause.  No guarantees are made about which result or exception is
-     * used in the returned CompletableFuture.  If the supplied function
-     * throws an exception, then the returned CompletableFuture completes
-     * exceptionally with a CompletionException holding the exception as
-     * its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param fn the function to use to compute the value of
-     * the returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public <U> CompletableFuture<U> applyToEither
-        (CompletableFuture<? extends T> other,
+    public <U> CompletableFuture<U> applyToEitherAsync
+        (CompletionStage<? extends T> other,
          Function<? super T, U> fn) {
-        return doApplyToEither(other, fn, null);
+        return doApplyToEither(other.toCompletableFuture(), fn,
+                               ForkJoinPool.commonPool());
     }
 
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when either this or the other given CompletableFuture completes,
-     * with the result of the given function of either this or the other
-     * CompletableFuture's result from a task running in the
-     * {@link ForkJoinPool#commonPool()}.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, then the returned CompletableFuture may also do so,
-     * with a CompletionException holding one of these exceptions as its
-     * cause.  No guarantees are made about which result or exception is
-     * used in the returned CompletableFuture.  If the supplied function
-     * throws an exception, then the returned CompletableFuture completes
-     * exceptionally with a CompletionException holding the exception as
-     * its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param fn the function to use to compute the value of
-     * the returned CompletableFuture
-     * @return the new CompletableFuture
-     */
     public <U> CompletableFuture<U> applyToEitherAsync
-        (CompletableFuture<? extends T> other,
-         Function<? super T, U> fn) {
-        return doApplyToEither(other, fn, ForkJoinPool.commonPool());
-    }
-
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when either this or the other given CompletableFuture completes,
-     * with the result of the given function of either this or the other
-     * CompletableFuture's result from a task running in the
-     * given executor.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, then the returned CompletableFuture may also do so,
-     * with a CompletionException holding one of these exceptions as its
-     * cause.  No guarantees are made about which result or exception is
-     * used in the returned CompletableFuture.  If the supplied function
-     * throws an exception, then the returned CompletableFuture completes
-     * exceptionally with a CompletionException holding the exception as
-     * its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param fn the function to use to compute the value of
-     * the returned CompletableFuture
-     * @param executor the executor to use for asynchronous execution
-     * @return the new CompletableFuture
-     */
-    public <U> CompletableFuture<U> applyToEitherAsync
-        (CompletableFuture<? extends T> other,
+        (CompletionStage<? extends T> other,
          Function<? super T, U> fn,
          Executor executor) {
         if (executor == null) throw new NullPointerException();
-        return doApplyToEither(other, fn, executor);
+        return doApplyToEither(other.toCompletableFuture(), fn, executor);
     }
 
-    private <U> CompletableFuture<U> doApplyToEither
-        (CompletableFuture<? extends T> other,
-         Function<? super T, U> fn,
-         Executor e) {
-        if (other == null || fn == null) throw new NullPointerException();
-        CompletableFuture<U> dst = new CompletableFuture<U>();
-        ApplyToEither<T,U> d = null;
-        Object r;
-        if ((r = result) == null && (r = other.result) == null) {
-            d = new ApplyToEither<T,U>(this, other, fn, dst, e);
-            CompletionNode q = null, p = new CompletionNode(d);
-            while ((r = result) == null && (r = other.result) == null) {
-                if (q != null) {
-                    if (UNSAFE.compareAndSwapObject
-                        (other, COMPLETIONS, q.next = other.completions, q))
-                        break;
-                }
-                else if (UNSAFE.compareAndSwapObject
-                         (this, COMPLETIONS, p.next = completions, p))
-                    q = new CompletionNode(d);
-            }
-        }
-        if (r != null && (d == null || d.compareAndSet(0, 1))) {
-            T t; Throwable ex;
-            if (r instanceof AltResult) {
-                ex = ((AltResult)r).ex;
-                t = null;
-            }
-            else {
-                ex = null;
-                @SuppressWarnings("unchecked") T tr = (T) r;
-                t = tr;
-            }
-            U u = null;
-            if (ex == null) {
-                try {
-                    if (e != null)
-                        e.execute(new AsyncApply<T,U>(t, fn, dst));
-                    else
-                        u = fn.apply(t);
-                } catch (Throwable rex) {
-                    ex = rex;
-                }
-            }
-            if (e == null || ex != null)
-                dst.internalComplete(u, ex);
-        }
-        helpPostComplete();
-        other.helpPostComplete();
-        return dst;
+    public CompletableFuture<Void> acceptEither
+        (CompletionStage<? extends T> other,
+         Consumer<? super T> action) {
+        return doAcceptEither(other.toCompletableFuture(), action, null);
     }
 
-    /**
-     * Returns a new CompletableFuture that is completed
-     * when either this or the other given CompletableFuture completes,
-     * after performing the given action with the result of either this
-     * or the other CompletableFuture's result.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, then the returned CompletableFuture may also do so,
-     * with a CompletionException holding one of these exceptions as its
-     * cause.  No guarantees are made about which result or exception is
-     * used in the returned CompletableFuture.  If the supplied action
-     * throws an exception, then the returned CompletableFuture completes
-     * exceptionally with a CompletionException holding the exception as
-     * its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param block the action to perform before completing the
-     * returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public CompletableFuture<Void> acceptEither
-        (CompletableFuture<? extends T> other,
-         Consumer<? super T> block) {
-        return doAcceptEither(other, block, null);
-    }
-
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when either this or the other given CompletableFuture completes,
-     * after performing the given action with the result of either this
-     * or the other CompletableFuture's result from a task running in
-     * the {@link ForkJoinPool#commonPool()}.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, then the returned CompletableFuture may also do so,
-     * with a CompletionException holding one of these exceptions as its
-     * cause.  No guarantees are made about which result or exception is
-     * used in the returned CompletableFuture.  If the supplied action
-     * throws an exception, then the returned CompletableFuture completes
-     * exceptionally with a CompletionException holding the exception as
-     * its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param block the action to perform before completing the
-     * returned CompletableFuture
-     * @return the new CompletableFuture
-     */
     public CompletableFuture<Void> acceptEitherAsync
-        (CompletableFuture<? extends T> other,
-         Consumer<? super T> block) {
-        return doAcceptEither(other, block, ForkJoinPool.commonPool());
+        (CompletionStage<? extends T> other,
+         Consumer<? super T> action) {
+        return doAcceptEither(other.toCompletableFuture(), action,
+                              ForkJoinPool.commonPool());
     }
 
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when either this or the other given CompletableFuture completes,
-     * after performing the given action with the result of either this
-     * or the other CompletableFuture's result from a task running in
-     * the given executor.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, then the returned CompletableFuture may also do so,
-     * with a CompletionException holding one of these exceptions as its
-     * cause.  No guarantees are made about which result or exception is
-     * used in the returned CompletableFuture.  If the supplied action
-     * throws an exception, then the returned CompletableFuture completes
-     * exceptionally with a CompletionException holding the exception as
-     * its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param block the action to perform before completing the
-     * returned CompletableFuture
-     * @param executor the executor to use for asynchronous execution
-     * @return the new CompletableFuture
-     */
     public CompletableFuture<Void> acceptEitherAsync
-        (CompletableFuture<? extends T> other,
-         Consumer<? super T> block,
+        (CompletionStage<? extends T> other,
+         Consumer<? super T> action,
          Executor executor) {
         if (executor == null) throw new NullPointerException();
-        return doAcceptEither(other, block, executor);
+        return doAcceptEither(other.toCompletableFuture(), action, executor);
     }
 
-    private CompletableFuture<Void> doAcceptEither
-        (CompletableFuture<? extends T> other,
-         Consumer<? super T> fn,
-         Executor e) {
-        if (other == null || fn == null) throw new NullPointerException();
-        CompletableFuture<Void> dst = new CompletableFuture<Void>();
-        AcceptEither<T> d = null;
-        Object r;
-        if ((r = result) == null && (r = other.result) == null) {
-            d = new AcceptEither<T>(this, other, fn, dst, e);
-            CompletionNode q = null, p = new CompletionNode(d);
-            while ((r = result) == null && (r = other.result) == null) {
-                if (q != null) {
-                    if (UNSAFE.compareAndSwapObject
-                        (other, COMPLETIONS, q.next = other.completions, q))
-                        break;
-                }
-                else if (UNSAFE.compareAndSwapObject
-                         (this, COMPLETIONS, p.next = completions, p))
-                    q = new CompletionNode(d);
-            }
-        }
-        if (r != null && (d == null || d.compareAndSet(0, 1))) {
-            T t; Throwable ex;
-            if (r instanceof AltResult) {
-                ex = ((AltResult)r).ex;
-                t = null;
-            }
-            else {
-                ex = null;
-                @SuppressWarnings("unchecked") T tr = (T) r;
-                t = tr;
-            }
-            if (ex == null) {
-                try {
-                    if (e != null)
-                        e.execute(new AsyncAccept<T>(t, fn, dst));
-                    else
-                        fn.accept(t);
-                } catch (Throwable rex) {
-                    ex = rex;
-                }
-            }
-            if (e == null || ex != null)
-                dst.internalComplete(null, ex);
-        }
-        helpPostComplete();
-        other.helpPostComplete();
-        return dst;
+    public CompletableFuture<Void> runAfterEither(CompletionStage<?> other,
+                                                  Runnable action) {
+        return doRunAfterEither(other.toCompletableFuture(), action, null);
     }
 
-    /**
-     * Returns a new CompletableFuture that is completed
-     * when either this or the other given CompletableFuture completes,
-     * after performing the given action.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, then the returned CompletableFuture may also do so,
-     * with a CompletionException holding one of these exceptions as its
-     * cause.  No guarantees are made about which result or exception is
-     * used in the returned CompletableFuture.  If the supplied action
-     * throws an exception, then the returned CompletableFuture completes
-     * exceptionally with a CompletionException holding the exception as
-     * its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param action the action to perform before completing the
-     * returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public CompletableFuture<Void> runAfterEither(CompletableFuture<?> other,
-                                                  Runnable action) {
-        return doRunAfterEither(other, action, null);
+    public CompletableFuture<Void> runAfterEitherAsync
+        (CompletionStage<?> other,
+         Runnable action) {
+        return doRunAfterEither(other.toCompletableFuture(), action,
+                                ForkJoinPool.commonPool());
     }
 
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when either this or the other given CompletableFuture completes,
-     * after performing the given action from a task running in the
-     * {@link ForkJoinPool#commonPool()}.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, then the returned CompletableFuture may also do so,
-     * with a CompletionException holding one of these exceptions as its
-     * cause.  No guarantees are made about which result or exception is
-     * used in the returned CompletableFuture.  If the supplied action
-     * throws an exception, then the returned CompletableFuture completes
-     * exceptionally with a CompletionException holding the exception as
-     * its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param action the action to perform before completing the
-     * returned CompletableFuture
-     * @return the new CompletableFuture
-     */
     public CompletableFuture<Void> runAfterEitherAsync
-        (CompletableFuture<?> other,
-         Runnable action) {
-        return doRunAfterEither(other, action, ForkJoinPool.commonPool());
-    }
-
-    /**
-     * Returns a new CompletableFuture that is asynchronously completed
-     * when either this or the other given CompletableFuture completes,
-     * after performing the given action from a task running in the
-     * given executor.
-     *
-     * <p>If this and/or the other CompletableFuture complete
-     * exceptionally, then the returned CompletableFuture may also do so,
-     * with a CompletionException holding one of these exceptions as its
-     * cause.  No guarantees are made about which result or exception is
-     * used in the returned CompletableFuture.  If the supplied action
-     * throws an exception, then the returned CompletableFuture completes
-     * exceptionally with a CompletionException holding the exception as
-     * its cause.
-     *
-     * @param other the other CompletableFuture
-     * @param action the action to perform before completing the
-     * returned CompletableFuture
-     * @param executor the executor to use for asynchronous execution
-     * @return the new CompletableFuture
-     */
-    public CompletableFuture<Void> runAfterEitherAsync
-        (CompletableFuture<?> other,
+        (CompletionStage<?> other,
          Runnable action,
          Executor executor) {
         if (executor == null) throw new NullPointerException();
-        return doRunAfterEither(other, action, executor);
+        return doRunAfterEither(other.toCompletableFuture(), action, executor);
     }
 
-    private CompletableFuture<Void> doRunAfterEither
-        (CompletableFuture<?> other,
-         Runnable action,
-         Executor e) {
-        if (other == null || action == null) throw new NullPointerException();
-        CompletableFuture<Void> dst = new CompletableFuture<Void>();
-        RunAfterEither d = null;
-        Object r;
-        if ((r = result) == null && (r = other.result) == null) {
-            d = new RunAfterEither(this, other, action, dst, e);
-            CompletionNode q = null, p = new CompletionNode(d);
-            while ((r = result) == null && (r = other.result) == null) {
-                if (q != null) {
-                    if (UNSAFE.compareAndSwapObject
-                        (other, COMPLETIONS, q.next = other.completions, q))
-                        break;
-                }
-                else if (UNSAFE.compareAndSwapObject
-                         (this, COMPLETIONS, p.next = completions, p))
-                    q = new CompletionNode(d);
-            }
-        }
-        if (r != null && (d == null || d.compareAndSet(0, 1))) {
-            Throwable ex;
-            if (r instanceof AltResult)
-                ex = ((AltResult)r).ex;
-            else
-                ex = null;
-            if (ex == null) {
-                try {
-                    if (e != null)
-                        e.execute(new AsyncRun(action, dst));
-                    else
-                        action.run();
-                } catch (Throwable rex) {
-                    ex = rex;
-                }
-            }
-            if (e == null || ex != null)
-                dst.internalComplete(null, ex);
-        }
-        helpPostComplete();
-        other.helpPostComplete();
-        return dst;
-    }
-
-    /**
-     * Returns a CompletableFuture that upon completion, has the same
-     * value as produced by the given function of the result of this
-     * CompletableFuture.
-     *
-     * <p>If this CompletableFuture completes exceptionally, then the
-     * returned CompletableFuture also does so, with a
-     * CompletionException holding this exception as its cause.
-     * Similarly, if the computed CompletableFuture completes
-     * exceptionally, then so does the returned CompletableFuture.
-     *
-     * @param fn the function returning a new CompletableFuture
-     * @return the CompletableFuture
-     */
     public <U> CompletableFuture<U> thenCompose
-        (Function<? super T, CompletableFuture<U>> fn) {
+        (Function<? super T, ? extends CompletionStage<U>> fn) {
         return doThenCompose(fn, null);
     }
 
-    /**
-     * Returns a CompletableFuture that upon completion, has the same
-     * value as that produced asynchronously using the {@link
-     * ForkJoinPool#commonPool()} by the given function of the result
-     * of this CompletableFuture.
-     *
-     * <p>If this CompletableFuture completes exceptionally, then the
-     * returned CompletableFuture also does so, with a
-     * CompletionException holding this exception as its cause.
-     * Similarly, if the computed CompletableFuture completes
-     * exceptionally, then so does the returned CompletableFuture.
-     *
-     * @param fn the function returning a new CompletableFuture
-     * @return the CompletableFuture
-     */
     public <U> CompletableFuture<U> thenComposeAsync
-        (Function<? super T, CompletableFuture<U>> fn) {
+        (Function<? super T, ? extends CompletionStage<U>> fn) {
         return doThenCompose(fn, ForkJoinPool.commonPool());
     }
 
-    /**
-     * Returns a CompletableFuture that upon completion, has the same
-     * value as that produced asynchronously using the given executor
-     * by the given function of this CompletableFuture.
-     *
-     * <p>If this CompletableFuture completes exceptionally, then the
-     * returned CompletableFuture also does so, with a
-     * CompletionException holding this exception as its cause.
-     * Similarly, if the computed CompletableFuture completes
-     * exceptionally, then so does the returned CompletableFuture.
-     *
-     * @param fn the function returning a new CompletableFuture
-     * @param executor the executor to use for asynchronous execution
-     * @return the CompletableFuture
-     */
     public <U> CompletableFuture<U> thenComposeAsync
-        (Function<? super T, CompletableFuture<U>> fn,
+        (Function<? super T, ? extends CompletionStage<U>> fn,
          Executor executor) {
         if (executor == null) throw new NullPointerException();
         return doThenCompose(fn, executor);
     }
 
-    private <U> CompletableFuture<U> doThenCompose
-        (Function<? super T, CompletableFuture<U>> fn,
-         Executor e) {
-        if (fn == null) throw new NullPointerException();
-        CompletableFuture<U> dst = null;
-        ThenCompose<T,U> d = null;
-        Object r;
-        if ((r = result) == null) {
-            dst = new CompletableFuture<U>();
-            CompletionNode p = new CompletionNode
-                (d = new ThenCompose<T,U>(this, fn, dst, e));
-            while ((r = result) == null) {
-                if (UNSAFE.compareAndSwapObject
-                    (this, COMPLETIONS, p.next = completions, p))
-                    break;
-            }
-        }
-        if (r != null && (d == null || d.compareAndSet(0, 1))) {
-            T t; Throwable ex;
-            if (r instanceof AltResult) {
-                ex = ((AltResult)r).ex;
-                t = null;
-            }
-            else {
-                ex = null;
-                @SuppressWarnings("unchecked") T tr = (T) r;
-                t = tr;
-            }
-            if (ex == null) {
-                if (e != null) {
-                    if (dst == null)
-                        dst = new CompletableFuture<U>();
-                    e.execute(new AsyncCompose<T,U>(t, fn, dst));
-                }
-                else {
-                    try {
-                        if ((dst = fn.apply(t)) == null)
-                            ex = new NullPointerException();
-                    } catch (Throwable rex) {
-                        ex = rex;
-                    }
-                }
-            }
-            if (dst == null)
-                dst = new CompletableFuture<U>();
-            if (e == null || ex != null)
-                dst.internalComplete(null, ex);
-        }
-        helpPostComplete();
-        dst.helpPostComplete();
-        return dst;
+    public CompletableFuture<T> whenComplete
+        (BiConsumer<? super T, ? super Throwable> action) {
+        return doWhenComplete(action, null);
+    }
+
+    public CompletableFuture<T> whenCompleteAsync
+        (BiConsumer<? super T, ? super Throwable> action) {
+        return doWhenComplete(action, ForkJoinPool.commonPool());
+    }
+
+    public CompletableFuture<T> whenCompleteAsync
+        (BiConsumer<? super T, ? super Throwable> action,
+         Executor executor) {
+        if (executor == null) throw new NullPointerException();
+        return doWhenComplete(action, executor);
+    }
+
+    public <U> CompletableFuture<U> handle
+        (BiFunction<? super T, Throwable, ? extends U> fn) {
+        return doHandle(fn, null);
     }
 
+    public <U> CompletableFuture<U> handleAsync
+        (BiFunction<? super T, Throwable, ? extends U> fn) {
+        return doHandle(fn, ForkJoinPool.commonPool());
+    }
+
+    public <U> CompletableFuture<U> handleAsync
+        (BiFunction<? super T, Throwable, ? extends U> fn,
+         Executor executor) {
+        if (executor == null) throw new NullPointerException();
+        return doHandle(fn, executor);
+    }
+
+    /**
+     * Returns this CompletableFuture
+     *
+     * @return this CompletableFuture
+     */
+    public CompletableFuture<T> toCompletableFuture() {
+        return this;
+    }
+
+    // not in interface CompletionStage
+
     /**
      * Returns a new CompletableFuture that is completed when this
      * CompletableFuture completes, with the result of the given
@@ -2868,6 +2608,8 @@
      * completion when it completes exceptionally; otherwise, if this
      * CompletableFuture completes normally, then the returned
      * CompletableFuture also completes normally with the same value.
+     * Note: More flexible versions of this functionality are
+     * available using methods {@code whenComplete} and {@code handle}.
      *
      * @param fn the function to use to compute the value of the
      * returned CompletableFuture if this CompletableFuture completed
@@ -2882,7 +2624,8 @@
         Object r;
         if ((r = result) == null) {
             CompletionNode p =
-                new CompletionNode(d = new ExceptionCompletion<T>(this, fn, dst));
+                new CompletionNode(d = new ExceptionCompletion<T>
+                                   (this, fn, dst));
             while ((r = result) == null) {
                 if (UNSAFE.compareAndSwapObject(this, COMPLETIONS,
                                                 p.next = completions, p))
@@ -2910,59 +2653,6 @@
         return dst;
     }
 
-    /**
-     * Returns a new CompletableFuture that is completed when this
-     * CompletableFuture completes, with the result of the given
-     * function of the result and exception of this CompletableFuture's
-     * completion.  The given function is invoked with the result (or
-     * {@code null} if none) and the exception (or {@code null} if none)
-     * of this CompletableFuture when complete.
-     *
-     * @param fn the function to use to compute the value of the
-     * returned CompletableFuture
-     * @return the new CompletableFuture
-     */
-    public <U> CompletableFuture<U> handle
-        (BiFunction<? super T, Throwable, ? extends U> fn) {
-        if (fn == null) throw new NullPointerException();
-        CompletableFuture<U> dst = new CompletableFuture<U>();
-        HandleCompletion<T,U> d = null;
-        Object r;
-        if ((r = result) == null) {
-            CompletionNode p =
-                new CompletionNode(d = new HandleCompletion<T,U>(this, fn, dst));
-            while ((r = result) == null) {
-                if (UNSAFE.compareAndSwapObject(this, COMPLETIONS,
-                                                p.next = completions, p))
-                    break;
-            }
-        }
-        if (r != null && (d == null || d.compareAndSet(0, 1))) {
-            T t; Throwable ex;
-            if (r instanceof AltResult) {
-                ex = ((AltResult)r).ex;
-                t = null;
-            }
-            else {
-                ex = null;
-                @SuppressWarnings("unchecked") T tr = (T) r;
-                t = tr;
-            }
-            U u; Throwable dx;
-            try {
-                u = fn.apply(t, ex);
-                dx = null;
-            } catch (Throwable rex) {
-                dx = rex;
-                u = null;
-            }
-            dst.internalComplete(u, dx);
-        }
-        helpPostComplete();
-        return dst;
-    }
-
-
     /* ------------- Arbitrary-arity constructions -------------- */
 
     /*
@@ -3215,6 +2905,21 @@
     }
 
     /**
+     * Returns {@code true} if this CompletableFuture completed
+     * exceptionally, in any way. Possible causes include
+     * cancellation, explicit invocation of {@code
+     * completeExceptionally}, and abrupt termination of a
+     * CompletionStage action.
+     *
+     * @return {@code true} if this CompletableFuture completed
+     * exceptionally
+     */
+    public boolean isCompletedExceptionally() {
+        Object r;
+        return ((r = result) instanceof AltResult) && r != NIL;
+    }
+
+    /**
      * Forcibly sets or resets the value subsequently returned by
      * method {@link #get()} and related methods, whether or not
      * already completed. This method is designed for use only in
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/java/util/concurrent/CompletionStage.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,760 @@
+/*
+ * 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.
+ */
+
+/*
+ * This file is available under and governed by the GNU General Public
+ * License version 2 only, as published by the Free Software Foundation.
+ * However, the following notice accompanied the original version of this
+ * file:
+ *
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+package java.util.concurrent;
+import java.util.function.Supplier;
+import java.util.function.Consumer;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import java.util.function.BiFunction;
+import java.util.concurrent.Executor;
+
+/**
+ * A stage of a possibly asynchronous computation, that performs an
+ * action or computes a value when another CompletionStage completes.
+ * A stage completes upon termination of its computation, but this may
+ * in turn trigger other dependent stages.  The functionality defined
+ * in this interface takes only a few basic forms, which expand out to
+ * a larger set of methods to capture a range of usage styles: <ul>
+ *
+ * <li>The computation performed by a stage may be expressed as a
+ * Function, Consumer, or Runnable (using methods with names including
+ * <em>apply</em>, <em>accept</em>, or <em>run</em>, respectively)
+ * depending on whether it requires arguments and/or produces results.
+ * For example, {@code stage.thenApply(x -> square(x)).thenAccept(x ->
+ * System.out.print(x)).thenRun(() -> System.out.println())}. An
+ * additional form (<em>compose</em>) applies functions of stages
+ * themselves, rather than their results. </li>
+ *
+ * <li> One stage's execution may be triggered by completion of a
+ * single stage, or both of two stages, or either of two stages.
+ * Dependencies on a single stage are arranged using methods with
+ * prefix <em>then</em>. Those triggered by completion of
+ * <em>both</em> of two stages may <em>combine</em> their results or
+ * effects, using correspondingly named methods. Those triggered by
+ * <em>either</em> of two stages make no guarantees about which of the
+ * results or effects are used for the dependent stage's
+ * computation.</li>
+ *
+ * <li> Dependencies among stages control the triggering of
+ * computations, but do not otherwise guarantee any particular
+ * ordering. Additionally, execution of a new stage's computations may
+ * be arranged in any of three ways: default execution, default
+ * asynchronous execution (using methods with suffix <em>async</em>
+ * that employ the stage's default asynchronous execution facility),
+ * or custom (via a supplied {@link Executor}).  The execution
+ * properties of default and async modes are specified by
+ * CompletionStage implementations, not this interface. Methods with
+ * explicit Executor arguments may have arbitrary execution
+ * properties, and might not even support concurrent execution, but
+ * are arranged for processing in a way that accommodates asynchrony.
+ *
+ * <li> Two method forms support processing whether the triggering
+ * stage completed normally or exceptionally: Method {@link
+ * #whenComplete whenComplete} allows injection of an action
+ * regardless of outcome, otherwise preserving the outcome in its
+ * completion. Method {@link #handle handle} additionally allows the
+ * stage to compute a replacement result that may enable further
+ * processing by other dependent stages.  In all other cases, if a
+ * stage's computation terminates abruptly with an (unchecked)
+ * exception or error, then all dependent stages requiring its
+ * completion complete exceptionally as well, with a {@link
+ * CompletionException} holding the exception as its cause.  If a
+ * stage is dependent on <em>both</em> of two stages, and both
+ * complete exceptionally, then the CompletionException may correspond
+ * to either one of these exceptions.  If a stage is dependent on
+ * <em>either</em> of two others, and only one of them completes
+ * exceptionally, no guarantees are made about whether the dependent
+ * stage completes normally or exceptionally. In the case of method
+ * {@code whenComplete}, when the supplied action itself encounters an
+ * exception, then the stage exceptionally completes with this
+ * exception if not already completed exceptionally.</li>
+ *
+ * </ul>
+ *
+ * <p>All methods adhere to the above triggering, execution, and
+ * exceptional completion specifications (which are not repeated in
+ * individual method specifications). Additionally, while arguments
+ * used to pass a completion result (that is, for parameters of type
+ * {@code T}) for methods accepting them may be null, passing a null
+ * value for any other parameter will result in a {@link
+ * NullPointerException} being thrown.
+ *
+ * <p>This interface does not define methods for initially creating,
+ * forcibly completing normally or exceptionally, probing completion
+ * status or results, or awaiting completion of a stage.
+ * Implementations of CompletionStage may provide means of achieving
+ * such effects, as appropriate.  Method {@link #toCompletableFuture}
+ * enables interoperability among different implementations of this
+ * interface by providing a common conversion type.
+ *
+ * @author Doug Lea
+ * @since 1.8
+ */
+public interface CompletionStage<T> {
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * normally, is executed with this stage's result as the argument
+     * to the supplied function.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param fn the function to use to compute the value of
+     * the returned CompletionStage
+     * @param <U> the function's return type
+     * @return the new CompletionStage
+     */
+    public <U> CompletionStage<U> thenApply(Function<? super T,? extends U> fn);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * normally, is executed using this stage's default asynchronous
+     * execution facility, with this stage's result as the argument to
+     * the supplied function.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param fn the function to use to compute the value of
+     * the returned CompletionStage
+     * @param <U> the function's return type
+     * @return the new CompletionStage
+     */
+    public <U> CompletionStage<U> thenApplyAsync
+        (Function<? super T,? extends U> fn);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * normally, is executed using the supplied Executor, with this
+     * stage's result as the argument to the supplied function.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param fn the function to use to compute the value of
+     * the returned CompletionStage
+     * @param executor the executor to use for asynchronous execution
+     * @param <U> the function's return type
+     * @return the new CompletionStage
+     */
+    public <U> CompletionStage<U> thenApplyAsync
+        (Function<? super T,? extends U> fn,
+         Executor executor);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * normally, is executed with this stage's result as the argument
+     * to the supplied action.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> thenAccept(Consumer<? super T> action);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * normally, is executed using this stage's default asynchronous
+     * execution facility, with this stage's result as the argument to
+     * the supplied action.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> thenAcceptAsync(Consumer<? super T> action);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * normally, is executed using the supplied Executor, with this
+     * stage's result as the argument to the supplied action.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @param executor the executor to use for asynchronous execution
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> thenAcceptAsync(Consumer<? super T> action,
+                                                 Executor executor);
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * normally, executes the given action.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> thenRun(Runnable action);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * normally, executes the given action using this stage's default
+     * asynchronous execution facility.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> thenRunAsync(Runnable action);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * normally, executes the given action using the supplied Executor.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @param executor the executor to use for asynchronous execution
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> thenRunAsync(Runnable action,
+                                              Executor executor);
+
+    /**
+     * Returns a new CompletionStage that, when this and the other
+     * given stage both complete normally, is executed with the two
+     * results as arguments to the supplied function.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param fn the function to use to compute the value of
+     * the returned CompletionStage
+     * @param <U> the type of the other CompletionStage's result
+     * @param <V> the function's return type
+     * @return the new CompletionStage
+     */
+    public <U,V> CompletionStage<V> thenCombine
+        (CompletionStage<? extends U> other,
+         BiFunction<? super T,? super U,? extends V> fn);
+
+    /**
+     * Returns a new CompletionStage that, when this and the other
+     * given stage complete normally, is executed using this stage's
+     * default asynchronous execution facility, with the two results
+     * as arguments to the supplied function.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param fn the function to use to compute the value of
+     * the returned CompletionStage
+     * @param <U> the type of the other CompletionStage's result
+     * @param <V> the function's return type
+     * @return the new CompletionStage
+     */
+    public <U,V> CompletionStage<V> thenCombineAsync
+        (CompletionStage<? extends U> other,
+         BiFunction<? super T,? super U,? extends V> fn);
+
+    /**
+     * Returns a new CompletionStage that, when this and the other
+     * given stage complete normally, is executed using the supplied
+     * executor, with the two results as arguments to the supplied
+     * function.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param fn the function to use to compute the value of
+     * the returned CompletionStage
+     * @param executor the executor to use for asynchronous execution
+     * @param <U> the type of the other CompletionStage's result
+     * @param <V> the function's return type
+     * @return the new CompletionStage
+     */
+    public <U,V> CompletionStage<V> thenCombineAsync
+        (CompletionStage<? extends U> other,
+         BiFunction<? super T,? super U,? extends V> fn,
+         Executor executor);
+
+    /**
+     * Returns a new CompletionStage that, when this and the other
+     * given stage both complete normally, is executed with the two
+     * results as arguments to the supplied action.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @param <U> the type of the other CompletionStage's result
+     * @return the new CompletionStage
+     */
+    public <U> CompletionStage<Void> thenAcceptBoth
+        (CompletionStage<? extends U> other,
+         BiConsumer<? super T, ? super U> action);
+
+    /**
+     * Returns a new CompletionStage that, when this and the other
+     * given stage complete normally, is executed using this stage's
+     * default asynchronous execution facility, with the two results
+     * as arguments to the supplied action.
+     *
+     * @param other the other CompletionStage
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @param <U> the type of the other CompletionStage's result
+     * @return the new CompletionStage
+     */
+    public <U> CompletionStage<Void> thenAcceptBothAsync
+        (CompletionStage<? extends U> other,
+         BiConsumer<? super T, ? super U> action);
+
+    /**
+     * Returns a new CompletionStage that, when this and the other
+     * given stage complete normally, is executed using the supplied
+     * executor, with the two results as arguments to the supplied
+     * function.
+     *
+     * @param other the other CompletionStage
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @param executor the executor to use for asynchronous execution
+     * @param <U> the type of the other CompletionStage's result
+     * @return the new CompletionStage
+     */
+    public <U> CompletionStage<Void> thenAcceptBothAsync
+        (CompletionStage<? extends U> other,
+         BiConsumer<? super T, ? super U> action,
+         Executor executor);
+
+    /**
+     * Returns a new CompletionStage that, when this and the other
+     * given stage both complete normally, executes the given action.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> runAfterBoth(CompletionStage<?> other,
+                                              Runnable action);
+    /**
+     * Returns a new CompletionStage that, when this and the other
+     * given stage complete normally, executes the given action using
+     * this stage's default asynchronous execution facility.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> runAfterBothAsync(CompletionStage<?> other,
+                                                   Runnable action);
+
+    /**
+     * Returns a new CompletionStage that, when this and the other
+     * given stage complete normally, executes the given action using
+     * the supplied executor
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @param executor the executor to use for asynchronous execution
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> runAfterBothAsync(CompletionStage<?> other,
+                                                   Runnable action,
+                                                   Executor executor);
+    /**
+     * Returns a new CompletionStage that, when either this or the
+     * other given stage complete normally, is executed with the
+     * corresponding result as argument to the supplied function.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param fn the function to use to compute the value of
+     * the returned CompletionStage
+     * @param <U> the function's return type
+     * @return the new CompletionStage
+     */
+    public <U> CompletionStage<U> applyToEither
+        (CompletionStage<? extends T> other,
+         Function<? super T, U> fn);
+
+    /**
+     * Returns a new CompletionStage that, when either this or the
+     * other given stage complete normally, is executed using this
+     * stage's default asynchronous execution facility, with the
+     * corresponding result as argument to the supplied function.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param fn the function to use to compute the value of
+     * the returned CompletionStage
+     * @param <U> the function's return type
+     * @return the new CompletionStage
+     */
+    public <U> CompletionStage<U> applyToEitherAsync
+        (CompletionStage<? extends T> other,
+         Function<? super T, U> fn);
+
+    /**
+     * Returns a new CompletionStage that, when either this or the
+     * other given stage complete normally, is executed using the
+     * supplied executor, with the corresponding result as argument to
+     * the supplied function.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param fn the function to use to compute the value of
+     * the returned CompletionStage
+     * @param executor the executor to use for asynchronous execution
+     * @param <U> the function's return type
+     * @return the new CompletionStage
+     */
+    public <U> CompletionStage<U> applyToEitherAsync
+        (CompletionStage<? extends T> other,
+         Function<? super T, U> fn,
+         Executor executor);
+
+    /**
+     * Returns a new CompletionStage that, when either this or the
+     * other given stage complete normally, is executed with the
+     * corresponding result as argument to the supplied action.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> acceptEither
+        (CompletionStage<? extends T> other,
+         Consumer<? super T> action);
+
+    /**
+     * Returns a new CompletionStage that, when either this or the
+     * other given stage complete normally, is executed using this
+     * stage's default asynchronous execution facility, with the
+     * corresponding result as argument to the supplied action.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> acceptEitherAsync
+        (CompletionStage<? extends T> other,
+         Consumer<? super T> action);
+
+    /**
+     * Returns a new CompletionStage that, when either this or the
+     * other given stage complete normally, is executed using the
+     * supplied executor, with the corresponding result as argument to
+     * the supplied function.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @param executor the executor to use for asynchronous execution
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> acceptEitherAsync
+        (CompletionStage<? extends T> other,
+         Consumer<? super T> action,
+         Executor executor);
+
+    /**
+     * Returns a new CompletionStage that, when either this or the
+     * other given stage complete normally, executes the given action.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> runAfterEither(CompletionStage<?> other,
+                                                Runnable action);
+
+    /**
+     * Returns a new CompletionStage that, when either this or the
+     * other given stage complete normally, executes the given action
+     * using this stage's default asynchronous execution facility.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> runAfterEitherAsync
+        (CompletionStage<?> other,
+         Runnable action);
+
+    /**
+     * Returns a new CompletionStage that, when either this or the
+     * other given stage complete normally, executes the given action
+     * using supplied executor.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param other the other CompletionStage
+     * @param action the action to perform before completing the
+     * returned CompletionStage
+     * @param executor the executor to use for asynchronous execution
+     * @return the new CompletionStage
+     */
+    public CompletionStage<Void> runAfterEitherAsync
+        (CompletionStage<?> other,
+         Runnable action,
+         Executor executor);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * normally, is executed with this stage as the argument
+     * to the supplied function.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param fn the function returning a new CompletionStage
+     * @param <U> the type of the returned CompletionStage's result
+     * @return the CompletionStage
+     */
+    public <U> CompletionStage<U> thenCompose
+        (Function<? super T, ? extends CompletionStage<U>> fn);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * normally, is executed using this stage's default asynchronous
+     * execution facility, with this stage as the argument to the
+     * supplied function.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param fn the function returning a new CompletionStage
+     * @param <U> the type of the returned CompletionStage's result
+     * @return the CompletionStage
+     */
+    public <U> CompletionStage<U> thenComposeAsync
+        (Function<? super T, ? extends CompletionStage<U>> fn);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * normally, is executed using the supplied Executor, with this
+     * stage's result as the argument to the supplied function.
+     *
+     * See the {@link CompletionStage} documentation for rules
+     * covering exceptional completion.
+     *
+     * @param fn the function returning a new CompletionStage
+     * @param executor the executor to use for asynchronous execution
+     * @param <U> the type of the returned CompletionStage's result
+     * @return the CompletionStage
+     */
+    public <U> CompletionStage<U> thenComposeAsync
+        (Function<? super T, ? extends CompletionStage<U>> fn,
+         Executor executor);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * exceptionally, is executed with this stage's exception as the
+     * argument to the supplied function.  Otherwise, if this stage
+     * completes normally, then the returned stage also completes
+     * normally with the same value.
+     *
+     * @param fn the function to use to compute the value of the
+     * returned CompletionStage if this CompletionStage completed
+     * exceptionally
+     * @return the new CompletionStage
+     */
+    public CompletionStage<T> exceptionally
+        (Function<Throwable, ? extends T> fn);
+
+    /**
+     * Returns a new CompletionStage with the same result or exception
+     * as this stage, and when this stage completes, executes the
+     * given action with the result (or {@code null} if none) and the
+     * exception (or {@code null} if none) of this stage.
+     *
+     * @param action the action to perform
+     * @return the new CompletionStage
+     */
+    public CompletionStage<T> whenComplete
+        (BiConsumer<? super T, ? super Throwable> action);
+
+    /**
+     * Returns a new CompletionStage with the same result or exception
+     * as this stage, and when this stage completes, executes the
+     * given action executes the given action using this stage's
+     * default asynchronous execution facility, with the result (or
+     * {@code null} if none) and the exception (or {@code null} if
+     * none) of this stage as arguments.
+     *
+     * @param action the action to perform
+     * @return the new CompletionStage
+     */
+    public CompletionStage<T> whenCompleteAsync
+        (BiConsumer<? super T, ? super Throwable> action);
+
+    /**
+     * Returns a new CompletionStage with the same result or exception
+     * as this stage, and when this stage completes, executes using
+     * the supplied Executor, the given action with the result (or
+     * {@code null} if none) and the exception (or {@code null} if
+     * none) of this stage as arguments.
+     *
+     * @param action the action to perform
+     * @param executor the executor to use for asynchronous execution
+     * @return the new CompletionStage
+     */
+    public CompletionStage<T> whenCompleteAsync
+        (BiConsumer<? super T, ? super Throwable> action,
+         Executor executor);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * either normally or exceptionally, is executed with this stage's
+     * result and exception as arguments to the supplied function.
+     * The given function is invoked with the result (or {@code null}
+     * if none) and the exception (or {@code null} if none) of this
+     * stage when complete as arguments.
+     *
+     * @param fn the function to use to compute the value of the
+     * returned CompletionStage
+     * @param <U> the function's return type
+     * @return the new CompletionStage
+     */
+    public <U> CompletionStage<U> handle
+        (BiFunction<? super T, Throwable, ? extends U> fn);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * either normally or exceptionally, is executed using this stage's
+     * default asynchronous execution facility, with this stage's
+     * result and exception as arguments to the supplied function.
+     * The given function is invoked with the result (or {@code null}
+     * if none) and the exception (or {@code null} if none) of this
+     * stage when complete as arguments.
+     *
+     * @param fn the function to use to compute the value of the
+     * returned CompletionStage
+     * @param <U> the function's return type
+     * @return the new CompletionStage
+     */
+    public <U> CompletionStage<U> handleAsync
+        (BiFunction<? super T, Throwable, ? extends U> fn);
+
+    /**
+     * Returns a new CompletionStage that, when this stage completes
+     * either normally or exceptionally, is executed using the
+     * supplied executor, with this stage's result and exception as
+     * arguments to the supplied function.  The given function is
+     * invoked with the result (or {@code null} if none) and the
+     * exception (or {@code null} if none) of this stage when complete
+     * as arguments.
+     *
+     * @param fn the function to use to compute the value of the
+     * returned CompletionStage
+     * @param executor the executor to use for asynchronous execution
+     * @param <U> the function's return type
+     * @return the new CompletionStage
+     */
+    public <U> CompletionStage<U> handleAsync
+        (BiFunction<? super T, Throwable, ? extends U> fn,
+         Executor executor);
+
+    /**
+     * Returns a {@link CompletableFuture} maintaining the same
+     * completion properties as this stage. If this stage is already a
+     * CompletableFuture, this method may return this stage itself.
+     * Otherwise, invocation of this method may be equivalent in
+     * effect to {@code thenApply(x -> x)}, but returning an instance
+     * of type {@code CompletableFuture}. A CompletionStage
+     * implementation that does not choose to interoperate with others
+     * may throw {@code UnsupportedOperationException}.
+     *
+     * @return the CompletableFuture
+     * @throws UnsupportedOperationException if this implementation
+     * does not interoperate with CompletableFuture
+     */
+    public CompletableFuture<T> toCompletableFuture();
+
+}
--- a/jdk/src/share/classes/java/util/logging/XMLFormatter.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/logging/XMLFormatter.java	Wed Jul 05 19:07:19 2017 +0200
@@ -47,7 +47,7 @@
     private LogManager manager = LogManager.getLogManager();
 
     // Append a two digit number.
-    private void a2(StringBuffer sb, int x) {
+    private void a2(StringBuilder sb, int x) {
         if (x < 10) {
             sb.append('0');
         }
@@ -55,25 +55,26 @@
     }
 
     // Append the time and date in ISO 8601 format
-    private void appendISO8601(StringBuffer sb, long millis) {
-        Date date = new Date(millis);
-        sb.append(date.getYear() + 1900);
+    private void appendISO8601(StringBuilder sb, long millis) {
+        GregorianCalendar cal = new GregorianCalendar();
+        cal.setTimeInMillis(millis);
+        sb.append(cal.get(Calendar.YEAR) + 1900);
         sb.append('-');
-        a2(sb, date.getMonth() + 1);
+        a2(sb, cal.get(Calendar.MONTH) + 1);
         sb.append('-');
-        a2(sb, date.getDate());
+        a2(sb, cal.get(Calendar.DAY_OF_MONTH));
         sb.append('T');
-        a2(sb, date.getHours());
+        a2(sb, cal.get(Calendar.HOUR_OF_DAY));
         sb.append(':');
-        a2(sb, date.getMinutes());
+        a2(sb, cal.get(Calendar.MINUTE));
         sb.append(':');
-        a2(sb, date.getSeconds());
+        a2(sb, cal.get(Calendar.SECOND));
     }
 
-    // Append to the given StringBuffer an escaped version of the
+    // Append to the given StringBuilder an escaped version of the
     // given text string where XML special characters have been escaped.
     // For a null string we append "<null>"
-    private void escape(StringBuffer sb, String text) {
+    private void escape(StringBuilder sb, String text) {
         if (text == null) {
             text = "<null>";
         }
@@ -102,7 +103,7 @@
      * @return a formatted log record
      */
     public String format(LogRecord record) {
-        StringBuffer sb = new StringBuffer(500);
+        StringBuilder sb = new StringBuilder(500);
         sb.append("<record>\n");
 
         sb.append("  <date>");
@@ -224,7 +225,7 @@
      * @return  a valid XML string
      */
     public String getHead(Handler h) {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         String encoding;
         sb.append("<?xml version=\"1.0\"");
 
--- a/jdk/src/share/classes/java/util/stream/AbstractPipeline.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/AbstractPipeline.java	Wed Jul 05 19:07:19 2017 +0200
@@ -75,11 +75,13 @@
      * Backlink to the head of the pipeline chain (self if this is the source
      * stage).
      */
+    @SuppressWarnings("rawtypes")
     private final AbstractPipeline sourceStage;
 
     /**
      * The "upstream" pipeline, or null if this is the source stage.
      */
+    @SuppressWarnings("rawtypes")
     private final AbstractPipeline previousStage;
 
     /**
@@ -92,6 +94,7 @@
      * The next stage in the pipeline, or null if this is the last stage.
      * Effectively final at the point of linking to the next pipeline.
      */
+    @SuppressWarnings("rawtypes")
     private AbstractPipeline nextStage;
 
     /**
@@ -222,8 +225,8 @@
         linkedOrConsumed = true;
 
         return isParallel()
-               ? (R) terminalOp.evaluateParallel(this, sourceSpliterator(terminalOp.getOpFlags()))
-               : (R) terminalOp.evaluateSequential(this, sourceSpliterator(terminalOp.getOpFlags()));
+               ? terminalOp.evaluateParallel(this, sourceSpliterator(terminalOp.getOpFlags()))
+               : terminalOp.evaluateSequential(this, sourceSpliterator(terminalOp.getOpFlags()));
     }
 
     /**
@@ -232,6 +235,7 @@
      * @param generator the array generator to be used to create array instances
      * @return a flat array-backed Node that holds the collected output elements
      */
+    @SuppressWarnings("unchecked")
     final Node<E_OUT> evaluateToArrayNode(IntFunction<E_OUT[]> generator) {
         if (linkedOrConsumed)
             throw new IllegalStateException("stream has already been operated upon");
@@ -256,6 +260,7 @@
      * @throws IllegalStateException if this pipeline stage is not the source
      *         stage.
      */
+    @SuppressWarnings("unchecked")
     final Spliterator<E_OUT> sourceStageSpliterator() {
         if (this != sourceStage)
             throw new IllegalStateException();
@@ -265,11 +270,13 @@
         linkedOrConsumed = true;
 
         if (sourceStage.sourceSpliterator != null) {
+            @SuppressWarnings("unchecked")
             Spliterator<E_OUT> s = sourceStage.sourceSpliterator;
             sourceStage.sourceSpliterator = null;
             return s;
         }
         else if (sourceStage.sourceSupplier != null) {
+            @SuppressWarnings("unchecked")
             Spliterator<E_OUT> s = (Spliterator<E_OUT>) sourceStage.sourceSupplier.get();
             sourceStage.sourceSupplier = null;
             return s;
@@ -282,12 +289,14 @@
     // BaseStream
 
     @Override
+    @SuppressWarnings("unchecked")
     public final S sequential() {
         sourceStage.parallel = false;
         return (S) this;
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public final S parallel() {
         sourceStage.parallel = true;
         return (S) this;
@@ -295,6 +304,7 @@
 
     // Primitive specialization use co-variant overrides, hence is not final
     @Override
+    @SuppressWarnings("unchecked")
     public Spliterator<E_OUT> spliterator() {
         if (linkedOrConsumed)
             throw new IllegalStateException("stream has already been operated upon");
@@ -302,12 +312,14 @@
 
         if (this == sourceStage) {
             if (sourceStage.sourceSpliterator != null) {
-                Spliterator<E_OUT> s = sourceStage.sourceSpliterator;
+                @SuppressWarnings("unchecked")
+                Spliterator<E_OUT> s = (Spliterator<E_OUT>) sourceStage.sourceSpliterator;
                 sourceStage.sourceSpliterator = null;
                 return s;
             }
             else if (sourceStage.sourceSupplier != null) {
-                Supplier<Spliterator<E_OUT>> s = sourceStage.sourceSupplier;
+                @SuppressWarnings("unchecked")
+                Supplier<Spliterator<E_OUT>> s = (Supplier<Spliterator<E_OUT>>) sourceStage.sourceSupplier;
                 sourceStage.sourceSupplier = null;
                 return lazySpliterator(s);
             }
@@ -349,10 +361,11 @@
      * @param terminalFlags Operation flags for the terminal operation
      */
     private void parallelPrepare(int terminalFlags) {
+        @SuppressWarnings("rawtypes")
         AbstractPipeline backPropagationHead = sourceStage;
         if (sourceStage.sourceAnyStateful) {
             int depth = 1;
-            for (AbstractPipeline u = sourceStage, p = sourceStage.nextStage;
+            for (  @SuppressWarnings("rawtypes") AbstractPipeline u = sourceStage, p = sourceStage.nextStage;
                  p != null;
                  u = p, p = p.nextStage) {
                 int thisOpFlags = p.sourceOrOpFlags;
@@ -383,7 +396,7 @@
         // Apply the upstream terminal flags
         if (terminalFlags != 0) {
             int upstreamTerminalFlags = terminalFlags & StreamOpFlag.UPSTREAM_TERMINAL_OP_MASK;
-            for (AbstractPipeline p = backPropagationHead; p.nextStage != null; p = p.nextStage) {
+            for ( @SuppressWarnings("rawtypes") AbstractPipeline p = backPropagationHead; p.nextStage != null; p = p.nextStage) {
                 p.combinedFlags = StreamOpFlag.combineOpFlags(upstreamTerminalFlags, p.combinedFlags);
             }
 
@@ -398,6 +411,7 @@
      * of all computations up to and including the most recent stateful
      * operation.
      */
+    @SuppressWarnings("unchecked")
     private Spliterator<?> sourceSpliterator(int terminalFlags) {
         // Get the source spliterator of the pipeline
         Spliterator<?> spliterator = null;
@@ -421,7 +435,7 @@
 
             // Adapt the source spliterator, evaluating each stateful op
             // in the pipeline up to and including this pipeline stage
-            for (AbstractPipeline u = sourceStage, p = sourceStage.nextStage, e = this;
+            for ( @SuppressWarnings("rawtypes") AbstractPipeline u = sourceStage, p = sourceStage.nextStage, e = this;
                  u != e;
                  u = p, p = p.nextStage) {
 
@@ -442,6 +456,7 @@
 
     @Override
     final StreamShape getSourceShape() {
+        @SuppressWarnings("rawtypes")
         AbstractPipeline p = AbstractPipeline.this;
         while (p.depth > 0) {
             p = p.previousStage;
@@ -475,7 +490,9 @@
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     final <P_IN> void copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator) {
+        @SuppressWarnings({"rawtypes","unchecked"})
         AbstractPipeline p = AbstractPipeline.this;
         while (p.depth > 0) {
             p = p.previousStage;
@@ -495,16 +512,18 @@
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     final <P_IN> Sink<P_IN> wrapSink(Sink<E_OUT> sink) {
         Objects.requireNonNull(sink);
 
-        for (AbstractPipeline p=AbstractPipeline.this; p.depth > 0; p=p.previousStage) {
+        for ( @SuppressWarnings("rawtypes") AbstractPipeline p=AbstractPipeline.this; p.depth > 0; p=p.previousStage) {
             sink = p.opWrapSink(p.previousStage.combinedFlags, sink);
         }
         return (Sink<P_IN>) sink;
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     final <P_IN> Spliterator<E_OUT> wrapSpliterator(Spliterator<P_IN> sourceSpliterator) {
         if (depth == 0) {
             return (Spliterator<E_OUT>) sourceSpliterator;
@@ -591,16 +610,19 @@
     /**
      * Make a node builder compatible with this stream shape.
      *
-     * @param exactSizeIfKnown if {@literal >=0}, then a node builder will be created that
-     * has a fixed capacity of at most sizeIfKnown elements. If {@literal < 0},
-     * then the node builder has an unfixed capacity. A fixed capacity node
-     * builder will throw exceptions if an element is added after builder has
-     * reached capacity, or is built before the builder has reached capacity.
+     * @param exactSizeIfKnown if {@literal >=0}, then a node builder will be
+     * created that has a fixed capacity of at most sizeIfKnown elements. If
+     * {@literal < 0}, then the node builder has an unfixed capacity. A fixed
+     * capacity node builder will throw exceptions if an element is added after
+     * builder has reached capacity, or is built before the builder has reached
+     * capacity.
+     *
      * @param generator the array generator to be used to create instances of a
      * T[] array. For implementations supporting primitive nodes, this parameter
      * may be ignored.
      * @return a node builder
      */
+    @Override
     abstract Node.Builder<E_OUT> makeNodeBuilder(long exactSizeIfKnown,
                                                  IntFunction<E_OUT[]> generator);
 
@@ -679,6 +701,7 @@
      * @param spliterator the source {@code Spliterator}
      * @return a {@code Spliterator} describing the result of the evaluation
      */
+    @SuppressWarnings("unchecked")
     <P_IN> Spliterator<E_OUT> opEvaluateParallelLazy(PipelineHelper<E_OUT> helper,
                                                      Spliterator<P_IN> spliterator) {
         return opEvaluateParallel(helper, spliterator, i -> (E_OUT[]) new Object[i]).spliterator();
--- a/jdk/src/share/classes/java/util/stream/AbstractShortCircuitTask.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/AbstractShortCircuitTask.java	Wed Jul 05 19:07:19 2017 +0200
@@ -39,6 +39,7 @@
  * @param <K> type of child and sibling tasks
  * @since 1.8
  */
+@SuppressWarnings("serial")
 abstract class AbstractShortCircuitTask<P_IN, P_OUT, R,
                                         K extends AbstractShortCircuitTask<P_IN, P_OUT, R, K>>
         extends AbstractTask<P_IN, P_OUT, R, K> {
@@ -219,7 +220,8 @@
      */
     protected void cancelLaterNodes() {
         // Go up the tree, cancel right siblings of this node and all parents
-        for (K parent = getParent(), node = (K) this; parent != null;
+        for (@SuppressWarnings("unchecked") K parent = getParent(), node = (K) this;
+             parent != null;
              node = parent, parent = parent.getParent()) {
             // If node is a left child of parent, then has a right sibling
             if (parent.leftChild == node) {
--- a/jdk/src/share/classes/java/util/stream/AbstractTask.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/AbstractTask.java	Wed Jul 05 19:07:19 2017 +0200
@@ -73,6 +73,9 @@
  *     }
  * }</pre>
  *
+ * <p>Serialization is not supported as there is no intention to serialize
+ * tasks managed by stream ops.
+ *
  * @param <P_IN> Type of elements input to the pipeline
  * @param <P_OUT> Type of elements output from the pipeline
  * @param <R> Type of intermediate result, which may be different from operation
@@ -80,6 +83,7 @@
  * @param <K> Type of parent, child and sibling tasks
  * @since 1.8
  */
+@SuppressWarnings("serial")
 abstract class AbstractTask<P_IN, P_OUT, R,
                             K extends AbstractTask<P_IN, P_OUT, R, K>>
         extends CountedCompleter<R> {
--- a/jdk/src/share/classes/java/util/stream/Collector.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/Collector.java	Wed Jul 05 19:07:19 2017 +0200
@@ -25,40 +25,45 @@
 package java.util.stream;
 
 import java.util.Collections;
+import java.util.EnumSet;
 import java.util.Set;
-import java.util.function.BiFunction;
+import java.util.function.BiConsumer;
 import java.util.function.BinaryOperator;
+import java.util.function.Function;
 import java.util.function.Supplier;
 
 /**
  * A <a href="package-summary.html#Reduction">reduction operation</a> that
- * supports folding input elements into a cumulative result.  The result may be
- * a value or may be a mutable result container.  Examples of operations
- * accumulating results into a mutable result container include: accumulating
- * input elements into a {@code Collection}; concatenating strings into a
- * {@code StringBuilder}; computing summary information about elements such as
- * sum, min, max, or average; computing "pivot table" summaries such as "maximum
- * valued transaction by seller", etc.  Reduction operations can be performed
- * either sequentially or in parallel.
+ * folds input elements into a mutable result container, optionally transforming
+ * the accumulated result into a final representation after all input elements
+ * have been processed.
+ *
+ * <p>Examples of mutable reduction operations include:
+ * accumulating elements into a {@code Collection}; concatenating
+ * strings using a {@code StringBuilder}; computing summary information about
+ * elements such as sum, min, max, or average; computing "pivot table" summaries
+ * such as "maximum valued transaction by seller", etc.  Reduction operations
+ * can be performed either sequentially or in parallel.
  *
  * <p>The following are examples of using the predefined {@code Collector}
  * implementations in {@link Collectors} with the {@code Stream} API to perform
  * mutable reduction tasks:
  * <pre>{@code
- *     // Accumulate elements into a List
- *     List<String> list = stream.collect(Collectors.toList());
+ *     // Accumulate names into a List
+ *     List<String> list = people.stream().map(Person::getName).collect(Collectors.toList());
  *
- *     // Accumulate elements into a TreeSet
- *     Set<String> list = stream.collect(Collectors.toCollection(TreeSet::new));
+ *     // Accumulate names into a TreeSet
+ *     Set<String> list = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));
  *
  *     // Convert elements to strings and concatenate them, separated by commas
- *     String joined = stream.map(Object::toString)
- *                           .collect(Collectors.toStringJoiner(", "))
- *                           .toString();
+ *     String joined = things.stream()
+ *                           .map(Object::toString)
+ *                           .collect(Collectors.joining(", "));
  *
  *     // Find highest-paid employee
  *     Employee highestPaid = employees.stream()
- *                                     .collect(Collectors.maxBy(Comparators.comparing(Employee::getSalary)));
+ *                                     .collect(Collectors.maxBy(Comparators.comparing(Employee::getSalary)))
+ *                                     .get();
  *
  *     // Group employees by department
  *     Map<Department, List<Employee>> byDept
@@ -66,7 +71,7 @@
  *                    .collect(Collectors.groupingBy(Employee::getDepartment));
  *
  *     // Find highest-paid employee by department
- *     Map<Department, Employee> highestPaidByDept
+ *     Map<Department, Optional<Employee>> highestPaidByDept
  *         = employees.stream()
  *                    .collect(Collectors.groupingBy(Employee::getDepartment,
  *                                                   Collectors.maxBy(Comparators.comparing(Employee::getSalary))));
@@ -74,43 +79,42 @@
  *     // Partition students into passing and failing
  *     Map<Boolean, List<Student>> passingFailing =
  *         students.stream()
- *                 .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD);
+ *                 .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));
  *
  * }</pre>
  *
- * <p>A {@code Collector} is specified by three functions that work together to
- * manage a result or result container.  They are: creation of an initial
- * result, incorporating a new data element into a result, and combining two
- * results into one. The last function -- combining two results into one -- is
- * used during parallel operations, where subsets of the input are accumulated
- * in parallel, and then the subresults merged into a combined result. The
- * result may be a mutable container or a value.  If the result is mutable, the
- * accumulation and combination functions may either mutate their left argument
- * and return that (such as adding elements to a collection), or return a new
- * result, in which case it should not perform any mutation.
+ * <p>A {@code Collector} is specified by four functions that work together to
+ * accumulate entries into a mutable result container, and optionally perform
+ * a final transform on the result.  They are: creation of a new result container,
+ * incorporating a new data element into a result container, combining two
+ * result containers into one, and performing a final transform on the container.
+ * The combiner function is used during parallel operations, where
+ * subsets of the input are accumulated into separate result
+ * containers, and then the subresults merged into a combined result.  The
+ * combiner function may merge one set of subresults into the other and return
+ * that, or it may return a new object to describe the combined results.
  *
- * <p>Collectors also have a set of characteristics, including
- * {@link Characteristics#CONCURRENT} and
- * {@link Characteristics#STRICTLY_MUTATIVE}.  These characteristics provide
+ * <p>Collectors also have a set of characteristics, such as
+ * {@link Characteristics#CONCURRENT}.  These characteristics provide
  * hints that can be used by a reduction implementation to provide better
  * performance.
  *
  * <p>Libraries that implement reduction based on {@code Collector}, such as
  * {@link Stream#collect(Collector)}, must adhere to the following constraints:
  * <ul>
- *     <li>The first argument passed to the accumulator function, and both
- *     arguments passed to the combiner function, must be the result of a
- *     previous invocation of {@link #resultSupplier()}, {@link #accumulator()},
- *     or {@link #combiner()}.</li>
+ *     <li>The first argument passed to the accumulator function, both
+ *     arguments passed to the combiner function, and the argument passed to the
+ *     finisher function must be the result of a previous invocation of the
+ *     result supplier, accumulator, or combiner functions.</li>
  *     <li>The implementation should not do anything with the result of any of
  *     the result supplier, accumulator, or combiner functions other than to
- *     pass them again to the accumulator or combiner functions, or return them
- *     to the caller of the reduction operation.</li>
- *     <li>If a result is passed to the accumulator or combiner function, and
- *     the same object is not returned from that function, it is never used
- *     again.</li>
- *     <li>Once a result is passed to the combiner function, it is never passed
- *     to the accumulator function again.</li>
+ *     pass them again to the accumulator, combiner, or finisher functions,
+ *     or return them to the caller of the reduction operation.</li>
+ *     <li>If a result is passed to the combiner or finisher
+ *     function, and the same object is not returned from that function, it is
+ *     never used again.</li>
+ *     <li>Once a result is passed to the combiner or finisher function, it
+ *     is never passed to the accumulator function again.</li>
  *     <li>For non-concurrent collectors, any result returned from the result
  *     supplier, accumulator, or combiner functions must be serially
  *     thread-confined.  This enables collection to occur in parallel without
@@ -132,11 +136,10 @@
  * Performing a reduction operation with a {@code Collector} should produce a
  * result equivalent to:
  * <pre>{@code
- *     BiFunction<R,T,R> accumulator = collector.accumulator();
- *     R result = collector.resultSupplier().get();
+ *     R container = collector.supplier().get();
  *     for (T t : data)
- *         result = accumulator.apply(result, t);
- *     return result;
+ *         collector.accumulator().accept(container, t);
+ *     return collector.finisher().apply(container);
  * }</pre>
  *
  * <p>However, the library is free to partition the input, perform the reduction
@@ -149,7 +152,7 @@
  * is accumulating elements into a {@code TreeSet}. In this case, the {@code
  * resultSupplier()} function is {@code () -> new Treeset<T>()}, the
  * {@code accumulator} function is
- * {@code (set, element) -> { set.add(element); return set; }}, and the combiner
+ * {@code (set, element) -> set.add(element) }, and the combiner
  * function is {@code (left, right) -> { left.addAll(right); return left; }}.
  * (This behavior is implemented by
  * {@code Collectors.toCollection(TreeSet::new)}).
@@ -159,51 +162,49 @@
  * @see Stream#collect(Collector)
  * @see Collectors
  *
- * @param <T> the type of input element to the collect operation
- * @param <R> the result type of the collect operation
+ * @param <T> the type of input elements to the reduction operation
+ * @param <A> the mutable accumulation type of the reduction operation (often
+ *           hidden as an implementation detail)
+ * @param <R> the result type of the reduction operation
  * @since 1.8
  */
-public interface Collector<T, R> {
+public interface Collector<T, A, R> {
     /**
-     * A function that creates and returns a new result that represents
-     * "no values".  If the accumulator or combiner functions may mutate their
-     * arguments, this must be a new, empty result container.
+     * A function that creates and returns a new mutable result container.
      *
-     * @return a function which, when invoked, returns a result representing
-     * "no values"
+     * @return a function which returns a new, mutable result container
      */
-    Supplier<R> resultSupplier();
+    Supplier<A> supplier();
 
     /**
-     * A function that folds a new value into a cumulative result.  The result
-     * may be a mutable result container or a value.  The accumulator function
-     * may modify a mutable container and return it, or create a new result and
-     * return that, but if it returns a new result object, it must not modify
-     * any of its arguments.
+     * A function that folds a new value into a mutable result container.
      *
-     * <p>If the collector has the {@link Characteristics#STRICTLY_MUTATIVE}
-     * characteristic, then the accumulator function <em>must</em> always return
-     * its first argument, after possibly mutating its state.
-     *
-     * @return a function which folds a new value into a cumulative result
+     * @return a function which folds a new value into a mutable result container
      */
-    BiFunction<R, T, R> accumulator();
+    BiConsumer<A, T> accumulator();
 
     /**
      * A function that accepts two partial results and merges them.  The
      * combiner function may fold state from one argument into the other and
-     * return that, or may return a new result object, but if it returns
-     * a new result object, it must not modify the state of either of its
-     * arguments.
-     *
-     * <p>If the collector has the {@link Characteristics#STRICTLY_MUTATIVE}
-     * characteristic, then the combiner function <em>must</em> always return
-     * its first argument, after possibly mutating its state.
+     * return that, or may return a new result object.
      *
      * @return a function which combines two partial results into a cumulative
      * result
      */
-    BinaryOperator<R> combiner();
+    BinaryOperator<A> combiner();
+
+    /**
+     * Perform the final transformation from the intermediate accumulation type
+     * {@code A} to the final result representation {@code R}.
+     *
+     * <p>If the characteristic {@code IDENTITY_TRANSFORM} is
+     * set, this function may be presumed to be an identity transform with an
+     * unchecked cast from {@code A} to {@code R}.
+     *
+     * @return a function which transforms the intermediate result to the final
+     * result
+     */
+    Function<A, R> finisher();
 
     /**
      * Returns a {@code Set} of {@code Collector.Characteristics} indicating
@@ -214,6 +215,62 @@
     Set<Characteristics> characteristics();
 
     /**
+     * Returns a new {@code Collector} described by the given {@code supplier},
+     * {@code accumulator}, and {@code combiner} functions.  The resulting
+     * {@code Collector} has the {@code Collector.Characteristics.IDENTITY_FINISH}
+     * characteristic.
+     *
+     * @param supplier The supplier function for the new collector
+     * @param accumulator The accumulator function for the new collector
+     * @param combiner The combiner function for the new collector
+     * @param characteristics The collector characteristics for the new
+     *                        collector
+     * @param <T> The type of input elements for the new collector
+     * @param <R> The type of intermediate accumulation result, and final result,
+     *           for the new collector
+     * @return the new {@code Collector}
+     */
+    public static<T, R> Collector<T, R, R> of(Supplier<R> supplier,
+                                              BiConsumer<R, T> accumulator,
+                                              BinaryOperator<R> combiner,
+                                              Characteristics... characteristics) {
+        Set<Characteristics> cs = (characteristics.length == 0)
+                                  ? Collectors.CH_ID
+                                  : Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH,
+                                                                           characteristics));
+        return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, cs);
+    }
+
+    /**
+     * Returns a new {@code Collector} described by the given {@code supplier},
+     * {@code accumulator}, {@code combiner}, and {@code finisher} functions.
+     *
+     * @param supplier The supplier function for the new collector
+     * @param accumulator The accumulator function for the new collector
+     * @param combiner The combiner function for the new collector
+     * @param finisher The finisher function for the new collector
+     * @param characteristics The collector characteristics for the new
+     *                        collector
+     * @param <T> The type of input elements for the new collector
+     * @param <A> The intermediate accumulation type of the new collector
+     * @param <R> The final result type of the new collector
+     * @return the new {@code Collector}
+     */
+    public static<T, A, R> Collector<T, A, R> of(Supplier<A> supplier,
+                                                 BiConsumer<A, T> accumulator,
+                                                 BinaryOperator<A> combiner,
+                                                 Function<A, R> finisher,
+                                                 Characteristics... characteristics) {
+        Set<Characteristics> cs = Collectors.CH_NOID;
+        if (characteristics.length > 0) {
+            cs = EnumSet.noneOf(Characteristics.class);
+            Collections.addAll(cs, characteristics);
+            cs = Collections.unmodifiableSet(cs);
+        }
+        return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, finisher, cs);
+    }
+
+    /**
      * Characteristics indicating properties of a {@code Collector}, which can
      * be used to optimize reduction implementations.
      */
@@ -222,8 +279,7 @@
          * Indicates that this collector is <em>concurrent</em>, meaning that
          * the result container can support the accumulator function being
          * called concurrently with the same result container from multiple
-         * threads. Concurrent collectors must also always have the
-         * {@code STRICTLY_MUTATIVE} characteristic.
+         * threads.
          *
          * <p>If a {@code CONCURRENT} collector is not also {@code UNORDERED},
          * then it should only be evaluated concurrently if applied to an
@@ -238,12 +294,10 @@
         UNORDERED,
 
         /**
-         * Indicates that this collector operates by strict mutation of its
-         * result container. This means that the {@link #accumulator()} and
-         * {@link #combiner()} functions will always modify the state of and
-         * return their first argument, rather than returning a different result
-         * container.
+         * Indicates that the finisher function is the identity function and
+         * can be elided.  If set, it must be the case that an unchecked cast
+         * from A to R will succeed.
          */
-        STRICTLY_MUTATIVE
+        IDENTITY_FINISH
     }
 }
--- a/jdk/src/share/classes/java/util/stream/Collectors.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/Collectors.java	Wed Jul 05 19:07:19 2017 +0200
@@ -27,6 +27,7 @@
 import java.util.AbstractMap;
 import java.util.AbstractSet;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -39,14 +40,16 @@
 import java.util.List;
 import java.util.LongSummaryStatistics;
 import java.util.Map;
-import java.util.NoSuchElementException;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.StringJoiner;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import java.util.function.BinaryOperator;
+import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
@@ -64,20 +67,21 @@
  * mutable reduction tasks:
  *
  * <pre>{@code
- *     // Accumulate elements into a List
- *     List<Person> list = people.collect(Collectors.toList());
+ *     // Accumulate names into a List
+ *     List<String> list = people.stream().map(Person::getName).collect(Collectors.toList());
  *
- *     // Accumulate elements into a TreeSet
- *     List<Person> list = people.collect(Collectors.toCollection(TreeSet::new));
+ *     // Accumulate names into a TreeSet
+ *     Set<String> list = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));
  *
  *     // Convert elements to strings and concatenate them, separated by commas
- *     String joined = stream.map(Object::toString)
- *                           .collect(Collectors.toStringJoiner(", "))
- *                           .toString();
+ *     String joined = things.stream()
+ *                           .map(Object::toString)
+ *                           .collect(Collectors.joining(", "));
  *
  *     // Find highest-paid employee
  *     Employee highestPaid = employees.stream()
- *                                     .collect(Collectors.maxBy(Comparator.comparing(Employee::getSalary)));
+ *                                     .collect(Collectors.maxBy(Comparator.comparing(Employee::getSalary)))
+ *                                     .get();
  *
  *     // Group employees by department
  *     Map<Department, List<Employee>> byDept
@@ -85,7 +89,7 @@
  *                    .collect(Collectors.groupingBy(Employee::getDepartment));
  *
  *     // Find highest-paid employee by department
- *     Map<Department, Employee> highestPaidByDept
+ *     Map<Department, Optional<Employee>> highestPaidByDept
  *         = employees.stream()
  *                    .collect(Collectors.groupingBy(Employee::getDepartment,
  *                                                   Collectors.maxBy(Comparator.comparing(Employee::getSalary))));
@@ -93,7 +97,7 @@
  *     // Partition students into passing and failing
  *     Map<Boolean, List<Student>> passingFailing =
  *         students.stream()
- *                 .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD);
+ *                 .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));
  *
  * }</pre>
  *
@@ -103,15 +107,19 @@
  */
 public final class Collectors {
 
-    private static final Set<Collector.Characteristics> CH_CONCURRENT
+    static final Set<Collector.Characteristics> CH_CONCURRENT_ID
             = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.CONCURRENT,
-                                                     Collector.Characteristics.STRICTLY_MUTATIVE,
+                                                     Collector.Characteristics.UNORDERED,
+                                                     Collector.Characteristics.IDENTITY_FINISH));
+    static final Set<Collector.Characteristics> CH_CONCURRENT_NOID
+            = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.CONCURRENT,
                                                      Collector.Characteristics.UNORDERED));
-    private static final Set<Collector.Characteristics> CH_STRICT
-            = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.STRICTLY_MUTATIVE));
-    private static final Set<Collector.Characteristics> CH_STRICT_UNORDERED
-            = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.STRICTLY_MUTATIVE,
-                                                     Collector.Characteristics.UNORDERED));
+    static final Set<Collector.Characteristics> CH_ID
+            = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH));
+    static final Set<Collector.Characteristics> CH_UNORDERED_ID
+            = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.UNORDERED,
+                                                     Collector.Characteristics.IDENTITY_FINISH));
+    static final Set<Collector.Characteristics> CH_NOID = Collections.emptySet();
 
     private Collectors() { }
 
@@ -124,88 +132,64 @@
      *
      * @param <T> the type of input arguments to the merge function
      * @return a merge function which always throw {@code IllegalStateException}
-     *
-     * @see #firstWinsMerger()
-     * @see #lastWinsMerger()
      */
-    public static <T> BinaryOperator<T> throwingMerger() {
+    private static <T> BinaryOperator<T> throwingMerger() {
         return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); };
     }
 
     /**
-     * Returns a merge function, suitable for use in
-     * {@link Map#merge(Object, Object, BiFunction) Map.merge()} or
-     * {@link #toMap(Function, Function, BinaryOperator) toMap()},
-     * which implements a "first wins" policy.
-     *
-     * @param <T> the type of input arguments to the merge function
-     * @return a merge function which always returns its first argument
-     * @see #lastWinsMerger()
-     * @see #throwingMerger()
-     */
-    public static <T> BinaryOperator<T> firstWinsMerger() {
-        return (u,v) -> u;
-    }
-
-    /**
-     * Returns a merge function, suitable for use in
-     * {@link Map#merge(Object, Object, BiFunction) Map.merge()} or
-     * {@link #toMap(Function, Function, BinaryOperator) toMap()},
-     * which implements a "last wins" policy.
-     *
-     * @param <T> the type of input arguments to the merge function
-     * @return a merge function which always returns its second argument
-     * @see #firstWinsMerger()
-     * @see #throwingMerger()
-     */
-    public static <T> BinaryOperator<T> lastWinsMerger() {
-        return (u,v) -> v;
-    }
-
-    /**
      * Simple implementation class for {@code Collector}.
      *
      * @param <T> the type of elements to be collected
      * @param <R> the type of the result
      */
-    private static final class CollectorImpl<T, R> implements Collector<T,R> {
-        private final Supplier<R> resultSupplier;
-        private final BiFunction<R, T, R> accumulator;
-        private final BinaryOperator<R> combiner;
+    static class CollectorImpl<T, A, R> implements Collector<T, A, R> {
+        private final Supplier<A> supplier;
+        private final BiConsumer<A, T> accumulator;
+        private final BinaryOperator<A> combiner;
+        private final Function<A, R> finisher;
         private final Set<Characteristics> characteristics;
 
-        CollectorImpl(Supplier<R> resultSupplier,
-                      BiFunction<R, T, R> accumulator,
-                      BinaryOperator<R> combiner,
+        CollectorImpl(Supplier<A> supplier,
+                      BiConsumer<A, T> accumulator,
+                      BinaryOperator<A> combiner,
+                      Function<A,R> finisher,
                       Set<Characteristics> characteristics) {
-            this.resultSupplier = resultSupplier;
+            this.supplier = supplier;
             this.accumulator = accumulator;
             this.combiner = combiner;
+            this.finisher = finisher;
             this.characteristics = characteristics;
         }
 
-        CollectorImpl(Supplier<R> resultSupplier,
-                      BiFunction<R, T, R> accumulator,
-                      BinaryOperator<R> combiner) {
-            this(resultSupplier, accumulator, combiner, Collections.emptySet());
+        CollectorImpl(Supplier<A> supplier,
+                      BiConsumer<A, T> accumulator,
+                      BinaryOperator<A> combiner,
+                      Set<Characteristics> characteristics) {
+            this(supplier, accumulator, combiner, i -> (R) i, characteristics);
         }
 
         @Override
-        public BiFunction<R, T, R> accumulator() {
+        public BiConsumer<A, T> accumulator() {
             return accumulator;
         }
 
         @Override
-        public Supplier<R> resultSupplier() {
-            return resultSupplier;
+        public Supplier<A> supplier() {
+            return supplier;
         }
 
         @Override
-        public BinaryOperator<R> combiner() {
+        public BinaryOperator<A> combiner() {
             return combiner;
         }
 
         @Override
+        public Function<A, R> finisher() {
+            return finisher;
+        }
+
+        @Override
         public Set<Characteristics> characteristics() {
             return characteristics;
         }
@@ -224,11 +208,10 @@
      * {@code Collection}, in encounter order
      */
     public static <T, C extends Collection<T>>
-    Collector<T, C> toCollection(Supplier<C> collectionFactory) {
-        return new CollectorImpl<>(collectionFactory,
-                                   (r, t) -> { r.add(t); return r; },
+    Collector<T, ?, C> toCollection(Supplier<C> collectionFactory) {
+        return new CollectorImpl<>(collectionFactory, Collection::add,
                                    (r1, r2) -> { r1.addAll(r2); return r1; },
-                                   CH_STRICT);
+                                   CH_ID);
     }
 
     /**
@@ -241,36 +224,10 @@
      * {@code List}, in encounter order
      */
     public static <T>
-    Collector<T, List<T>> toList() {
-        BiFunction<List<T>, T, List<T>> accumulator = (list, t) -> {
-            switch (list.size()) {
-                case 0:
-                    return Collections.singletonList(t);
-                case 1:
-                    List<T> newList = new ArrayList<>();
-                    newList.add(list.get(0));
-                    newList.add(t);
-                    return newList;
-                default:
-                    list.add(t);
-                    return list;
-            }
-        };
-        BinaryOperator<List<T>> combiner = (left, right) -> {
-            switch (left.size()) {
-                case 0:
-                    return right;
-                case 1:
-                    List<T> newList = new ArrayList<>(left.size() + right.size());
-                    newList.addAll(left);
-                    newList.addAll(right);
-                    return newList;
-                default:
-                    left.addAll(right);
-                    return left;
-            }
-        };
-        return new CollectorImpl<>(Collections::emptyList, accumulator, combiner);
+    Collector<T, ?, List<T>> toList() {
+        return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
+                                   (left, right) -> { left.addAll(right); return left; },
+                                   CH_ID);
     }
 
     /**
@@ -286,44 +243,58 @@
      * {@code Set}
      */
     public static <T>
-    Collector<T, Set<T>> toSet() {
-        return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new,
-                                   (r, t) -> { r.add(t); return r; },
-                                   (r1, r2) -> { r1.addAll(r2); return r1; },
-                                   CH_STRICT_UNORDERED);
+    Collector<T, ?, Set<T>> toSet() {
+        return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add,
+                                   (left, right) -> { left.addAll(right); return left; },
+                                   CH_UNORDERED_ID);
     }
 
     /**
      * Returns a {@code Collector} that concatenates the input elements into a
-     * new {@link StringBuilder}.
+     * {@code String}, in encounter order.
      *
-     * @return a {@code Collector} which collects String elements into a
-     * {@code StringBuilder}, in encounter order
+     * @return a {@code Collector} that concatenates the input elements into a
+     * {@code String}, in encounter order
      */
-    public static Collector<String, StringBuilder> toStringBuilder() {
-        return new CollectorImpl<>(StringBuilder::new,
-                                   (r, t) -> { r.append(t); return r; },
-                                   (r1, r2) -> { r1.append(r2); return r1; },
-                                   CH_STRICT);
+    public static Collector<CharSequence, ?, String> joining() {
+        return new CollectorImpl<CharSequence, StringBuilder, String>(
+                StringBuilder::new, StringBuilder::append,
+                (r1, r2) -> { r1.append(r2); return r1; },
+                StringBuilder::toString, CH_NOID);
     }
 
     /**
-     * Returns a {@code Collector} that concatenates the input elements into a
-     * new {@link StringJoiner}, using the specified delimiter.
+     * Returns a {@code Collector} that concatenates the input elements,
+     * separated by the specified delimiter, in encounter order.
      *
      * @param delimiter the delimiter to be used between each element
-     * @return A {@code Collector} which collects String elements into a
-     * {@code StringJoiner}, in encounter order
+     * @return A {@code Collector} which concatenates CharSequence elements,
+     * separated by the specified delimiter, in encounter order
      */
-    public static Collector<CharSequence, StringJoiner> toStringJoiner(CharSequence delimiter) {
-        BinaryOperator<StringJoiner> merger = (sj, other) -> {
-            if (other.length() > 0)
-                sj.add(other.toString());
-            return sj;
-        };
-        return new CollectorImpl<>(() -> new StringJoiner(delimiter),
-                                   (r, t) -> { r.add(t); return r; },
-                                   merger, CH_STRICT);
+    public static Collector<CharSequence, ?, String> joining(CharSequence delimiter) {
+        return joining(delimiter, "", "");
+    }
+
+    /**
+     * Returns a {@code Collector} that concatenates the input elements,
+     * separated by the specified delimiter, with the specified prefix and
+     * suffix, in encounter order.
+     *
+     * @param delimiter the delimiter to be used between each element
+     * @param  prefix the sequence of characters to be used at the beginning
+     *                of the joined result
+     * @param  suffix the sequence of characters to be used at the end
+     *                of the joined result
+     * @return A {@code Collector} which concatenates CharSequence elements,
+     * separated by the specified delimiter, in encounter order
+     */
+    public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
+                                                             CharSequence prefix,
+                                                             CharSequence suffix) {
+        return new CollectorImpl<>(
+                () -> new StringJoiner(delimiter, prefix, suffix),
+                StringJoiner::add, StringJoiner::merge,
+                StringJoiner::toString, CH_NOID);
     }
 
     /**
@@ -348,12 +319,13 @@
     }
 
     /**
-     * Adapts a {@code Collector<U,R>} to a {@code Collector<T,R>} by applying
-     * a mapping function to each input element before accumulation.
+     * Adapts a {@code Collector} accepting elements of type {@code U} to one
+     * accepting elements of type {@code T} by applying a mapping function to
+     * each input element before accumulation.
      *
      * @apiNote
      * The {@code mapping()} collectors are most useful when used in a
-     * multi-level reduction, downstream of {@code groupingBy} or
+     * multi-level reduction, such as downstream of a {@code groupingBy} or
      * {@code partitioningBy}.  For example, given a stream of
      * {@code Person}, to accumulate the set of last names in each city:
      * <pre>{@code
@@ -364,23 +336,27 @@
      *
      * @param <T> the type of the input elements
      * @param <U> type of elements accepted by downstream collector
+     * @param <A> intermediate accumulation type of the downstream collector
      * @param <R> result type of collector
      * @param mapper a function to be applied to the input elements
      * @param downstream a collector which will accept mapped values
      * @return a collector which applies the mapping function to the input
      * elements and provides the mapped results to the downstream collector
      */
-    public static <T, U, R> Collector<T, R>
-    mapping(Function<? super T, ? extends U> mapper, Collector<? super U, R> downstream) {
-        BiFunction<R, ? super U, R> downstreamAccumulator = downstream.accumulator();
-        return new CollectorImpl<>(downstream.resultSupplier(),
-                                   (r, t) -> downstreamAccumulator.apply(r, mapper.apply(t)),
-                                   downstream.combiner(), downstream.characteristics());
+    public static <T, U, A, R>
+    Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper,
+                               Collector<? super U, A, R> downstream) {
+        BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator();
+        return new CollectorImpl<>(downstream.supplier(),
+                                   (r, t) -> downstreamAccumulator.accept(r, mapper.apply(t)),
+                                   downstream.combiner(), downstream.finisher(),
+                                   downstream.characteristics());
     }
 
     /**
-     * Returns a {@code Collector<T, Long>} that counts the number of input
-     * elements.
+     * Returns a {@code Collector} accepting elements of type {@code T} that
+     * counts the number of input elements.  If no elements are present, the
+     * result is 0.
      *
      * @implSpec
      * This produces a result equivalent to:
@@ -391,14 +367,14 @@
      * @param <T> the type of the input elements
      * @return a {@code Collector} that counts the input elements
      */
-    public static <T> Collector<T, Long>
+    public static <T> Collector<T, ?, Long>
     counting() {
         return reducing(0L, e -> 1L, Long::sum);
     }
 
     /**
-     * Returns a {@code Collector<T, T>} that produces the minimal element
-     * according to a given {@code Comparator}.
+     * Returns a {@code Collector} that produces the minimal element according
+     * to a given {@code Comparator}, described as an {@code Optional<T>}.
      *
      * @implSpec
      * This produces a result equivalent to:
@@ -410,14 +386,14 @@
      * @param comparator a {@code Comparator} for comparing elements
      * @return a {@code Collector} that produces the minimal value
      */
-    public static <T> Collector<T, T>
+    public static <T> Collector<T, ?, Optional<T>>
     minBy(Comparator<? super T> comparator) {
         return reducing(BinaryOperator.minBy(comparator));
     }
 
     /**
-     * Returns a {@code Collector<T, T>} that produces the maximal element
-     * according to a given {@code Comparator}.
+     * Returns a {@code Collector} that produces the maximal element according
+     * to a given {@code Comparator}, described as an {@code Optional<T>}.
      *
      * @implSpec
      * This produces a result equivalent to:
@@ -429,39 +405,143 @@
      * @param comparator a {@code Comparator} for comparing elements
      * @return a {@code Collector} that produces the maximal value
      */
-    public static <T> Collector<T, T>
+    public static <T> Collector<T, ?, Optional<T>>
     maxBy(Comparator<? super T> comparator) {
         return reducing(BinaryOperator.maxBy(comparator));
     }
 
     /**
-     * Returns a {@code Collector<T, Long>} that produces the sum of a
-     * long-valued function applied to the input element.
+     * Returns a {@code Collector} that produces the sum of a integer-valued
+     * function applied to the input elements.  If no elements are present,
+     * the result is 0.
+     *
+     * @param <T> the type of the input elements
+     * @param mapper a function extracting the property to be summed
+     * @return a {@code Collector} that produces the sum of a derived property
+     */
+    public static <T> Collector<T, ?, Integer>
+    summingInt(ToIntFunction<? super T> mapper) {
+        return new CollectorImpl<T, int[], Integer>(
+                () -> new int[1],
+                (a, t) -> { a[0] += mapper.applyAsInt(t); },
+                (a, b) -> { a[0] += b[0]; return a; },
+                a -> a[0], CH_NOID);
+    }
+
+    /**
+     * Returns a {@code Collector} that produces the sum of a long-valued
+     * function applied to the input elements.  If no elements are present,
+     * the result is 0.
      *
-     * @implSpec
-     * This produces a result equivalent to:
-     * <pre>{@code
-     *     reducing(0L, mapper, Long::sum)
-     * }</pre>
+     * @param <T> the type of the input elements
+     * @param mapper a function extracting the property to be summed
+     * @return a {@code Collector} that produces the sum of a derived property
+     */
+    public static <T> Collector<T, ?, Long>
+    summingLong(ToLongFunction<? super T> mapper) {
+        return new CollectorImpl<T, long[], Long>(
+                () -> new long[1],
+                (a, t) -> { a[0] += mapper.applyAsLong(t); },
+                (a, b) -> { a[0] += b[0]; return a; },
+                a -> a[0], CH_NOID);
+    }
+
+    /**
+     * Returns a {@code Collector} that produces the sum of a double-valued
+     * function applied to the input elements.  If no elements are present,
+     * the result is 0.
+     *
+     * <p>The sum returned can vary depending upon the order in which
+     * values are recorded, due to accumulated rounding error in
+     * addition of values of differing magnitudes. Values sorted by increasing
+     * absolute magnitude tend to yield more accurate results.  If any recorded
+     * value is a {@code NaN} or the sum is at any point a {@code NaN} then the
+     * sum will be {@code NaN}.
      *
      * @param <T> the type of the input elements
      * @param mapper a function extracting the property to be summed
      * @return a {@code Collector} that produces the sum of a derived property
      */
-    public static <T> Collector<T, Long>
-    sumBy(Function<? super T, Long> mapper) {
-        return reducing(0L, mapper, Long::sum);
+    public static <T> Collector<T, ?, Double>
+    summingDouble(ToDoubleFunction<? super T> mapper) {
+        return new CollectorImpl<T, double[], Double>(
+                () -> new double[1],
+                (a, t) -> { a[0] += mapper.applyAsDouble(t); },
+                (a, b) -> { a[0] += b[0]; return a; },
+                a -> a[0], CH_NOID);
+    }
+
+    /**
+     * Returns a {@code Collector} that produces the arithmetic mean of an integer-valued
+     * function applied to the input elements.  If no elements are present,
+     * the result is 0.
+     *
+     * @param <T> the type of the input elements
+     * @param mapper a function extracting the property to be summed
+     * @return a {@code Collector} that produces the sum of a derived property
+     */
+    public static <T> Collector<T, ?, Double>
+    averagingInt(ToIntFunction<? super T> mapper) {
+        return new CollectorImpl<T, long[], Double>(
+                () -> new long[2],
+                (a, t) -> { a[0] += mapper.applyAsInt(t); a[1]++; },
+                (a, b) -> { a[0] += b[0]; a[1] += b[1]; return a; },
+                a -> (a[1] == 0) ? 0.0d : (double) a[0] / a[1], CH_NOID);
     }
 
     /**
-     * Returns a {@code Collector<T,T>} which performs a reduction of its
-     * input elements under a specified {@code BinaryOperator}.
+     * Returns a {@code Collector} that produces the arithmetic mean of a long-valued
+     * function applied to the input elements.  If no elements are present,
+     * the result is 0.
+     *
+     * @param <T> the type of the input elements
+     * @param mapper a function extracting the property to be summed
+     * @return a {@code Collector} that produces the sum of a derived property
+     */
+    public static <T> Collector<T, ?, Double>
+    averagingLong(ToLongFunction<? super T> mapper) {
+        return new CollectorImpl<T, long[], Double>(
+                () -> new long[2],
+                (a, t) -> { a[0] += mapper.applyAsLong(t); a[1]++; },
+                (a, b) -> { a[0] += b[0]; a[1] += b[1]; return a; },
+                a -> (a[1] == 0) ? 0.0d : (double) a[0] / a[1], CH_NOID);
+    }
+
+    /**
+     * Returns a {@code Collector} that produces the arithmetic mean of a double-valued
+     * function applied to the input elements.  If no elements are present,
+     * the result is 0.
+     *
+     * <p>The average returned can vary depending upon the order in which
+     * values are recorded, due to accumulated rounding error in
+     * addition of values of differing magnitudes. Values sorted by increasing
+     * absolute magnitude tend to yield more accurate results.  If any recorded
+     * value is a {@code NaN} or the sum is at any point a {@code NaN} then the
+     * average will be {@code NaN}.
+     *
+     * @param <T> the type of the input elements
+     * @param mapper a function extracting the property to be summed
+     * @return a {@code Collector} that produces the sum of a derived property
+     */
+    public static <T> Collector<T, ?, Double>
+    averagingDouble(ToDoubleFunction<? super T> mapper) {
+        return new CollectorImpl<T, double[], Double>(
+                () -> new double[2],
+                (a, t) -> { a[0] += mapper.applyAsDouble(t); a[1]++; },
+                (a, b) -> { a[0] += b[0]; a[1] += b[1]; return a; },
+                a -> (a[1] == 0) ? 0.0d : a[0] / a[1], CH_NOID);
+    }
+
+    /**
+     * Returns a {@code Collector} which performs a reduction of its
+     * input elements under a specified {@code BinaryOperator} using the
+     * provided identity.
      *
      * @apiNote
      * The {@code reducing()} collectors are most useful when used in a
      * multi-level reduction, downstream of {@code groupingBy} or
      * {@code partitioningBy}.  To perform a simple reduction on a stream,
-     * use {@link Stream#reduce(BinaryOperator)} instead.
+     * use {@link Stream#reduce(Object, BinaryOperator)}} instead.
      *
      * @param <T> element type for the input and output of the reduction
      * @param identity the identity value for the reduction (also, the value
@@ -472,14 +552,25 @@
      * @see #reducing(BinaryOperator)
      * @see #reducing(Object, Function, BinaryOperator)
      */
-    public static <T> Collector<T, T>
+    public static <T> Collector<T, ?, T>
     reducing(T identity, BinaryOperator<T> op) {
-        return new CollectorImpl<>(() -> identity, (r, t) -> (r == null ? t : op.apply(r, t)), op);
+        return new CollectorImpl<>(
+                boxSupplier(identity),
+                (a, t) -> { a[0] = op.apply(a[0], t); },
+                (a, b) -> { a[0] = op.apply(a[0], b[0]); return a; },
+                a -> a[0],
+                CH_NOID);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static <T> Supplier<T[]> boxSupplier(T identity) {
+        return () -> (T[]) new Object[] { identity };
     }
 
     /**
-     * Returns a {@code Collector<T,T>} which performs a reduction of its
-     * input elements under a specified {@code BinaryOperator}.
+     * Returns a {@code Collector} which performs a reduction of its
+     * input elements under a specified {@code BinaryOperator}.  The result
+     * is described as an {@code Optional<T>}.
      *
      * @apiNote
      * The {@code reducing()} collectors are most useful when used in a
@@ -491,15 +582,8 @@
      * person in each city:
      * <pre>{@code
      *     Comparator<Person> byHeight = Comparator.comparing(Person::getHeight);
-     *     BinaryOperator<Person> tallerOf = BinaryOperator.greaterOf(byHeight);
      *     Map<City, Person> tallestByCity
-     *         = people.stream().collect(groupingBy(Person::getCity, reducing(tallerOf)));
-     * }</pre>
-     *
-     * @implSpec
-     * The default implementation is equivalent to:
-     * <pre>{@code
-     *     reducing(null, op);
+     *         = people.stream().collect(groupingBy(Person::getCity, reducing(BinaryOperator.maxBy(byHeight))));
      * }</pre>
      *
      * @param <T> element type for the input and output of the reduction
@@ -509,13 +593,32 @@
      * @see #reducing(Object, BinaryOperator)
      * @see #reducing(Object, Function, BinaryOperator)
      */
-    public static <T> Collector<T, T>
+    public static <T> Collector<T, ?, Optional<T>>
     reducing(BinaryOperator<T> op) {
-        return reducing(null, op);
+        class OptionalBox implements Consumer<T> {
+            T value = null;
+            boolean present = false;
+
+            @Override
+            public void accept(T t) {
+                if (present) {
+                    value = op.apply(value, t);
+                }
+                else {
+                    value = t;
+                    present = true;
+                }
+            }
+        }
+
+        return new CollectorImpl<T, OptionalBox, Optional<T>>(
+                OptionalBox::new, OptionalBox::accept,
+                (a, b) -> { if (b.present) a.accept(b.value); return a; },
+                a -> Optional.ofNullable(a.value), CH_NOID);
     }
 
     /**
-     * Returns a {@code Collector<T,U>} which performs a reduction of its
+     * Returns a {@code Collector} which performs a reduction of its
      * input elements under a specified mapping function and
      * {@code BinaryOperator}. This is a generalization of
      * {@link #reducing(Object, BinaryOperator)} which allows a transformation
@@ -524,17 +627,17 @@
      * @apiNote
      * The {@code reducing()} collectors are most useful when used in a
      * multi-level reduction, downstream of {@code groupingBy} or
-     * {@code partitioningBy}.  To perform a simple reduction on a stream,
-     * use {@link Stream#reduce(BinaryOperator)} instead.
+     * {@code partitioningBy}.  To perform a simple map-reduce on a stream,
+     * use {@link Stream#map(Function)} and {@link Stream#reduce(Object, BinaryOperator)}
+     * instead.
      *
      * <p>For example, given a stream of {@code Person}, to calculate the longest
      * last name of residents in each city:
      * <pre>{@code
      *     Comparator<String> byLength = Comparator.comparing(String::length);
-     *     BinaryOperator<String> longerOf = BinaryOperator.greaterOf(byLength);
      *     Map<City, String> longestLastNameByCity
      *         = people.stream().collect(groupingBy(Person::getCity,
-     *                                              reducing(Person::getLastName, longerOf)));
+     *                                              reducing(Person::getLastName, BinaryOperator.maxBy(byLength))));
      * }</pre>
      *
      * @param <T> the type of the input elements
@@ -549,18 +652,20 @@
      * @see #reducing(BinaryOperator)
      */
     public static <T, U>
-    Collector<T, U> reducing(U identity,
-                             Function<? super T, ? extends U> mapper,
-                             BinaryOperator<U> op) {
-        return new CollectorImpl<>(() -> identity,
-                                   (r, t) -> (r == null ? mapper.apply(t) : op.apply(r, mapper.apply(t))),
-                                   op);
+    Collector<T, ?, U> reducing(U identity,
+                                Function<? super T, ? extends U> mapper,
+                                BinaryOperator<U> op) {
+        return new CollectorImpl<>(
+                boxSupplier(identity),
+                (a, t) -> { a[0] = op.apply(a[0], mapper.apply(t)); },
+                (a, b) -> { a[0] = op.apply(a[0], b[0]); return a; },
+                a -> a[0], CH_NOID);
     }
 
     /**
      * Returns a {@code Collector} implementing a "group by" operation on
      * input elements of type {@code T}, grouping elements according to a
-     * classification function.
+     * classification function, and returning the results in a {@code Map}.
      *
      * <p>The classification function maps elements to some key type {@code K}.
      * The collector produces a {@code Map<K, List<T>>} whose keys are the
@@ -586,9 +691,9 @@
      * @see #groupingBy(Function, Supplier, Collector)
      * @see #groupingByConcurrent(Function)
      */
-    public static <T, K>
-    Collector<T, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier) {
-        return groupingBy(classifier, HashMap::new, toList());
+    public static <T, K> Collector<T, ?, Map<K, List<T>>>
+    groupingBy(Function<? super T, ? extends K> classifier) {
+        return groupingBy(classifier, toList());
     }
 
     /**
@@ -615,6 +720,7 @@
      *
      * @param <T> the type of the input elements
      * @param <K> the type of the keys
+     * @param <A> the intermediate accumulation type of the downstream collector
      * @param <D> the result type of the downstream reduction
      * @param classifier a classifier function mapping input elements to keys
      * @param downstream a {@code Collector} implementing the downstream reduction
@@ -624,9 +730,9 @@
      * @see #groupingBy(Function, Supplier, Collector)
      * @see #groupingByConcurrent(Function, Collector)
      */
-    public static <T, K, D>
-    Collector<T, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier,
-                                       Collector<? super T, D> downstream) {
+    public static <T, K, A, D>
+    Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier,
+                                          Collector<? super T, A, D> downstream) {
         return groupingBy(classifier, HashMap::new, downstream);
     }
 
@@ -653,6 +759,7 @@
      *
      * @param <T> the type of the input elements
      * @param <K> the type of the keys
+     * @param <A> the intermediate accumulation type of the downstream collector
      * @param <D> the result type of the downstream reduction
      * @param <M> the type of the resulting {@code Map}
      * @param classifier a classifier function mapping input elements to keys
@@ -665,25 +772,39 @@
      * @see #groupingBy(Function)
      * @see #groupingByConcurrent(Function, Supplier, Collector)
      */
-    public static <T, K, D, M extends Map<K, D>>
-    Collector<T, M> groupingBy(Function<? super T, ? extends K> classifier,
-                               Supplier<M> mapFactory,
-                               Collector<? super T, D> downstream) {
-        Supplier<D> downstreamSupplier = downstream.resultSupplier();
-        BiFunction<D, ? super T, D> downstreamAccumulator = downstream.accumulator();
-        BiFunction<M, T, M> accumulator = (m, t) -> {
+    public static <T, K, D, A, M extends Map<K, D>>
+    Collector<T, ?, M> groupingBy(Function<? super T, ? extends K> classifier,
+                                  Supplier<M> mapFactory,
+                                  Collector<? super T, A, D> downstream) {
+        Supplier<A> downstreamSupplier = downstream.supplier();
+        BiConsumer<A, ? super T> downstreamAccumulator = downstream.accumulator();
+        BiConsumer<Map<K, A>, T> accumulator = (m, t) -> {
             K key = Objects.requireNonNull(classifier.apply(t), "element cannot be mapped to a null key");
-            D oldContainer = m.computeIfAbsent(key, k -> downstreamSupplier.get());
-            D newContainer = downstreamAccumulator.apply(oldContainer, t);
-            if (newContainer != oldContainer)
-                m.put(key, newContainer);
-            return m;
+            A container = m.computeIfAbsent(key, k -> downstreamSupplier.get());
+            downstreamAccumulator.accept(container, t);
         };
-        return new CollectorImpl<>(mapFactory, accumulator, mapMerger(downstream.combiner()), CH_STRICT);
+        BinaryOperator<Map<K, A>> merger = Collectors.<K, A, Map<K, A>>mapMerger(downstream.combiner());
+        @SuppressWarnings("unchecked")
+        Supplier<Map<K, A>> mangledFactory = (Supplier<Map<K, A>>) mapFactory;
+
+        if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) {
+            return new CollectorImpl<>(mangledFactory, accumulator, merger, CH_ID);
+        }
+        else {
+            @SuppressWarnings("unchecked")
+            Function<A, A> downstreamFinisher = (Function<A, A>) downstream.finisher();
+            Function<Map<K, A>, M> finisher = intermediate -> {
+                intermediate.replaceAll((k, v) -> downstreamFinisher.apply(v));
+                @SuppressWarnings("unchecked")
+                M castResult = (M) intermediate;
+                return castResult;
+            };
+            return new CollectorImpl<>(mangledFactory, accumulator, merger, finisher, CH_NOID);
+        }
     }
 
     /**
-     * Returns a {@code Collector} implementing a concurrent "group by"
+     * Returns a concurrent {@code Collector} implementing a "group by"
      * operation on input elements of type {@code T}, grouping elements
      * according to a classification function.
      *
@@ -716,12 +837,13 @@
      * @see #groupingByConcurrent(Function, Supplier, Collector)
      */
     public static <T, K>
-    Collector<T, ConcurrentMap<K, List<T>>> groupingByConcurrent(Function<? super T, ? extends K> classifier) {
+    Collector<T, ?, ConcurrentMap<K, List<T>>>
+    groupingByConcurrent(Function<? super T, ? extends K> classifier) {
         return groupingByConcurrent(classifier, ConcurrentHashMap::new, toList());
     }
 
     /**
-     * Returns a {@code Collector} implementing a concurrent cascaded "group by"
+     * Returns a concurrent {@code Collector} implementing a cascaded "group by"
      * operation on input elements of type {@code T}, grouping elements
      * according to a classification function, and then performing a reduction
      * operation on the values associated with a given key using the specified
@@ -739,12 +861,13 @@
      * where the city names are sorted:
      * <pre>{@code
      *     ConcurrentMap<City, Set<String>> namesByCity
-     *         = people.stream().collect(groupingByConcurrent(Person::getCity, TreeMap::new,
+     *         = people.stream().collect(groupingByConcurrent(Person::getCity, ConcurrentSkipListMap::new,
      *                                                        mapping(Person::getLastName, toSet())));
      * }</pre>
      *
      * @param <T> the type of the input elements
      * @param <K> the type of the keys
+     * @param <A> the intermediate accumulation type of the downstream collector
      * @param <D> the result type of the downstream reduction
      * @param classifier a classifier function mapping input elements to keys
      * @param downstream a {@code Collector} implementing the downstream reduction
@@ -754,9 +877,9 @@
      * @see #groupingByConcurrent(Function)
      * @see #groupingByConcurrent(Function, Supplier, Collector)
      */
-    public static <T, K, D>
-    Collector<T, ConcurrentMap<K, D>> groupingByConcurrent(Function<? super T, ? extends K> classifier,
-                                                           Collector<? super T, D> downstream) {
+    public static <T, K, A, D>
+    Collector<T, ?, ConcurrentMap<K, D>> groupingByConcurrent(Function<? super T, ? extends K> classifier,
+                                                              Collector<? super T, A, D> downstream) {
         return groupingByConcurrent(classifier, ConcurrentHashMap::new, downstream);
     }
 
@@ -787,6 +910,7 @@
      *
      * @param <T> the type of the input elements
      * @param <K> the type of the keys
+     * @param <A> the intermediate accumulation type of the downstream collector
      * @param <D> the result type of the downstream reduction
      * @param <M> the type of the resulting {@code ConcurrentMap}
      * @param classifier a classifier function mapping input elements to keys
@@ -799,51 +923,46 @@
      * @see #groupingByConcurrent(Function, Collector)
      * @see #groupingBy(Function, Supplier, Collector)
      */
-    public static <T, K, D, M extends ConcurrentMap<K, D>>
-    Collector<T, M> groupingByConcurrent(Function<? super T, ? extends K> classifier,
-                                         Supplier<M> mapFactory,
-                                         Collector<? super T, D> downstream) {
-        Supplier<D> downstreamSupplier = downstream.resultSupplier();
-        BiFunction<D, ? super T, D> downstreamAccumulator = downstream.accumulator();
-        BinaryOperator<M> combiner = mapMerger(downstream.combiner());
+    public static <T, K, A, D, M extends ConcurrentMap<K, D>>
+    Collector<T, ?, M> groupingByConcurrent(Function<? super T, ? extends K> classifier,
+                                            Supplier<M> mapFactory,
+                                            Collector<? super T, A, D> downstream) {
+        Supplier<A> downstreamSupplier = downstream.supplier();
+        BiConsumer<A, ? super T> downstreamAccumulator = downstream.accumulator();
+        BinaryOperator<ConcurrentMap<K, A>> merger = Collectors.<K, A, ConcurrentMap<K, A>>mapMerger(downstream.combiner());
+        @SuppressWarnings("unchecked")
+        Supplier<ConcurrentMap<K, A>> mangledFactory = (Supplier<ConcurrentMap<K, A>>) mapFactory;
+        BiConsumer<ConcurrentMap<K, A>, T> accumulator;
         if (downstream.characteristics().contains(Collector.Characteristics.CONCURRENT)) {
-            BiFunction<M, T, M> accumulator = (m, t) -> {
+            accumulator = (m, t) -> {
                 K key = Objects.requireNonNull(classifier.apply(t), "element cannot be mapped to a null key");
-                downstreamAccumulator.apply(m.computeIfAbsent(key, k -> downstreamSupplier.get()), t);
-                return m;
-            };
-            return new CollectorImpl<>(mapFactory, accumulator, combiner, CH_CONCURRENT);
-        } else if (downstream.characteristics().contains(Collector.Characteristics.STRICTLY_MUTATIVE)) {
-            BiFunction<M, T, M> accumulator = (m, t) -> {
-                K key = Objects.requireNonNull(classifier.apply(t), "element cannot be mapped to a null key");
-                D resultContainer = m.computeIfAbsent(key, k -> downstreamSupplier.get());
-                synchronized (resultContainer) {
-                    downstreamAccumulator.apply(resultContainer, t);
-                }
-                return m;
+                A resultContainer = m.computeIfAbsent(key, k -> downstreamSupplier.get());
+                downstreamAccumulator.accept(resultContainer, t);
             };
-            return new CollectorImpl<>(mapFactory, accumulator, combiner, CH_CONCURRENT);
-        } else {
-            BiFunction<M, T, M> accumulator = (m, t) -> {
+        }
+        else {
+            accumulator = (m, t) -> {
                 K key = Objects.requireNonNull(classifier.apply(t), "element cannot be mapped to a null key");
-                do {
-                    D oldResult = m.computeIfAbsent(key, k -> downstreamSupplier.get());
-                    if (oldResult == null) {
-                        if (m.putIfAbsent(key, downstreamAccumulator.apply(null, t)) == null)
-                            return m;
-                    } else {
-                        synchronized (oldResult) {
-                            if (m.get(key) != oldResult)
-                                continue;
-                            D newResult = downstreamAccumulator.apply(oldResult, t);
-                            if (oldResult != newResult)
-                                m.put(key, newResult);
-                            return m;
-                        }
-                    }
-                } while (true);
+                A resultContainer = m.computeIfAbsent(key, k -> downstreamSupplier.get());
+                synchronized (resultContainer) {
+                    downstreamAccumulator.accept(resultContainer, t);
+                }
             };
-            return new CollectorImpl<>(mapFactory, accumulator, combiner, CH_CONCURRENT);
+        }
+
+        if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) {
+            return new CollectorImpl<>(mangledFactory, accumulator, merger, CH_CONCURRENT_ID);
+        }
+        else {
+            @SuppressWarnings("unchecked")
+            Function<A, A> downstreamFinisher = (Function<A, A>) downstream.finisher();
+            Function<ConcurrentMap<K, A>, M> finisher = intermediate -> {
+                intermediate.replaceAll((k, v) -> downstreamFinisher.apply(v));
+                @SuppressWarnings("unchecked")
+                M castResult = (M) intermediate;
+                return castResult;
+            };
+            return new CollectorImpl<>(mangledFactory, accumulator, merger, finisher, CH_CONCURRENT_NOID);
         }
     }
 
@@ -862,7 +981,7 @@
      * @see #partitioningBy(Predicate, Collector)
      */
     public static <T>
-    Collector<T, Map<Boolean, List<T>>> partitioningBy(Predicate<? super T> predicate) {
+    Collector<T, ?, Map<Boolean, List<T>>> partitioningBy(Predicate<? super T> predicate) {
         return partitioningBy(predicate, toList());
     }
 
@@ -877,6 +996,7 @@
      * serializability, or thread-safety of the {@code Map} returned.
      *
      * @param <T> the type of the input elements
+     * @param <A> the intermediate accumulation type of the downstream collector
      * @param <D> the result type of the downstream reduction
      * @param predicate a predicate used for classifying input elements
      * @param downstream a {@code Collector} implementing the downstream
@@ -886,52 +1006,43 @@
      *
      * @see #partitioningBy(Predicate)
      */
-    public static <T, D>
-    Collector<T, Map<Boolean, D>> partitioningBy(Predicate<? super T> predicate,
-                                                 Collector<? super T, D> downstream) {
-        BiFunction<D, ? super T, D> downstreamAccumulator = downstream.accumulator();
-        BiFunction<Map<Boolean, D>, T, Map<Boolean, D>> accumulator = (result, t) -> {
+    public static <T, D, A>
+    Collector<T, ?, Map<Boolean, D>> partitioningBy(Predicate<? super T> predicate,
+                                                    Collector<? super T, A, D> downstream) {
+        @SuppressWarnings("unchecked")
+        BiConsumer<D, ? super T> downstreamAccumulator = (BiConsumer<D, ? super T>) downstream.accumulator();
+        BiConsumer<Map<Boolean, A>, T> accumulator = (result, t) -> {
             Partition<D> asPartition = ((Partition<D>) result);
-            if (predicate.test(t)) {
-                D newResult = downstreamAccumulator.apply(asPartition.forTrue, t);
-                if (newResult != asPartition.forTrue)
-                    asPartition.forTrue = newResult;
-            } else {
-                D newResult = downstreamAccumulator.apply(asPartition.forFalse, t);
-                if (newResult != asPartition.forFalse)
-                    asPartition.forFalse = newResult;
-            }
-            return result;
+            downstreamAccumulator.accept(predicate.test(t) ? asPartition.forTrue : asPartition.forFalse, t);
+        };
+        BinaryOperator<A> op = downstream.combiner();
+        BinaryOperator<Map<Boolean, A>> merger = (m1, m2) -> {
+            Partition<A> left = (Partition<A>) m1;
+            Partition<A> right = (Partition<A>) m2;
+            return new Partition<>(op.apply(left.forTrue, right.forTrue),
+                                   op.apply(left.forFalse, right.forFalse));
         };
-        return new CollectorImpl<>(() -> new Partition<>(downstream.resultSupplier().get(),
-                                                         downstream.resultSupplier().get()),
-                                   accumulator, partitionMerger(downstream.combiner()), CH_STRICT);
+        Supplier<Map<Boolean, A>> supplier = () -> new Partition<>(downstream.supplier().get(),
+                                                                   downstream.supplier().get());
+        if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) {
+            return new CollectorImpl<>(supplier, accumulator, merger, CH_ID);
+        }
+        else {
+            Function<Map<Boolean, A>, Map<Boolean, D>> finisher = (Map<Boolean, A> par) -> {
+                Partition<A> asAPartition = (Partition<A>) par;
+                return new Partition<>(downstream.finisher().apply(asAPartition.forTrue),
+                                       downstream.finisher().apply(asAPartition.forFalse));
+            };
+            return new CollectorImpl<>(supplier, accumulator, merger, finisher, CH_NOID);
+        }
     }
 
     /**
-     * Merge function for two partitions, given a merge function for the
-     * elements.
-     */
-    private static <D> BinaryOperator<Map<Boolean, D>> partitionMerger(BinaryOperator<D> op) {
-        return (m1, m2) -> {
-            Partition<D> left = (Partition<D>) m1;
-            Partition<D> right = (Partition<D>) m2;
-            if (left.forFalse == null)
-                left.forFalse = right.forFalse;
-            else if (right.forFalse != null)
-                left.forFalse = op.apply(left.forFalse, right.forFalse);
-            if (left.forTrue == null)
-                left.forTrue = right.forTrue;
-            else if (right.forTrue != null)
-                left.forTrue = op.apply(left.forTrue, right.forTrue);
-            return left;
-        };
-    }
-
-    /**
-     * Accumulate elements into a {@code Map} whose keys and values are the
-     * result of applying mapping functions to the input elements.
-     * If the mapped keys contains duplicates (according to
+     * Returns a {@code Collector} that accumulate elements into a
+     * {@code Map} whose keys and values are the result of applying the provided
+     * mapping functions to the input elements.
+     *
+     * <p>If the mapped keys contains duplicates (according to
      * {@link Object#equals(Object)}), an {@code IllegalStateException} is
      * thrown when the collection operation is performed.  If the mapped keys
      * may have duplicates, use {@link #toMap(Function, Function, BinaryOperator)}
@@ -970,24 +1081,26 @@
      * @see #toConcurrentMap(Function, Function)
      */
     public static <T, K, U>
-    Collector<T, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
-                                 Function<? super T, ? extends U> valueMapper) {
+    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
+                                    Function<? super T, ? extends U> valueMapper) {
         return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
     }
 
     /**
-     * Accumulate elements into a {@code Map} whose keys and values are the
-     * result of applying mapping functions to the input elements. If the mapped
+     * Returns a {@code Collector} that accumulate elements into a
+     * {@code Map} whose keys and values are the result of applying the provided
+     * mapping functions to the input elements.
+     *
+     * <p>If the mapped
      * keys contains duplicates (according to {@link Object#equals(Object)}),
      * the value mapping function is applied to each equal element, and the
      * results are merged using the provided merging function.
      *
      * @apiNote
      * There are multiple ways to deal with collisions between multiple elements
-     * mapping to the same key.  There are some predefined merging functions,
-     * such as {@link #throwingMerger()}, {@link #firstWinsMerger()}, and
-     * {@link #lastWinsMerger()}, that implement common policies, or you can
-     * implement custom policies easily.  For example, if you have a stream
+     * mapping to the same key.  The other forms of {@code toMap} simply use
+     * a merge function that throws unconditionally, but you can easily write
+     * more flexible merge policies.  For example, if you have a stream
      * of {@code Person}, and you want to produce a "phone book" mapping name to
      * address, but it is possible that two persons have the same name, you can
      * do as follows to gracefully deals with these collisions, and produce a
@@ -1018,15 +1131,18 @@
      * @see #toConcurrentMap(Function, Function, BinaryOperator)
      */
     public static <T, K, U>
-    Collector<T, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
-                                 Function<? super T, ? extends U> valueMapper,
-                                 BinaryOperator<U> mergeFunction) {
+    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
+                                    Function<? super T, ? extends U> valueMapper,
+                                    BinaryOperator<U> mergeFunction) {
         return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
     }
 
     /**
-     * Accumulate elements into a {@code Map} whose keys and values are the
-     * result of applying mapping functions to the input elements. If the mapped
+     * Returns a {@code Collector} that accumulate elements into a
+     * {@code Map} whose keys and values are the result of applying the provided
+     * mapping functions to the input elements.
+     *
+     * <p>If the mapped
      * keys contains duplicates (according to {@link Object#equals(Object)}),
      * the value mapping function is applied to each equal element, and the
      * results are merged using the provided merging function.  The {@code Map}
@@ -1054,22 +1170,22 @@
      * @see #toConcurrentMap(Function, Function, BinaryOperator, Supplier)
      */
     public static <T, K, U, M extends Map<K, U>>
-    Collector<T, M> toMap(Function<? super T, ? extends K> keyMapper,
-                          Function<? super T, ? extends U> valueMapper,
-                          BinaryOperator<U> mergeFunction,
-                          Supplier<M> mapSupplier) {
-        BiFunction<M, T, M> accumulator
-                = (map, element) -> {
-                      map.merge(keyMapper.apply(element), valueMapper.apply(element), mergeFunction);
-                      return map;
-                  };
-        return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_STRICT);
+    Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
+                                Function<? super T, ? extends U> valueMapper,
+                                BinaryOperator<U> mergeFunction,
+                                Supplier<M> mapSupplier) {
+        BiConsumer<M, T> accumulator
+                = (map, element) -> map.merge(keyMapper.apply(element),
+                                              valueMapper.apply(element), mergeFunction);
+        return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
     }
 
     /**
-     * Accumulate elements into a {@code ConcurrentMap} whose keys and values
-     * are the result of applying mapping functions to the input elements.
-     * If the mapped keys contains duplicates (according to
+     * Returns a {@code Collector} that accumulate elements into a
+     * {@code ConcurrentMap} whose keys and values are the result of applying
+     * the provided mapping functions to the input elements.
+     *
+     * <p>If the mapped keys contains duplicates (according to
      * {@link Object#equals(Object)}), an {@code IllegalStateException} is
      * thrown when the collection operation is performed.  If the mapped keys
      * may have duplicates, use
@@ -1112,24 +1228,25 @@
      * @see #toConcurrentMap(Function, Function, BinaryOperator, Supplier)
      */
     public static <T, K, U>
-    Collector<T, ConcurrentMap<K,U>> toConcurrentMap(Function<? super T, ? extends K> keyMapper,
-                                                     Function<? super T, ? extends U> valueMapper) {
+    Collector<T, ?, ConcurrentMap<K,U>> toConcurrentMap(Function<? super T, ? extends K> keyMapper,
+                                                        Function<? super T, ? extends U> valueMapper) {
         return toConcurrentMap(keyMapper, valueMapper, throwingMerger(), ConcurrentHashMap::new);
     }
 
     /**
-     * Accumulate elements into a {@code ConcurrentMap} whose keys and values
-     * are the result of applying mapping functions to the input elements. If
-     * the mapped keys contains duplicates (according to {@link Object#equals(Object)}),
+     * Returns a {@code Collector} that accumulate elements into a
+     * {@code ConcurrentMap} whose keys and values are the result of applying
+     * the provided mapping functions to the input elements.
+     *
+     * <p>If the mapped keys contains duplicates (according to {@link Object#equals(Object)}),
      * the value mapping function is applied to each equal element, and the
      * results are merged using the provided merging function.
      *
      * @apiNote
      * There are multiple ways to deal with collisions between multiple elements
-     * mapping to the same key.  There are some predefined merging functions,
-     * such as {@link #throwingMerger()}, {@link #firstWinsMerger()}, and
-     * {@link #lastWinsMerger()}, that implement common policies, or you can
-     * implement custom policies easily.  For example, if you have a stream
+     * mapping to the same key.  The other forms of {@code toConcurrentMap} simply use
+     * a merge function that throws unconditionally, but you can easily write
+     * more flexible merge policies.  For example, if you have a stream
      * of {@code Person}, and you want to produce a "phone book" mapping name to
      * address, but it is possible that two persons have the same name, you can
      * do as follows to gracefully deals with these collisions, and produce a
@@ -1163,16 +1280,19 @@
      * @see #toMap(Function, Function, BinaryOperator)
      */
     public static <T, K, U>
-    Collector<T, ConcurrentMap<K,U>> toConcurrentMap(Function<? super T, ? extends K> keyMapper,
-                                                     Function<? super T, ? extends U> valueMapper,
-                                                     BinaryOperator<U> mergeFunction) {
+    Collector<T, ?, ConcurrentMap<K,U>>
+    toConcurrentMap(Function<? super T, ? extends K> keyMapper,
+                    Function<? super T, ? extends U> valueMapper,
+                    BinaryOperator<U> mergeFunction) {
         return toConcurrentMap(keyMapper, valueMapper, mergeFunction, ConcurrentHashMap::new);
     }
 
     /**
-     * Accumulate elements into a {@code ConcurrentMap} whose keys and values
-     * are the result of applying mapping functions to the input elements. If
-     * the mapped keys contains duplicates (according to {@link Object#equals(Object)}),
+     * Returns a {@code Collector} that accumulate elements into a
+     * {@code ConcurrentMap} whose keys and values are the result of applying
+     * the provided mapping functions to the input elements.
+     *
+     * <p>If the mapped keys contains duplicates (according to {@link Object#equals(Object)}),
      * the value mapping function is applied to each equal element, and the
      * results are merged using the provided merging function.  The
      * {@code ConcurrentMap} is created by a provided supplier function.
@@ -1202,15 +1322,14 @@
      * @see #toMap(Function, Function, BinaryOperator, Supplier)
      */
     public static <T, K, U, M extends ConcurrentMap<K, U>>
-    Collector<T, M> toConcurrentMap(Function<? super T, ? extends K> keyMapper,
-                                    Function<? super T, ? extends U> valueMapper,
-                                    BinaryOperator<U> mergeFunction,
-                                    Supplier<M> mapSupplier) {
-        BiFunction<M, T, M> accumulator = (map, element) -> {
-            map.merge(keyMapper.apply(element), valueMapper.apply(element), mergeFunction);
-            return map;
-        };
-        return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_CONCURRENT);
+    Collector<T, ?, M> toConcurrentMap(Function<? super T, ? extends K> keyMapper,
+                                       Function<? super T, ? extends U> valueMapper,
+                                       BinaryOperator<U> mergeFunction,
+                                       Supplier<M> mapSupplier) {
+        BiConsumer<M, T> accumulator
+                = (map, element) -> map.merge(keyMapper.apply(element),
+                                              valueMapper.apply(element), mergeFunction);
+        return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_CONCURRENT_ID);
     }
 
     /**
@@ -1222,14 +1341,15 @@
      * @param mapper a mapping function to apply to each element
      * @return a {@code Collector} implementing the summary-statistics reduction
      *
-     * @see #toDoubleSummaryStatistics(ToDoubleFunction)
-     * @see #toLongSummaryStatistics(ToLongFunction)
+     * @see #summarizingDouble(ToDoubleFunction)
+     * @see #summarizingLong(ToLongFunction)
      */
     public static <T>
-    Collector<T, IntSummaryStatistics> toIntSummaryStatistics(ToIntFunction<? super T> mapper) {
-        return new CollectorImpl<>(IntSummaryStatistics::new,
-                                   (r, t) -> { r.accept(mapper.applyAsInt(t)); return r; },
-                                   (l, r) -> { l.combine(r); return l; }, CH_STRICT);
+    Collector<T, ?, IntSummaryStatistics> summarizingInt(ToIntFunction<? super T> mapper) {
+        return new CollectorImpl<T, IntSummaryStatistics, IntSummaryStatistics>(
+                IntSummaryStatistics::new,
+                (r, t) -> r.accept(mapper.applyAsInt(t)),
+                (l, r) -> { l.combine(r); return l; }, CH_ID);
     }
 
     /**
@@ -1241,14 +1361,15 @@
      * @param mapper the mapping function to apply to each element
      * @return a {@code Collector} implementing the summary-statistics reduction
      *
-     * @see #toDoubleSummaryStatistics(ToDoubleFunction)
-     * @see #toIntSummaryStatistics(ToIntFunction)
+     * @see #summarizingDouble(ToDoubleFunction)
+     * @see #summarizingInt(ToIntFunction)
      */
     public static <T>
-    Collector<T, LongSummaryStatistics> toLongSummaryStatistics(ToLongFunction<? super T> mapper) {
-        return new CollectorImpl<>(LongSummaryStatistics::new,
-                                   (r, t) -> { r.accept(mapper.applyAsLong(t)); return r; },
-                                   (l, r) -> { l.combine(r); return l; }, CH_STRICT);
+    Collector<T, ?, LongSummaryStatistics> summarizingLong(ToLongFunction<? super T> mapper) {
+        return new CollectorImpl<T, LongSummaryStatistics, LongSummaryStatistics>(
+                LongSummaryStatistics::new,
+                (r, t) -> r.accept(mapper.applyAsLong(t)),
+                (l, r) -> { l.combine(r); return l; }, CH_ID);
     }
 
     /**
@@ -1260,14 +1381,15 @@
      * @param mapper a mapping function to apply to each element
      * @return a {@code Collector} implementing the summary-statistics reduction
      *
-     * @see #toLongSummaryStatistics(ToLongFunction)
-     * @see #toIntSummaryStatistics(ToIntFunction)
+     * @see #summarizingLong(ToLongFunction)
+     * @see #summarizingInt(ToIntFunction)
      */
     public static <T>
-    Collector<T, DoubleSummaryStatistics> toDoubleSummaryStatistics(ToDoubleFunction<? super T> mapper) {
-        return new CollectorImpl<>(DoubleSummaryStatistics::new,
-                                   (r, t) -> { r.accept(mapper.applyAsDouble(t)); return r; },
-                                   (l, r) -> { l.combine(r); return l; }, CH_STRICT);
+    Collector<T, ?, DoubleSummaryStatistics> summarizingDouble(ToDoubleFunction<? super T> mapper) {
+        return new CollectorImpl<T, DoubleSummaryStatistics, DoubleSummaryStatistics>(
+                DoubleSummaryStatistics::new,
+                (r, t) -> r.accept(mapper.applyAsDouble(t)),
+                (l, r) -> { l.combine(r); return l; }, CH_ID);
     }
 
     /**
@@ -1276,8 +1398,8 @@
     private static final class Partition<T>
             extends AbstractMap<Boolean, T>
             implements Map<Boolean, T> {
-        T forTrue;
-        T forFalse;
+        final T forTrue;
+        final T forFalse;
 
         Partition(T forTrue, T forFalse) {
             this.forTrue = forTrue;
@@ -1289,24 +1411,9 @@
             return new AbstractSet<Map.Entry<Boolean, T>>() {
                 @Override
                 public Iterator<Map.Entry<Boolean, T>> iterator() {
-
-                    return new Iterator<Map.Entry<Boolean, T>>() {
-                        int state = 0;
-
-                        @Override
-                        public boolean hasNext() {
-                            return state < 2;
-                        }
-
-                        @Override
-                        public Map.Entry<Boolean, T> next() {
-                            if (state >= 2)
-                                throw new NoSuchElementException();
-                            return (state++ == 0)
-                                   ? new SimpleImmutableEntry<>(false, forFalse)
-                                   : new SimpleImmutableEntry<>(true, forTrue);
-                        }
-                    };
+                    Map.Entry<Boolean, T> falseEntry = new SimpleImmutableEntry<>(false, forFalse);
+                    Map.Entry<Boolean, T> trueEntry = new SimpleImmutableEntry<>(true, forTrue);
+                    return Arrays.asList(falseEntry, trueEntry).iterator();
                 }
 
                 @Override
--- a/jdk/src/share/classes/java/util/stream/DelegatingStream.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/DelegatingStream.java	Wed Jul 05 19:07:19 2017 +0200
@@ -209,7 +209,7 @@
     }
 
     @Override
-    public <R> R collect(Collector<? super T, R> collector) {
+    public <R, A> R collect(Collector<? super T, A, ? extends R> collector) {
         return delegate.collect(collector);
     }
 
--- a/jdk/src/share/classes/java/util/stream/DoublePipeline.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/DoublePipeline.java	Wed Jul 05 19:07:19 2017 +0200
@@ -147,6 +147,7 @@
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     final Spliterator.OfDouble lazySpliterator(Supplier<? extends Spliterator<Double>> supplier) {
         return new StreamSpliterators.DelegatingSpliterator.OfDouble((Supplier<Spliterator.OfDouble>) supplier);
     }
@@ -209,6 +210,7 @@
             Sink<Double> opWrapSink(int flags, Sink<U> sink) {
                 return new Sink.ChainedDouble(sink) {
                     @Override
+                    @SuppressWarnings("unchecked")
                     public void accept(double t) {
                         downstream.accept(mapper.apply(t));
                     }
--- a/jdk/src/share/classes/java/util/stream/DoubleStream.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/DoubleStream.java	Wed Jul 05 19:07:19 2017 +0200
@@ -527,7 +527,7 @@
     long count();
 
     /**
-     * Returns an {@code OptionalDouble} describing the average of elements of
+     * Returns an {@code OptionalDouble} describing the arithmetic mean of elements of
      * this stream, or an empty optional if this stream is empty.  The average
      * returned can vary depending upon the order in which elements are
      * encountered. This is due to accumulated rounding error in addition of
--- a/jdk/src/share/classes/java/util/stream/FindOps.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/FindOps.java	Wed Jul 05 19:07:19 2017 +0200
@@ -246,6 +246,7 @@
      * @param <P_OUT> Output element type from the stream pipeline
      * @param <O> Result type from the find operation
      */
+    @SuppressWarnings("serial")
     private static final class FindTask<P_IN, P_OUT, O>
             extends AbstractShortCircuitTask<P_IN, P_OUT, O, FindTask<P_IN, P_OUT, O>> {
         private final FindOp<P_OUT, O> op;
--- a/jdk/src/share/classes/java/util/stream/ForEachOps.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/ForEachOps.java	Wed Jul 05 19:07:19 2017 +0200
@@ -249,6 +249,7 @@
     }
 
     /** A {@code ForkJoinTask} for performing a parallel for-each operation */
+    @SuppressWarnings("serial")
     static final class ForEachTask<S, T> extends CountedCompleter<Void> {
         private Spliterator<S> spliterator;
         private final Sink<S> sink;
@@ -314,6 +315,7 @@
      * A {@code ForkJoinTask} for performing a parallel for-each operation
      * which visits the elements in encounter order
      */
+    @SuppressWarnings("serial")
     static final class ForEachOrderedTask<S, T> extends CountedCompleter<Void> {
         private final PipelineHelper<T> helper;
         private Spliterator<S> spliterator;
--- a/jdk/src/share/classes/java/util/stream/IntPipeline.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/IntPipeline.java	Wed Jul 05 19:07:19 2017 +0200
@@ -150,6 +150,7 @@
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     final Spliterator.OfInt lazySpliterator(Supplier<? extends Spliterator<Integer>> supplier) {
         return new StreamSpliterators.DelegatingSpliterator.OfInt((Supplier<Spliterator.OfInt>) supplier);
     }
@@ -190,6 +191,7 @@
             Sink<Integer> opWrapSink(int flags, Sink<Long> sink) {
                 return new Sink.ChainedInt(sink) {
                     @Override
+                    @SuppressWarnings("unchecked")
                     public void accept(int t) {
                         downstream.accept((long) t);
                     }
@@ -206,6 +208,7 @@
             Sink<Integer> opWrapSink(int flags, Sink<Double> sink) {
                 return new Sink.ChainedInt(sink) {
                     @Override
+                    @SuppressWarnings("unchecked")
                     public void accept(int t) {
                         downstream.accept((double) t);
                     }
@@ -245,6 +248,7 @@
             Sink<Integer> opWrapSink(int flags, Sink<U> sink) {
                 return new Sink.ChainedInt(sink) {
                     @Override
+                    @SuppressWarnings("unchecked")
                     public void accept(int t) {
                         downstream.accept(mapper.apply(t));
                     }
--- a/jdk/src/share/classes/java/util/stream/IntStream.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/IntStream.java	Wed Jul 05 19:07:19 2017 +0200
@@ -517,7 +517,7 @@
     long count();
 
     /**
-     * Returns an {@code OptionalDouble} describing the average of elements of
+     * Returns an {@code OptionalDouble} describing the arithmetic mean of elements of
      * this stream, or an empty optional if this stream is empty.  This is a
      * special case of a
      * <a href="package-summary.html#MutableReduction">reduction</a>.
--- a/jdk/src/share/classes/java/util/stream/LongPipeline.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/LongPipeline.java	Wed Jul 05 19:07:19 2017 +0200
@@ -148,6 +148,7 @@
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     final Spliterator.OfLong lazySpliterator(Supplier<? extends Spliterator<Long>> supplier) {
         return new StreamSpliterators.DelegatingSpliterator.OfLong((Supplier<Spliterator.OfLong>) supplier);
     }
@@ -209,6 +210,7 @@
             Sink<Long> opWrapSink(int flags, Sink<Long> sink) {
                 return new Sink.ChainedLong(sink) {
                     @Override
+                    @SuppressWarnings("unchecked")
                     public void accept(long t) {
                         downstream.accept(mapper.applyAsLong(t));
                     }
@@ -226,6 +228,7 @@
             Sink<Long> opWrapSink(int flags, Sink<U> sink) {
                 return new Sink.ChainedLong(sink) {
                     @Override
+                    @SuppressWarnings("unchecked")
                     public void accept(long t) {
                         downstream.accept(mapper.apply(t));
                     }
@@ -243,6 +246,7 @@
             Sink<Long> opWrapSink(int flags, Sink<Integer> sink) {
                 return new Sink.ChainedLong(sink) {
                     @Override
+                    @SuppressWarnings("unchecked")
                     public void accept(long t) {
                         downstream.accept(mapper.applyAsInt(t));
                     }
--- a/jdk/src/share/classes/java/util/stream/LongStream.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/LongStream.java	Wed Jul 05 19:07:19 2017 +0200
@@ -517,7 +517,7 @@
     long count();
 
     /**
-     * Returns an {@code OptionalDouble} describing the average of elements of
+     * Returns an {@code OptionalDouble} describing the arithmetic mean of elements of
      * this stream, or an empty optional if this stream is empty.  This is a
      * special case of a
      * <a href="package-summary.html#MutableReduction">reduction</a>.
--- a/jdk/src/share/classes/java/util/stream/MatchOps.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/MatchOps.java	Wed Jul 05 19:07:19 2017 +0200
@@ -274,6 +274,7 @@
      * @param <P_IN> the type of source elements for the pipeline
      * @param <P_OUT> the type of output elements for the pipeline
      */
+    @SuppressWarnings("serial")
     private static final class MatchTask<P_IN, P_OUT>
             extends AbstractShortCircuitTask<P_IN, P_OUT, Boolean, MatchTask<P_IN, P_OUT>> {
         private final MatchOp<P_OUT> op;
--- a/jdk/src/share/classes/java/util/stream/Nodes.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/Nodes.java	Wed Jul 05 19:07:19 2017 +0200
@@ -60,6 +60,7 @@
      */
     static final long MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
 
+    @SuppressWarnings("raw")
     private static final Node EMPTY_NODE = new EmptyNode.OfRef();
     private static final Node.OfInt EMPTY_INT_NODE = new EmptyNode.OfInt();
     private static final Node.OfLong EMPTY_LONG_NODE = new EmptyNode.OfLong();
@@ -1786,6 +1787,10 @@
         }
     }
 
+    /*
+     * This and subclasses are not intended to be serializable
+     */
+    @SuppressWarnings("serial")
     private static abstract class SizedCollectorTask<P_IN, P_OUT, T_SINK extends Sink<P_OUT>,
                                                      K extends SizedCollectorTask<P_IN, P_OUT, T_SINK, K>>
             extends CountedCompleter<Void>
@@ -1855,6 +1860,7 @@
             fence = (int) offset + (int) length;
         }
 
+        @SuppressWarnings("serial")
         static final class OfRef<P_IN, P_OUT>
                 extends SizedCollectorTask<P_IN, P_OUT, Sink<P_OUT>, OfRef<P_IN, P_OUT>>
                 implements Sink<P_OUT> {
@@ -1886,6 +1892,7 @@
             }
         }
 
+        @SuppressWarnings("serial")
         static final class OfInt<P_IN>
                 extends SizedCollectorTask<P_IN, Integer, Sink.OfInt, OfInt<P_IN>>
                 implements Sink.OfInt {
@@ -1917,6 +1924,7 @@
             }
         }
 
+        @SuppressWarnings("serial")
         static final class OfLong<P_IN>
                 extends SizedCollectorTask<P_IN, Long, Sink.OfLong, OfLong<P_IN>>
                 implements Sink.OfLong {
@@ -1948,6 +1956,7 @@
             }
         }
 
+        @SuppressWarnings("serial")
         static final class OfDouble<P_IN>
                 extends SizedCollectorTask<P_IN, Double, Sink.OfDouble, OfDouble<P_IN>>
                 implements Sink.OfDouble {
@@ -1980,6 +1989,7 @@
         }
     }
 
+    @SuppressWarnings("serial")
     private static abstract class ToArrayTask<T, T_NODE extends Node<T>,
                                               K extends ToArrayTask<T, T_NODE, K>>
             extends CountedCompleter<Void> {
@@ -2025,6 +2035,7 @@
             }
         }
 
+        @SuppressWarnings("serial")
         private static final class OfRef<T>
                 extends ToArrayTask<T, Node<T>, OfRef<T>> {
             private final T[] array;
@@ -2050,6 +2061,7 @@
             }
         }
 
+        @SuppressWarnings("serial")
         private static class OfPrimitive<T, T_CONS, T_ARR,
                                          T_SPLITR extends Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>,
                                          T_NODE extends Node.OfPrimitive<T, T_CONS, T_ARR, T_SPLITR, T_NODE>>
@@ -2077,6 +2089,7 @@
             }
         }
 
+        @SuppressWarnings("serial")
         private static final class OfInt
                 extends OfPrimitive<Integer, IntConsumer, int[], Spliterator.OfInt, Node.OfInt> {
             private OfInt(Node.OfInt node, int[] array, int offset) {
@@ -2084,6 +2097,7 @@
             }
         }
 
+        @SuppressWarnings("serial")
         private static final class OfLong
                 extends OfPrimitive<Long, LongConsumer, long[], Spliterator.OfLong, Node.OfLong> {
             private OfLong(Node.OfLong node, long[] array, int offset) {
@@ -2091,6 +2105,7 @@
             }
         }
 
+        @SuppressWarnings("serial")
         private static final class OfDouble
                 extends OfPrimitive<Double, DoubleConsumer, double[], Spliterator.OfDouble, Node.OfDouble> {
             private OfDouble(Node.OfDouble node, double[] array, int offset) {
@@ -2099,6 +2114,7 @@
         }
     }
 
+    @SuppressWarnings("serial")
     private static class CollectorTask<P_IN, P_OUT, T_NODE extends Node<P_OUT>, T_BUILDER extends Node.Builder<P_OUT>>
             extends AbstractTask<P_IN, P_OUT, T_NODE, CollectorTask<P_IN, P_OUT, T_NODE, T_BUILDER>> {
         protected final PipelineHelper<P_OUT> helper;
@@ -2135,12 +2151,13 @@
         }
 
         @Override
-        public void onCompletion(CountedCompleter caller) {
+        public void onCompletion(CountedCompleter<?> caller) {
             if (!isLeaf())
                 setLocalResult(concFactory.apply(leftChild.getLocalResult(), rightChild.getLocalResult()));
             super.onCompletion(caller);
         }
 
+        @SuppressWarnings("serial")
         private static final class OfRef<P_IN, P_OUT>
                 extends CollectorTask<P_IN, P_OUT, Node<P_OUT>, Node.Builder<P_OUT>> {
             OfRef(PipelineHelper<P_OUT> helper,
@@ -2150,6 +2167,7 @@
             }
         }
 
+        @SuppressWarnings("serial")
         private static final class OfInt<P_IN>
                 extends CollectorTask<P_IN, Integer, Node.OfInt, Node.Builder.OfInt> {
             OfInt(PipelineHelper<Integer> helper, Spliterator<P_IN> spliterator) {
@@ -2157,6 +2175,7 @@
             }
         }
 
+        @SuppressWarnings("serial")
         private static final class OfLong<P_IN>
                 extends CollectorTask<P_IN, Long, Node.OfLong, Node.Builder.OfLong> {
             OfLong(PipelineHelper<Long> helper, Spliterator<P_IN> spliterator) {
@@ -2164,6 +2183,7 @@
             }
         }
 
+        @SuppressWarnings("serial")
         private static final class OfDouble<P_IN>
                 extends CollectorTask<P_IN, Double, Node.OfDouble, Node.Builder.OfDouble> {
             OfDouble(PipelineHelper<Double> helper, Spliterator<P_IN> spliterator) {
--- a/jdk/src/share/classes/java/util/stream/ReduceOps.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/ReduceOps.java	Wed Jul 05 19:07:19 2017 +0200
@@ -43,7 +43,7 @@
 import java.util.function.Supplier;
 
 /**
- * Factory for the creating instances of {@code TerminalOp) that implement
+ * Factory for creating instances of {@code TerminalOp} that implement
  * reductions.
  *
  * @since 1.8
@@ -148,17 +148,17 @@
      * reference values.
      *
      * @param <T> the type of the input elements
-     * @param <R> the type of the result
+     * @param <I> the type of the intermediate reduction result
      * @param collector a {@code Collector} defining the reduction
      * @return a {@code ReduceOp} implementing the reduction
      */
-    public static <T,R> TerminalOp<T, R>
-    makeRef(Collector<? super T,R> collector) {
-        Supplier<R> supplier = Objects.requireNonNull(collector).resultSupplier();
-        BiFunction<R, ? super T, R> accumulator = collector.accumulator();
-        BinaryOperator<R> combiner = collector.combiner();
-        class ReducingSink extends Box<R>
-                implements AccumulatingSink<T, R, ReducingSink> {
+    public static <T, I> TerminalOp<T, I>
+    makeRef(Collector<? super T, I, ?> collector) {
+        Supplier<I> supplier = Objects.requireNonNull(collector).supplier();
+        BiConsumer<I, ? super T> accumulator = collector.accumulator();
+        BinaryOperator<I> combiner = collector.combiner();
+        class ReducingSink extends Box<I>
+                implements AccumulatingSink<T, I, ReducingSink> {
             @Override
             public void begin(long size) {
                 state = supplier.get();
@@ -166,9 +166,7 @@
 
             @Override
             public void accept(T t) {
-                R newResult = accumulator.apply(state, t);
-                if (state != newResult)
-                    state = newResult;
+                accumulator.accept(state, t);
             }
 
             @Override
@@ -176,7 +174,7 @@
                 state = combiner.apply(state, other.state);
             }
         }
-        return new ReduceOp<T, R, ReducingSink>(StreamShape.REFERENCE) {
+        return new ReduceOp<T, I, ReducingSink>(StreamShape.REFERENCE) {
             @Override
             public ReducingSink makeSink() {
                 return new ReducingSink();
@@ -720,6 +718,7 @@
     /**
      * A {@code ForkJoinTask} for performing a parallel reduce operation.
      */
+    @SuppressWarnings("serial")
     private static final class ReduceTask<P_IN, P_OUT, R,
                                           S extends AccumulatingSink<P_OUT, R, S>>
             extends AbstractTask<P_IN, P_OUT, S, ReduceTask<P_IN, P_OUT, R, S>> {
@@ -749,7 +748,7 @@
         }
 
         @Override
-        public void onCompletion(CountedCompleter caller) {
+        public void onCompletion(CountedCompleter<?> caller) {
             if (!isLeaf()) {
                 S leftResult = leftChild.getLocalResult();
                 leftResult.combine(rightChild.getLocalResult());
--- a/jdk/src/share/classes/java/util/stream/ReferencePipeline.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/ReferencePipeline.java	Wed Jul 05 19:07:19 2017 +0200
@@ -170,9 +170,10 @@
                     }
 
                     @Override
+                    @SuppressWarnings("unchecked")
                     public void accept(P_OUT u) {
                         if (predicate.test(u))
-                            downstream.accept(u);
+                            downstream.accept((Object) u);
                     }
                 };
             }
@@ -180,6 +181,7 @@
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public final <R> Stream<R> map(Function<? super P_OUT, ? extends R> mapper) {
         Objects.requireNonNull(mapper);
         return new StatelessOp<P_OUT, R>(this, StreamShape.REFERENCE,
@@ -262,6 +264,7 @@
                     }
 
                     @Override
+                    @SuppressWarnings("unchecked")
                     public void accept(P_OUT u) {
                         // We can do better that this too; optimize for depth=0 case and just grab spliterator and forEach it
                         Stream<? extends R> result = mapper.apply(u);
@@ -363,6 +366,7 @@
             Sink<P_OUT> opWrapSink(int flags, Sink<P_OUT> sink) {
                 return new Sink.ChainedReference<P_OUT>(sink) {
                     @Override
+                    @SuppressWarnings("unchecked")
                     public void accept(P_OUT u) {
                         tee.accept(u);
                         downstream.accept(u);
@@ -439,6 +443,7 @@
         // The runtime type of U is never checked for equality with the component type of the runtime type of A[].
         // Runtime checking will be performed when an element is stored in A[], thus if A is not a
         // super type of U an ArrayStoreException will be thrown.
+        @SuppressWarnings("rawtypes")
         IntFunction rawGenerator = (IntFunction) generator;
         return (A[]) Nodes.flatten(evaluateToArrayNode(rawGenerator), rawGenerator)
                               .asArray(rawGenerator);
@@ -490,16 +495,21 @@
     }
 
     @Override
-    public final <R> R collect(Collector<? super P_OUT, R> collector) {
+    public final <R, A> R collect(Collector<? super P_OUT, A, ? extends R> collector) {
+        A container;
         if (isParallel()
                 && (collector.characteristics().contains(Collector.Characteristics.CONCURRENT))
                 && (!isOrdered() || collector.characteristics().contains(Collector.Characteristics.UNORDERED))) {
-            R container = collector.resultSupplier().get();
-            BiFunction<R, ? super P_OUT, R> accumulator = collector.accumulator();
-            forEach(u -> accumulator.apply(container, u));
-            return container;
+            container = collector.supplier().get();
+            BiConsumer<A, ? super P_OUT> accumulator = collector.accumulator();
+            forEach(u -> accumulator.accept(container, u));
         }
-        return evaluate(ReduceOps.makeRef(collector));
+        else {
+            container = evaluate(ReduceOps.makeRef(collector));
+        }
+        return collector.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)
+               ? (R) container
+               : collector.finisher().apply(container);
     }
 
     @Override
--- a/jdk/src/share/classes/java/util/stream/Sink.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/Sink.java	Wed Jul 05 19:07:19 2017 +0200
@@ -242,6 +242,7 @@
      * {@code accept()} method on the downstream {@code Sink}.
      */
     static abstract class ChainedReference<T> implements Sink<T> {
+        @SuppressWarnings("rawtypes")
         protected final Sink downstream;
 
         public ChainedReference(Sink downstream) {
@@ -274,6 +275,7 @@
      * {@code accept()} method on the downstream {@code Sink}.
      */
     static abstract class ChainedInt implements Sink.OfInt {
+        @SuppressWarnings("rawtypes")
         protected final Sink downstream;
 
         public ChainedInt(Sink downstream) {
@@ -306,6 +308,7 @@
      * {@code accept()} method on the downstream {@code Sink}.
      */
     static abstract class ChainedLong implements Sink.OfLong {
+        @SuppressWarnings("rawtypes")
         protected final Sink downstream;
 
         public ChainedLong(Sink downstream) {
@@ -338,6 +341,7 @@
      * {@code accept()} method on the downstream {@code Sink}.
      */
     static abstract class ChainedDouble implements Sink.OfDouble {
+        @SuppressWarnings("rawtypes")
         protected final Sink downstream;
 
         public ChainedDouble(Sink downstream) {
--- a/jdk/src/share/classes/java/util/stream/SliceOps.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/SliceOps.java	Wed Jul 05 19:07:19 2017 +0200
@@ -550,6 +550,7 @@
      * @param <P_IN> Input element type to the stream pipeline
      * @param <P_OUT> Output element type from the stream pipeline
      */
+    @SuppressWarnings("serial")
     private static final class SliceTask<P_IN, P_OUT>
             extends AbstractShortCircuitTask<P_IN, P_OUT, Node<P_OUT>, SliceTask<P_IN, P_OUT>> {
         private final AbstractPipeline<P_OUT, P_OUT, ?> op;
--- a/jdk/src/share/classes/java/util/stream/SortedOps.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/SortedOps.java	Wed Jul 05 19:07:19 2017 +0200
@@ -209,7 +209,7 @@
         }
 
         @Override
-        public Sink<Long> opWrapSink(int flags, Sink sink) {
+        public Sink<Long> opWrapSink(int flags, Sink<Long> sink) {
             Objects.requireNonNull(sink);
 
             if (StreamOpFlag.SORTED.isKnown(flags))
@@ -248,7 +248,7 @@
         }
 
         @Override
-        public Sink<Double> opWrapSink(int flags, Sink sink) {
+        public Sink<Double> opWrapSink(int flags, Sink<Double> sink) {
             Objects.requireNonNull(sink);
 
             if (StreamOpFlag.SORTED.isKnown(flags))
@@ -285,7 +285,7 @@
         private T[] array;
         private int offset;
 
-        SizedRefSortingSink(Sink sink, Comparator<? super T> comparator) {
+        SizedRefSortingSink(Sink<T> sink, Comparator<? super T> comparator) {
             super(sink);
             this.comparator = comparator;
         }
@@ -324,7 +324,7 @@
         private final Comparator<? super T> comparator;
         private ArrayList<T> list;
 
-        RefSortingSink(Sink sink, Comparator<? super T> comparator) {
+        RefSortingSink(Sink<T> sink, Comparator<? super T> comparator) {
             super(sink);
             this.comparator = comparator;
         }
--- a/jdk/src/share/classes/java/util/stream/SpinedBuffer.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/SpinedBuffer.java	Wed Jul 05 19:07:19 2017 +0200
@@ -28,6 +28,7 @@
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Objects;
 import java.util.PrimitiveIterator;
 import java.util.Spliterator;
 import java.util.Spliterators;
@@ -317,6 +318,8 @@
 
             @Override
             public boolean tryAdvance(Consumer<? super E> consumer) {
+                Objects.requireNonNull(consumer);
+
                 if (splSpineIndex < lastSpineIndex
                     || (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) {
                     consumer.accept(splChunk[splElementIndex++]);
@@ -334,6 +337,8 @@
 
             @Override
             public void forEachRemaining(Consumer<? super E> consumer) {
+                Objects.requireNonNull(consumer);
+
                 if (splSpineIndex < lastSpineIndex
                     || (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) {
                     int i = splElementIndex;
@@ -634,6 +639,8 @@
 
             @Override
             public boolean tryAdvance(T_CONS consumer) {
+                Objects.requireNonNull(consumer);
+
                 if (splSpineIndex < lastSpineIndex
                     || (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) {
                     arrayForOne(splChunk, splElementIndex++, consumer);
@@ -651,6 +658,8 @@
 
             @Override
             public void forEachRemaining(T_CONS consumer) {
+                Objects.requireNonNull(consumer);
+
                 if (splSpineIndex < lastSpineIndex
                     || (splSpineIndex == lastSpineIndex && splElementIndex < lastSpineElementFence)) {
                     int i = splElementIndex;
--- a/jdk/src/share/classes/java/util/stream/Stream.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/Stream.java	Wed Jul 05 19:07:19 2017 +0200
@@ -651,12 +651,13 @@
      * }</pre>
      *
      * @param <R> the type of the result
+     * @param <A> the intermediate accumulation type of the {@code Collector}
      * @param collector the {@code Collector} describing the reduction
      * @return the result of the reduction
      * @see #collect(Supplier, BiConsumer, BiConsumer)
      * @see Collectors
      */
-    <R> R collect(Collector<? super T, R> collector);
+    <R, A> R collect(Collector<? super T, A, ? extends R> collector);
 
     /**
      * Returns the minimum element of this stream according to the provided
@@ -827,6 +828,7 @@
      * @return the new stream
      */
     @SafeVarargs
+    @SuppressWarnings("varargs") // Creating a stream from an array is safe
     public static<T> Stream<T> of(T... values) {
         return Arrays.stream(values);
     }
--- a/jdk/src/share/classes/java/util/stream/StreamSpliterators.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/StreamSpliterators.java	Wed Jul 05 19:07:19 2017 +0200
@@ -25,6 +25,7 @@
 package java.util.stream;
 
 import java.util.Comparator;
+import java.util.Objects;
 import java.util.Spliterator;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.BooleanSupplier;
@@ -294,6 +295,7 @@
 
         @Override
         public boolean tryAdvance(Consumer<? super P_OUT> consumer) {
+            Objects.requireNonNull(consumer);
             boolean hasNext = doAdvance();
             if (hasNext)
                 consumer.accept(buffer.get(nextToConsume));
@@ -303,6 +305,7 @@
         @Override
         public void forEachRemaining(Consumer<? super P_OUT> consumer) {
             if (buffer == null && !finished) {
+                Objects.requireNonNull(consumer);
                 init();
 
                 ph.wrapAndCopyInto((Sink<P_OUT>) consumer::accept, spliterator);
@@ -350,6 +353,7 @@
 
         @Override
         public boolean tryAdvance(IntConsumer consumer) {
+            Objects.requireNonNull(consumer);
             boolean hasNext = doAdvance();
             if (hasNext)
                 consumer.accept(buffer.get(nextToConsume));
@@ -359,6 +363,7 @@
         @Override
         public void forEachRemaining(IntConsumer consumer) {
             if (buffer == null && !finished) {
+                Objects.requireNonNull(consumer);
                 init();
 
                 ph.wrapAndCopyInto((Sink.OfInt) consumer::accept, spliterator);
@@ -406,6 +411,7 @@
 
         @Override
         public boolean tryAdvance(LongConsumer consumer) {
+            Objects.requireNonNull(consumer);
             boolean hasNext = doAdvance();
             if (hasNext)
                 consumer.accept(buffer.get(nextToConsume));
@@ -415,6 +421,7 @@
         @Override
         public void forEachRemaining(LongConsumer consumer) {
             if (buffer == null && !finished) {
+                Objects.requireNonNull(consumer);
                 init();
 
                 ph.wrapAndCopyInto((Sink.OfLong) consumer::accept, spliterator);
@@ -462,6 +469,7 @@
 
         @Override
         public boolean tryAdvance(DoubleConsumer consumer) {
+            Objects.requireNonNull(consumer);
             boolean hasNext = doAdvance();
             if (hasNext)
                 consumer.accept(buffer.get(nextToConsume));
@@ -471,6 +479,7 @@
         @Override
         public void forEachRemaining(DoubleConsumer consumer) {
             if (buffer == null && !finished) {
+                Objects.requireNonNull(consumer);
                 init();
 
                 ph.wrapAndCopyInto((Sink.OfDouble) consumer::accept, spliterator);
@@ -696,6 +705,8 @@
 
             @Override
             public boolean tryAdvance(Consumer<? super T> action) {
+                Objects.requireNonNull(action);
+
                 if (sliceOrigin >= fence)
                     return false;
 
@@ -713,6 +724,8 @@
 
             @Override
             public void forEachRemaining(Consumer<? super T> action) {
+                Objects.requireNonNull(action);
+
                 if (sliceOrigin >= fence)
                     return;
 
@@ -754,6 +767,8 @@
 
             @Override
             public boolean tryAdvance(T_CONS action) {
+                Objects.requireNonNull(action);
+
                 if (sliceOrigin >= fence)
                     return false;
 
@@ -771,6 +786,8 @@
 
             @Override
             public void forEachRemaining(T_CONS action) {
+                Objects.requireNonNull(action);
+
                 if (sliceOrigin >= fence)
                     return;
 
@@ -895,7 +912,8 @@
             this.permits = new AtomicLong(limit >= 0 ? skip + limit : skip);
         }
 
-        UnorderedSliceSpliterator(T_SPLITR s, UnorderedSliceSpliterator parent) {
+        UnorderedSliceSpliterator(T_SPLITR s,
+                                  UnorderedSliceSpliterator<T, T_SPLITR> parent) {
             this.s = s;
             this.unlimited = parent.unlimited;
             this.permits = parent.permits;
@@ -974,7 +992,7 @@
                 super(s, skip, limit);
             }
 
-            OfRef(Spliterator<T> s, OfRef parent) {
+            OfRef(Spliterator<T> s, OfRef<T> parent) {
                 super(s, parent);
             }
 
@@ -985,6 +1003,8 @@
 
             @Override
             public boolean tryAdvance(Consumer<? super T> action) {
+                Objects.requireNonNull(action);
+
                 while (permitStatus() != PermitStatus.NO_MORE) {
                     if (!s.tryAdvance(this))
                         return false;
@@ -999,6 +1019,8 @@
 
             @Override
             public void forEachRemaining(Consumer<? super T> action) {
+                Objects.requireNonNull(action);
+
                 ArrayBuffer.OfRef<T> sb = null;
                 PermitStatus permitStatus;
                 while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) {
@@ -1051,6 +1073,8 @@
 
             @Override
             public boolean tryAdvance(T_CONS action) {
+                Objects.requireNonNull(action);
+
                 while (permitStatus() != PermitStatus.NO_MORE) {
                     if (!s.tryAdvance((T_CONS) this))
                         return false;
@@ -1066,6 +1090,8 @@
 
             @Override
             public void forEachRemaining(T_CONS action) {
+                Objects.requireNonNull(action);
+
                 T_BUFF sb = null;
                 PermitStatus permitStatus;
                 while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) {
@@ -1237,6 +1263,8 @@
 
             @Override
             public boolean tryAdvance(Consumer<? super T> action) {
+                Objects.requireNonNull(action);
+
                 action.accept(s.get());
                 return true;
             }
@@ -1260,6 +1288,8 @@
 
             @Override
             public boolean tryAdvance(IntConsumer action) {
+                Objects.requireNonNull(action);
+
                 action.accept(s.getAsInt());
                 return true;
             }
@@ -1283,6 +1313,8 @@
 
             @Override
             public boolean tryAdvance(LongConsumer action) {
+                Objects.requireNonNull(action);
+
                 action.accept(s.getAsLong());
                 return true;
             }
@@ -1306,6 +1338,8 @@
 
             @Override
             public boolean tryAdvance(DoubleConsumer action) {
+                Objects.requireNonNull(action);
+
                 action.accept(s.getAsDouble());
                 return true;
             }
--- a/jdk/src/share/classes/java/util/stream/Streams.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/Streams.java	Wed Jul 05 19:07:19 2017 +0200
@@ -25,6 +25,7 @@
 package java.util.stream;
 
 import java.util.Comparator;
+import java.util.Objects;
 import java.util.Spliterator;
 import java.util.function.Consumer;
 import java.util.function.DoubleConsumer;
@@ -80,6 +81,8 @@
 
         @Override
         public boolean tryAdvance(IntConsumer consumer) {
+            Objects.requireNonNull(consumer);
+
             final int i = from;
             if (i < upTo) {
                 from++;
@@ -96,6 +99,8 @@
 
         @Override
         public void forEachRemaining(IntConsumer consumer) {
+            Objects.requireNonNull(consumer);
+
             int i = from;
             final int hUpTo = upTo;
             int hLast = last;
@@ -199,6 +204,8 @@
 
         @Override
         public boolean tryAdvance(LongConsumer consumer) {
+            Objects.requireNonNull(consumer);
+
             final long i = from;
             if (i < upTo) {
                 from++;
@@ -215,6 +222,8 @@
 
         @Override
         public void forEachRemaining(LongConsumer consumer) {
+            Objects.requireNonNull(consumer);
+
             long i = from;
             final long hUpTo = upTo;
             int hLast = last;
@@ -388,6 +397,8 @@
 
         @Override
         public boolean tryAdvance(Consumer<? super T> action) {
+            Objects.requireNonNull(action);
+
             if (count == -2) {
                 action.accept(first);
                 count = -1;
@@ -400,6 +411,8 @@
 
         @Override
         public void forEachRemaining(Consumer<? super T> action) {
+            Objects.requireNonNull(action);
+
             if (count == -2) {
                 action.accept(first);
                 count = -1;
@@ -475,6 +488,8 @@
 
         @Override
         public boolean tryAdvance(IntConsumer action) {
+            Objects.requireNonNull(action);
+
             if (count == -2) {
                 action.accept(first);
                 count = -1;
@@ -487,6 +502,8 @@
 
         @Override
         public void forEachRemaining(IntConsumer action) {
+            Objects.requireNonNull(action);
+
             if (count == -2) {
                 action.accept(first);
                 count = -1;
@@ -562,6 +579,8 @@
 
         @Override
         public boolean tryAdvance(LongConsumer action) {
+            Objects.requireNonNull(action);
+
             if (count == -2) {
                 action.accept(first);
                 count = -1;
@@ -574,6 +593,8 @@
 
         @Override
         public void forEachRemaining(LongConsumer action) {
+            Objects.requireNonNull(action);
+
             if (count == -2) {
                 action.accept(first);
                 count = -1;
@@ -649,6 +670,8 @@
 
         @Override
         public boolean tryAdvance(DoubleConsumer action) {
+            Objects.requireNonNull(action);
+
             if (count == -2) {
                 action.accept(first);
                 count = -1;
@@ -661,6 +684,8 @@
 
         @Override
         public void forEachRemaining(DoubleConsumer action) {
+            Objects.requireNonNull(action);
+
             if (count == -2) {
                 action.accept(first);
                 count = -1;
--- a/jdk/src/share/classes/java/util/stream/package-info.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/java/util/stream/package-info.java	Wed Jul 05 19:07:19 2017 +0200
@@ -547,7 +547,7 @@
  *     List<String> l = new ArrayList(Arrays.asList("one", "two"));
  *     Stream<String> sl = l.stream();
  *     l.add("three");
- *     String s = sl.collect(toStringJoiner(" ")).toString();
+ *     String s = sl.collect(joining(" "));
  * }</pre>
  * First a list is created consisting of two strings: "one"; and "two". Then a stream is created from that list.
  * Next the list is modified by adding a third string: "three".  Finally the elements of the stream are collected
@@ -557,7 +557,7 @@
  * <pre>{@code
  *     List<String> l = new ArrayList(Arrays.asList("one", "two"));
  *     Stream<String> sl = l.stream();
- *     String s = sl.peek(s -> l.add("BAD LAMBDA")).collect(toStringJoiner(" ")).toString();
+ *     String s = sl.peek(s -> l.add("BAD LAMBDA")).collect(joining(" "));
  * }</pre>
  * then a {@code ConcurrentModificationException} will be thrown since the {@code peek} operation will attempt
  * to add the string "BAD LAMBDA" to the list after the terminal operation has commenced.
--- a/jdk/src/share/classes/javax/accessibility/Accessible.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/accessibility/Accessible.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -45,6 +45,7 @@
      * of an object that implements Accessible, and that subclass
      * is not Accessible, the developer should override the
      * getAccessibleContext method to return null.
+     * @return the AccessibleContext associated with this object
      */
     public AccessibleContext getAccessibleContext();
 }
--- a/jdk/src/share/classes/javax/accessibility/AccessibleBundle.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/accessibility/AccessibleBundle.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -53,6 +53,9 @@
     private final String defaultResourceBundleName
         = "com.sun.accessibility.internal.resources.accessibility";
 
+    /**
+     * Construct an {@code AccessibleBundle}.
+     */
     public AccessibleBundle() {
     }
 
--- a/jdk/src/share/classes/javax/accessibility/AccessibleExtendedTable.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/accessibility/AccessibleExtendedTable.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -60,7 +60,7 @@
       */
      public int getAccessibleColumn(int index);
 
-     /*
+    /**
       * Returns the index at a row and column in the table.
       *
       * @param r zero-based row of the table
--- a/jdk/src/share/classes/javax/accessibility/AccessibleRelationSet.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/accessibility/AccessibleRelationSet.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -163,6 +163,7 @@
 
     /**
      * Returns the number of relations in the relation set.
+     * @return the number of relations in the relation set
      */
     public int size() {
         if (relations == null) {
--- a/jdk/src/share/classes/javax/accessibility/AccessibleTable.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/accessibility/AccessibleTable.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -90,6 +90,8 @@
      * Returns the number of rows occupied by the Accessible at
      * a specified row and column in the table.
      *
+     * @param r zero-based row of the table
+     * @param c zero-based column of the table
      * @return the number of rows occupied by the Accessible at a
      * given specified (row, column)
      */
@@ -99,6 +101,8 @@
      * Returns the number of columns occupied by the Accessible at
      * a specified row and column in the table.
      *
+     * @param r zero-based row of the table
+     * @param c zero-based column of the table
      * @return the number of columns occupied by the Accessible at a
      * given specified row and column
      */
--- a/jdk/src/share/classes/javax/accessibility/AccessibleTableModelChange.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/accessibility/AccessibleTableModelChange.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -71,8 +71,8 @@
     public static final int DELETE = -1;
 
     /**
-     *  Returns the type of event
-     *
+     *  Returns the type of event.
+     *  @return the type of event
      *  @see #INSERT
      *  @see #UPDATE
      *  @see #DELETE
@@ -81,21 +81,25 @@
 
     /**
      * Returns the first row that changed.
+     * @return the first row that changed
      */
     public int getFirstRow();
 
     /**
      * Returns the last row that changed.
+     * @return the last row that changed
      */
     public int getLastRow();
 
     /**
      * Returns the first column that changed.
+     * @return the first column that changed
      */
     public int getFirstColumn();
 
     /**
      * Returns the last column that changed.
+     * @return the last column that changed
      */
     public int getLastColumn();
 }
--- a/jdk/src/share/classes/javax/accessibility/AccessibleTextSequence.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/accessibility/AccessibleTextSequence.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -49,7 +49,7 @@
  */
 public class AccessibleTextSequence {
 
-    /* The start index of the text sequence */
+    /** The start index of the text sequence */
     public int startIndex;
 
     /** The end index of the text sequence */
--- a/jdk/src/share/classes/javax/accessibility/AccessibleValue.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/accessibility/AccessibleValue.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -60,6 +60,7 @@
     /**
      * Set the value of this object as a Number.
      *
+     * @param n the number to use for the value
      * @return True if the value was set; else False
      * @see #getCurrentAccessibleValue
      */
--- a/jdk/src/share/classes/javax/imageio/ImageIO.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/ImageIO.java	Wed Jul 05 19:07:19 2017 +0200
@@ -228,7 +228,7 @@
      * be used when creating <code>ImageInputStream</code>s and
      * <code>ImageOutputStream</code>s.
      *
-     * <p> When reading from a standard <code>InputStream</code>>, it
+     * <p> When reading from a standard <code>InputStream</code>, it
      * may be necessary to save previously read information in a cache
      * since the underlying stream does not allow data to be re-read.
      * Similarly, when writing to a standard
--- a/jdk/src/share/classes/javax/imageio/ImageReadParam.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/ImageReadParam.java	Wed Jul 05 19:07:19 2017 +0200
@@ -80,7 +80,7 @@
  *
  * <p> The resulting region is then subsampled according to the
  * factors given in {@link IIOParam#setSourceSubsampling
- * <code>IIOParam.setSourceSubsampling</code>}.  The first pixel,
+ * IIOParam.setSourceSubsampling}.  The first pixel,
  * the number of pixels per row, and the number of rows all depend
  * on the subsampling settings.
  * Call the minimum X and Y coordinates of the resulting rectangle
--- a/jdk/src/share/classes/javax/imageio/ImageReader.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/ImageReader.java	Wed Jul 05 19:07:19 2017 +0200
@@ -230,8 +230,8 @@
      * increased as each image (or thumbnail, or image metadata) is
      * read.  If <code>seekForwardOnly</code> is true, then a call to
      * <code>read(index)</code> will throw an
-     * <code>IndexOutOfBoundsException</code> if <code>index &lt
-     * this.minIndex</code>; otherwise, the value of
+     * <code>IndexOutOfBoundsException</code> if {@code index < this.minIndex};
+     * otherwise, the value of
      * <code>minIndex</code> will be set to <code>index</code>.  If
      * <code>seekForwardOnly</code> is <code>false</code>, the value of
      * <code>minIndex</code> will remain 0 regardless of any read
@@ -328,8 +328,8 @@
      * increased as each image (or thumbnail, or image metadata) is
      * read.  If <code>seekForwardOnly</code> is true, then a call to
      * <code>read(index)</code> will throw an
-     * <code>IndexOutOfBoundsException</code> if <code>index &lt
-     * this.minIndex</code>; otherwise, the value of
+     * <code>IndexOutOfBoundsException</code> if {@code index < this.minIndex};
+     * otherwise, the value of
      * <code>minIndex</code> will be set to <code>index</code>.  If
      * <code>seekForwardOnly</code> is <code>false</code>, the value of
      * <code>minIndex</code> will remain 0 regardless of any read
@@ -600,8 +600,7 @@
      * <p> Note that formats that return <code>false</code> from
      * this method may nonetheless allow tiling (<i>e.g.</i> Restart
      * Markers in JPEG), and random access will likely be reasonably
-     * efficient on tiles.  See {@link #isImageTiled
-     * <code>isImageTiled</code>}.
+     * efficient on tiles.  See {@link #isImageTiled isImageTiled}.
      *
      * <p> A reader for which all images are guaranteed to support
      * easy random access, or are guaranteed not to support easy
@@ -1212,11 +1211,10 @@
 
     /**
      * Returns <code>true</code> if this plug-in supports reading
-     * just a {@link java.awt.image.Raster <code>Raster</code>} of pixel data.
+     * just a {@link java.awt.image.Raster Raster} of pixel data.
      * If this method returns <code>false</code>, calls to
-     * {@link #readRaster <code>readRaster</code>} or {@link #readTileRaster
-     * <code>readTileRaster</code>} will throw an
-     * <code>UnsupportedOperationException</code>.
+     * {@link #readRaster readRaster} or {@link #readTileRaster readTileRaster}
+     * will throw an <code>UnsupportedOperationException</code>.
      *
      * <p> The default implementation returns <code>false</code>.
      *
@@ -1236,7 +1234,7 @@
      * application must determine how to interpret the pixel data by other
      * means.  Any destination or image-type parameters in the supplied
      * <code>ImageReadParam</code> object are ignored, but all other
-     * parameters are used exactly as in the {@link #read <code>read</code>}
+     * parameters are used exactly as in the {@link #read read}
      * method, except that any destination offset is used as a logical rather
      * than a physical offset.  The size of the returned <code>Raster</code>
      * will always be that of the source region clipped to the actual image.
@@ -1249,10 +1247,9 @@
      *
      * <p> Any registered <code>readUpdateListener</code>s are ignored, as
      * there is no <code>BufferedImage</code>, but all other listeners are
-     * called exactly as they are for the {@link #read <code>read</code>}
-     * method.
+     * called exactly as they are for the {@link #read read} method.
      *
-     * <p> If {@link #canReadRaster <code>canReadRaster()</code>} returns
+     * <p> If {@link #canReadRaster canReadRaster()} returns
      * <code>false</code>, this method throws an
      * <code>UnsupportedOperationException</code>.
      *
@@ -1481,13 +1478,13 @@
      * The application must determine how to interpret the pixel data by other
      * means.
      *
-     * <p> If {@link #canReadRaster <code>canReadRaster()</code>} returns
+     * <p> If {@link #canReadRaster canReadRaster()} returns
      * <code>false</code>, this method throws an
      * <code>UnsupportedOperationException</code>.
      *
      * <p> The default implementation checks if reading
      * <code>Raster</code>s is supported, and if so calls {@link
-     * #readRaster <code>readRaster(imageIndex, null)</code>} if
+     * #readRaster readRaster(imageIndex, null)} if
      * <code>tileX</code> and <code>tileY</code> are 0, or throws an
      * <code>IllegalArgumentException</code> otherwise.
      *
@@ -1548,8 +1545,8 @@
      * source render size or any format-specific settings), they will
      * be ignored.
      *
-     * <p> The default implementation just calls {@link #read
-     * <code>read(imageIndex, param)</code>}.
+     * <p> The default implementation just calls
+     * {@link #read read(imageIndex, param)}.
      *
      * @param imageIndex the index of the image to be retrieved.
      * @param param an <code>ImageReadParam</code> used to control
@@ -2544,9 +2541,8 @@
      * the supplied <code>ImageReadParam</code>.  The actual
      * subsampling factors, destination size, and destination offset
      * are <em>not</em> taken into consideration, thus further
-     * clipping must take place.  The {@link #computeRegions
-     * <code>computeRegions</code>} method performs all necessary
-     * clipping.
+     * clipping must take place.  The {@link #computeRegions computeRegions}
+     * method performs all necessary clipping.
      *
      * @param param the <code>ImageReadParam</code> being used, or
      * <code>null</code>.
@@ -2601,7 +2597,7 @@
      * width or height of 0, an <code>IllegalArgumentException</code>
      * is thrown.
      *
-     * <p> The {@link #getSourceRegion <code>getSourceRegion</code>}
+     * <p> The {@link #getSourceRegion getSourceRegion>}
      * method may be used if only source clipping is desired.
      *
      * @param param an <code>ImageReadParam</code>, or <code>null</code>.
--- a/jdk/src/share/classes/javax/imageio/ImageTypeSpecifier.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/ImageTypeSpecifier.java	Wed Jul 05 19:07:19 2017 +0200
@@ -840,7 +840,7 @@
      * not one of 1, 2, 4, 8, or 16.
      * @exception IllegalArgumentException if the
      * non-<code>null</code> LUT parameters do not have lengths of
-     * exactly <code>1 << bits</code>.
+     * exactly {@code 1 << bits}.
      * @exception IllegalArgumentException if <code>dataType</code> is
      * not one of <code>DataBuffer.TYPE_BYTE</code>,
      * <code>DataBuffer.TYPE_SHORT</code>,
--- a/jdk/src/share/classes/javax/imageio/ImageWriteParam.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/ImageWriteParam.java	Wed Jul 05 19:07:19 2017 +0200
@@ -49,7 +49,7 @@
  * and include additional pixels within the intersected bounds
  * according to the horizontal and vertical subsampling factors
  * specified by {@link IIOParam#setSourceSubsampling
- * <code>IIOParam.setSourceSubsampling</code>}.
+ * IIOParam.setSourceSubsampling}.
  *
  * <p> Individual features such as tiling, progressive encoding, and
  * compression may be set in one of four modes.
@@ -462,9 +462,8 @@
      * <code>IllegalStateException</code>.
      *
      * <li><code>MODE_EXPLICIT</code> - The image will be tiled
-     * according to parameters given in the {@link #setTiling
-     * <code>setTiling</code>} method.  Any previously set tiling
-     * parameters are discarded.
+     * according to parameters given in the {@link #setTiling setTiling}
+     * method.  Any previously set tiling parameters are discarded.
      *
      * <li><code>MODE_COPY_FROM_METADATA</code> - The image will
      * conform to the metadata object passed in to a write.
@@ -1421,7 +1420,7 @@
      * with <code>getCompressionQualityDescriptions</code> as part of a user
      * interface for setting or displaying the compression quality
      * level.  See {@link #getCompressionQualityDescriptions
-     * <code>getCompressionQualityDescriptions</code>} for more information.
+     * getCompressionQualityDescriptions} for more information.
      *
      * <p> If no descriptions are available, <code>null</code> is
      * returned.  If <code>null</code> is returned from
--- a/jdk/src/share/classes/javax/imageio/ImageWriter.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/ImageWriter.java	Wed Jul 05 19:07:19 2017 +0200
@@ -692,7 +692,7 @@
      * output prior to the current seek position may be flushed, and
      * need not be readable or writable, unless the plug-in needs to
      * be able to patch up the header information when
-     * <code>endWriteSequence</code> is called (<italic>e.g.</italic> TIFF).
+     * <code>endWriteSequence</code> is called (<i>e.g.</i> TIFF).
      *
      * <p> If <code>canWriteSequence</code> returns <code>false</code>,
      * this method will throw an
--- a/jdk/src/share/classes/javax/imageio/metadata/IIOMetadataFormatImpl.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/metadata/IIOMetadataFormatImpl.java	Wed Jul 05 19:07:19 2017 +0200
@@ -729,6 +729,7 @@
      * @param required <code>true</code> if an object value must be present.
      * @param defaultValue the default value for the
      * <code>Object</code> reference, or <code>null</code>.
+     * @param <T> the type of the object.
      *
      * @exception IllegalArgumentException if <code>elementName</code>
      * is <code>null</code>, or is not a legal element name for this format.
@@ -765,6 +766,7 @@
      * @param enumeratedValues a <code>List</code> of
      * <code>Object</code>s containing the legal values for the
      * object reference.
+     * @param <T> the type of the object.
      *
      * @exception IllegalArgumentException if <code>elementName</code>
      * is <code>null</code>, or is not a legal element name for this format.
@@ -836,6 +838,7 @@
      * is inclusive.
      * @param maxInclusive <code>true</code> if <code>maxValue</code>
      * is inclusive.
+     * @param <T> the type of the object.
      *
      * @exception IllegalArgumentException if <code>elementName</code>
      * is <code>null</code>, or is not a legal element name for this
--- a/jdk/src/share/classes/javax/imageio/plugins/bmp/BMPImageWriteParam.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/plugins/bmp/BMPImageWriteParam.java	Wed Jul 05 19:07:19 2017 +0200
@@ -56,9 +56,9 @@
  * <p><table border=1>
  * <caption><b>Compression Types</b></caption>
  * <tr><th>Type String</th> <th>Description</th>  <th>Image Types</th></tr>
- * <tr><td>BI_RGB</td>  <td>Uncompressed RLE</td> <td><= 8-bits/sample</td></tr>
- * <tr><td>BI_RLE8</td> <td>8-bit Run Length Encoding</td> <td><= 8-bits/sample</td></tr>
- * <tr><td>BI_RLE4</td> <td>4-bit Run Length Encoding</td> <td><= 4-bits/sample</td></tr>
+ * <tr><td>BI_RGB</td>  <td>Uncompressed RLE</td> <td>{@literal <= } 8-bits/sample</td></tr>
+ * <tr><td>BI_RLE8</td> <td>8-bit Run Length Encoding</td> <td>{@literal <=} 8-bits/sample</td></tr>
+ * <tr><td>BI_RLE4</td> <td>4-bit Run Length Encoding</td> <td>{@literal <=} 4-bits/sample</td></tr>
  * <tr><td>BI_BITFIELDS</td> <td>Packed data</td> <td> 16 or 32 bits/sample</td></tr>
  * </table>
  */
--- a/jdk/src/share/classes/javax/imageio/plugins/jpeg/JPEGImageReadParam.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/plugins/jpeg/JPEGImageReadParam.java	Wed Jul 05 19:07:19 2017 +0200
@@ -46,16 +46,15 @@
  * This class allows the tables to be specified directly from client
  * code.  If no tables are specified either in the stream or in a
  * <code>JPEGImageReadParam</code>, then the stream is presumed to use
- * the "standard" visually lossless tables.  See {@link JPEGQTable
- * <code>JPEGQTable</code>} and {@link JPEGHuffmanTable
- * <code>JPEGHuffmanTable</code>} for more information on the default
- * tables.
+ * the "standard" visually lossless tables.  See {@link JPEGQTable JPEGQTable}
+ * and {@link JPEGHuffmanTable JPEGHuffmanTable} for more information
+ *  on the default tables.
  *
  * <p> The default <code>JPEGImageReadParam</code> returned by the
  * <code>getDefaultReadParam</code> method of the builtin JPEG reader
  * contains no tables.  Default tables may be obtained from the table
- * classes {@link JPEGQTable <code>JPEGQTable</code>} and {@link
- * JPEGHuffmanTable <code>JPEGHuffmanTable</code>}.
+ * classes {@link JPEGQTable JPEGQTable} and
+ * {@link JPEGHuffmanTable JPEGHuffmanTable}.
  *
  * <p> If a stream does contain tables, the tables given in a
  * <code>JPEGImageReadParam</code> are ignored.  Furthermore, if the
@@ -64,13 +63,12 @@
  * abbreviated images.  Once tables have been read from a stream, they
  * can be overridden only by tables subsequently read from the same
  * stream.  In order to specify new tables, the {@link
- * javax.imageio.ImageReader#setInput <code>setInput</code>} method of
+ * javax.imageio.ImageReader#setInput setInput} method of
  * the reader must be called to change the stream.
  *
  * <p> Note that this class does not provide a means for obtaining the
  * tables found in a stream.  These may be extracted from a stream by
- * consulting the <code>IIOMetadata</code> object returned by the
- * reader.
+ * consulting the IIOMetadata object returned by the reader.
  *
  * <p>
  * For more information about the operation of the built-in JPEG plug-ins,
--- a/jdk/src/share/classes/javax/imageio/plugins/jpeg/JPEGImageWriteParam.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/plugins/jpeg/JPEGImageWriteParam.java	Wed Jul 05 19:07:19 2017 +0200
@@ -66,8 +66,8 @@
  * when an abbreviated stream must be written without writing any tables
  * to a stream first.  In order to use this class, the metadata object
  * passed into the writer must contain no tables, and no stream metadata
- * must be provided.  See {@link JPEGQTable <code>JPEGQTable</code>} and
- * {@link JPEGHuffmanTable <code>JPEGHuffmanTable</code>} for more
+ * must be provided.  See {@link JPEGQTable JPEGQTable} and
+ * {@link JPEGHuffmanTable JPEGHuffmanTable} for more
  * information on the default tables.
  *
  * <p> The default <code>JPEGImageWriteParam</code> returned by the
@@ -80,7 +80,7 @@
  * set of tables has been written, only tables in the metadata can
  * override them for subsequent writes, whether to the same stream or
  * a different one.  In order to specify new tables using this class,
- * the {@link javax.imageio.ImageWriter#reset <code>reset</code>}
+ * the {@link javax.imageio.ImageWriter#reset reset}
  * method of the writer must be called.
  *
  * <p>
--- a/jdk/src/share/classes/javax/imageio/spi/ImageReaderSpi.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/spi/ImageReaderSpi.java	Wed Jul 05 19:07:19 2017 +0200
@@ -78,7 +78,7 @@
      * <code>ImageInputStream.class</code>, to be returned from
      * <code>getInputTypes</code>.
      * @deprecated Instead of using this field, directly create
-     * the equivalent array <code>{ ImageInputStream.class }<code>.
+     * the equivalent array <code>{ ImageInputStream.class }</code>.
      */
     @Deprecated
     public static final Class[] STANDARD_INPUT_TYPE =
--- a/jdk/src/share/classes/javax/imageio/spi/ImageWriterSpi.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/spi/ImageWriterSpi.java	Wed Jul 05 19:07:19 2017 +0200
@@ -80,7 +80,7 @@
      * <code>ImageOutputStream.class</code>, to be returned from
      * <code>getOutputTypes</code>.
      * @deprecated Instead of using this field, directly create
-     * the equivalent array <code>{ ImageOutputStream.class }<code>.
+     * the equivalent array <code>{ ImageOutputStream.class }</code>.
      */
     @Deprecated
     public static final Class[] STANDARD_OUTPUT_TYPE =
--- a/jdk/src/share/classes/javax/imageio/spi/ServiceRegistry.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/spi/ServiceRegistry.java	Wed Jul 05 19:07:19 2017 +0200
@@ -157,6 +157,8 @@
      * or <code>null</code> if the system class loader (or, failing that
      * the bootstrap class loader) is to be used.
      *
+     * @param <T> the type of the providerClass.
+     *
      * @return An <code>Iterator</code> that yields provider objects
      * for the given service, in some arbitrary order.  The iterator
      * will throw an <code>Error</code> if a provider-configuration
@@ -188,6 +190,8 @@
      * @param providerClass a <code>Class</code>object indicating the
      * class or interface of the service providers being detected.
      *
+     * @param <T> the type of the providerClass.
+     *
      * @return An <code>Iterator</code> that yields provider objects
      * for the given service, in some arbitrary order.  The iterator
      * will throw an <code>Error</code> if a provider-configuration
@@ -247,6 +251,7 @@
      * @param provider the service provide object to be registered.
      * @param category the category under which to register the
      * provider.
+     * @param <T> the type of the provider.
      *
      * @return true if no provider of the same class was previously
      * registered in the same category category.
@@ -348,6 +353,7 @@
      * @param provider the service provider object to be deregistered.
      * @param category the category from which to deregister the
      * provider.
+     * @param <T> the type of the provider.
      *
      * @return <code>true</code> if the provider was previously
      * registered in the same category category,
@@ -435,6 +441,7 @@
      * @param category the category to be retrieved from.
      * @param useOrdering <code>true</code> if pairwise orderings
      * should be taken account in ordering the returned objects.
+     * @param <T> the type of the category.
      *
      * @return an <code>Iterator</code> containing service provider
      * objects from the given category, possibly in order.
@@ -490,6 +497,7 @@
      * whose <code>filter</code> method will be invoked.
      * @param useOrdering <code>true</code> if pairwise orderings
      * should be taken account in ordering the returned objects.
+     * @param <T> the type of the category.
      *
      * @return an <code>Iterator</code> containing service provider
      * objects from the given category, possibly in order.
@@ -517,6 +525,7 @@
      *
      * @param providerClass the <code>Class</code> of the desired
      * service provider object.
+     * @param <T> the type of the provider.
      *
      * @return a currently registered service provider object with the
      * desired <code>Class</code>type, or <code>null</code> is none is
@@ -561,6 +570,7 @@
      * @param firstProvider the preferred provider.
      * @param secondProvider the provider to which
      * <code>firstProvider</code> is preferred.
+     * @param <T> the type of the category.
      *
      * @return <code>true</code> if a previously unset ordering
      * was established.
@@ -606,6 +616,7 @@
      * @param firstProvider the formerly preferred provider.
      * @param secondProvider the provider to which
      * <code>firstProvider</code> was formerly preferred.
+     * @param <T> the type of the category.
      *
      * @return <code>true</code> if a previously set ordering was
      * disestablished.
--- a/jdk/src/share/classes/javax/imageio/stream/ImageInputStream.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/stream/ImageInputStream.java	Wed Jul 05 19:07:19 2017 +0200
@@ -183,7 +183,7 @@
      *
      * @return a boolean value from the stream.
      *
-     * @exception EOFException if the end of the stream is reached.
+     * @exception java.io.EOFException if the end of the stream is reached.
      * @exception IOException if an I/O error occurs.
      */
     boolean readBoolean() throws IOException;
@@ -201,7 +201,7 @@
      *
      * @return a signed byte value from the stream.
      *
-     * @exception EOFException if the end of the stream is reached.
+     * @exception java.io.EOFException if the end of the stream is reached.
      * @exception IOException if an I/O error occurs.
      */
     byte readByte() throws IOException;
@@ -225,7 +225,7 @@
      *
      * @return an unsigned byte value from the stream.
      *
-     * @exception EOFException if the end of the stream is reached.
+     * @exception java.io.EOFException if the end of the stream is reached.
      * @exception IOException if an I/O error occurs.
      */
     int readUnsignedByte() throws IOException;
@@ -240,7 +240,7 @@
      *
      * @return a signed short value from the stream.
      *
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      *
@@ -261,7 +261,7 @@
      *
      * @return an unsigned short value from the stream, as an int.
      *
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      *
@@ -278,7 +278,7 @@
      *
      * @return an unsigned char value from the stream.
      *
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      *
@@ -296,7 +296,7 @@
      *
      * @return a signed int value from the stream.
      *
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      *
@@ -316,7 +316,7 @@
      *
      * @return an unsigned int value from the stream, as a long.
      *
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      *
@@ -334,7 +334,7 @@
      *
      * @return a signed long value from the stream.
      *
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      *
@@ -352,7 +352,7 @@
      *
      * @return a float value from the stream.
      *
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      *
@@ -370,7 +370,7 @@
      *
      * @return a double value from the stream.
      *
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      *
@@ -469,7 +469,7 @@
      * then a <code>UTFDataFormatException</code> is thrown.
      *
      * <p> If end of file is encountered at any time during this
-     * entire process, then an <code>EOFException</code> is thrown.
+     * entire process, then an <code>java.io.EOFException</code> is thrown.
      *
      * <p> After every group has been converted to a character by this
      * process, the characters are gathered, in the same order in
@@ -488,10 +488,10 @@
      *
      * @return a String read from the stream.
      *
-     * @exception  EOFException  if this stream reaches the end
+     * @exception  java.io.EOFException  if this stream reaches the end
      * before reading all the bytes.
-     * @exception  UTFDataFormatException if the bytes do not represent a
-     * valid modified UTF-8 encoding of a string.
+     * @exception  java.io.UTFDataFormatException if the bytes do not represent
+     * a valid modified UTF-8 encoding of a string.
      * @exception IOException if an I/O error occurs.
      */
     String readUTF() throws IOException;
@@ -499,7 +499,7 @@
     /**
      * Reads <code>len</code> bytes from the stream, and stores them
      * into <code>b</code> starting at index <code>off</code>.
-     * If the end of the stream is reached, an <code>EOFException</code>
+     * If the end of the stream is reached, an <code>java.io.EOFException</code>
      * will be thrown.
      *
      * <p> The bit offset within the stream is reset to zero before
@@ -514,7 +514,7 @@
      * len</code> is greater than <code>b.length</code>.
      * @exception NullPointerException if <code>b</code> is
      * <code>null</code>.
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      */
@@ -523,7 +523,7 @@
     /**
      * Reads <code>b.length</code> bytes from the stream, and stores them
      * into <code>b</code> starting at index <code>0</code>.
-     * If the end of the stream is reached, an <code>EOFException</code>
+     * If the end of the stream is reached, an <code>java.io.EOFException</code>
      * will be thrown.
      *
      * <p> The bit offset within the stream is reset to zero before
@@ -533,7 +533,7 @@
      *
      * @exception NullPointerException if <code>b</code> is
      * <code>null</code>.
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      */
@@ -544,7 +544,7 @@
      * stream according to the current byte order, and
      * stores them into <code>s</code> starting at index
      * <code>off</code>.  If the end of the stream is reached, an
-     * <code>EOFException</code> will be thrown.
+     * <code>java.io.EOFException</code> will be thrown.
      *
      * <p> The bit offset within the stream is reset to zero before
      * the read occurs.
@@ -558,7 +558,7 @@
      * len</code> is greater than <code>s.length</code>.
      * @exception NullPointerException if <code>s</code> is
      * <code>null</code>.
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      */
@@ -569,7 +569,7 @@
      * stream according to the current byte order, and
      * stores them into <code>c</code> starting at index
      * <code>off</code>.  If the end of the stream is reached, an
-     * <code>EOFException</code> will be thrown.
+     * <code>java.io.EOFException</code> will be thrown.
      *
      * <p> The bit offset within the stream is reset to zero before
      * the read occurs.
@@ -583,7 +583,7 @@
      * len</code> is greater than <code>c.length</code>.
      * @exception NullPointerException if <code>c</code> is
      * <code>null</code>.
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      */
@@ -594,7 +594,7 @@
      * stream according to the current byte order, and
      * stores them into <code>i</code> starting at index
      * <code>off</code>.  If the end of the stream is reached, an
-     * <code>EOFException</code> will be thrown.
+     * <code>java.io.EOFException</code> will be thrown.
      *
      * <p> The bit offset within the stream is reset to zero before
      * the read occurs.
@@ -608,7 +608,7 @@
      * len</code> is greater than <code>i.length</code>.
      * @exception NullPointerException if <code>i</code> is
      * <code>null</code>.
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      */
@@ -619,7 +619,7 @@
      * stream according to the current byte order, and
      * stores them into <code>l</code> starting at index
      * <code>off</code>.  If the end of the stream is reached, an
-     * <code>EOFException</code> will be thrown.
+     * <code>java.io.EOFException</code> will be thrown.
      *
      * <p> The bit offset within the stream is reset to zero before
      * the read occurs.
@@ -633,7 +633,7 @@
      * len</code> is greater than <code>l.length</code>.
      * @exception NullPointerException if <code>l</code> is
      * <code>null</code>.
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      */
@@ -644,7 +644,7 @@
      * floats) from the stream according to the current byte order,
      * and stores them into <code>f</code> starting at
      * index <code>off</code>.  If the end of the stream is reached,
-     * an <code>EOFException</code> will be thrown.
+     * an <code>java.io.EOFException</code> will be thrown.
      *
      * <p> The bit offset within the stream is reset to zero before
      * the read occurs.
@@ -658,7 +658,7 @@
      * len</code> is greater than <code>f.length</code>.
      * @exception NullPointerException if <code>f</code> is
      * <code>null</code>.
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      */
@@ -669,7 +669,7 @@
      * floats) from the stream according to the current byte order,
      * and stores them into <code>d</code> starting at
      * index <code>off</code>.  If the end of the stream is reached,
-     * an <code>EOFException</code> will be thrown.
+     * an <code>java.io.EOFException</code> will be thrown.
      *
      * <p> The bit offset within the stream is reset to zero before
      * the read occurs.
@@ -683,7 +683,7 @@
      * len</code> is greater than <code>d.length</code>.
      * @exception NullPointerException if <code>d</code> is
      * <code>null</code>.
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bytes.
      * @exception IOException if an I/O error occurs.
      */
@@ -748,7 +748,7 @@
      * @return an <code>int</code> containing the value <code>0</code>
      * or <code>1</code>.
      *
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bits.
      * @exception IOException if an I/O error occurs.
      */
@@ -768,13 +768,13 @@
      * the right side of the return value, as shown by the following
      * pseudo-code:
      *
-     * <pre>
+     * <pre>{@code
      * long accum = 0L;
      * for (int i = 0; i < numBits; i++) {
      *   accum <<= 1; // Shift left one bit to make room
      *   accum |= readBit();
      * }
-     * </pre>
+     * }</pre>
      *
      * Note that the result of <code>readBits(32)</code> may thus not
      * be equal to that of <code>readInt()</code> if a reverse network
@@ -782,7 +782,7 @@
      * false</code>).
      *
      * <p> If the end of the stream is encountered before all the bits
-     * have been read, an <code>EOFException</code> is thrown.
+     * have been read, an <code>java.io.EOFException</code> is thrown.
      *
      * @param numBits the number of bits to read, as an <code>int</code>
      * between 0 and 64, inclusive.
@@ -791,7 +791,7 @@
      *
      * @exception IllegalArgumentException if <code>numBits</code>
      * is not between 0 and 64, inclusive.
-     * @exception EOFException if the stream reaches the end before
+     * @exception java.io.EOFException if the stream reaches the end before
      * reading all the bits.
      * @exception IOException if an I/O error occurs.
      */
@@ -850,7 +850,7 @@
      * returned by <code>getflushedPosition</code>).
      *
      * <p> It is legal to seek past the end of the file; an
-     * <code>EOFException</code> will be thrown only if a read is
+     * <code>java.io.EOFException</code> will be thrown only if a read is
      * performed.
      *
      * @param pos a <code>long</code> containing the desired file
--- a/jdk/src/share/classes/javax/imageio/stream/ImageInputStreamImpl.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/stream/ImageInputStreamImpl.java	Wed Jul 05 19:07:19 2017 +0200
@@ -88,7 +88,7 @@
     /**
      * The position prior to which data may be discarded.  Seeking
      * to a smaller position is not allowed.  <code>flushedPos</code>
-     * will always be >= 0.
+     * will always be {@literal >= 0}.
      */
     protected long flushedPos = 0;
 
--- a/jdk/src/share/classes/javax/imageio/stream/ImageOutputStream.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/imageio/stream/ImageOutputStream.java	Wed Jul 05 19:07:19 2017 +0200
@@ -59,9 +59,9 @@
      * remainder of the current byte is padded with 0s
      * and written out first.  The bit offset will be 0 after the
      * write.  Implementers can use the
-     * {@link ImageOutputStreamImpl#flushBits <code>flushBits</code>}
-     * method of {@link ImageOutputStreamImpl
-     * <code>ImageOutputStreamImpl</code>} to guarantee this.
+     * {@link ImageOutputStreamImpl#flushBits flushBits}
+     * method of {@link ImageOutputStreamImpl ImageOutputStreamImpl}
+     * to guarantee this.
      *
      * @param b an <code>int</code> whose lower 8 bits are to be
      * written.
@@ -99,9 +99,9 @@
      * remainder of the current byte is padded with 0s
      * and written out first.  The bit offset will be 0 after the
      * write.  Implementers can use the
-     * {@link ImageOutputStreamImpl#flushBits <code>flushBits</code>}
-     * method of {@link ImageOutputStreamImpl
-     * <code>ImageOutputStreamImpl</code>} to guarantee this.
+     * {@link ImageOutputStreamImpl#flushBits flushBits}
+     * method of {@link ImageOutputStreamImpl ImageOutputStreamImpl}
+     * to guarantee this.
      *
      * @param b an array of <code>byte</code>s to be written.
      * @param off the start offset in the data.
@@ -182,8 +182,7 @@
     void writeShort(int v) throws IOException;
 
     /**
-     * This method is a synonym for
-     * {@link #writeShort <code>writeShort</code>}.
+     * This method is a synonym for {@link #writeShort writeShort}.
      *
      * @param v an <code>int</code> containing the char (unsigned
      * short) value to be written.
@@ -430,7 +429,7 @@
      *
      * @exception NullPointerException if <code>s</code> is
      * <code>null</code>.
-     * @exception UTFDataFormatException if the modified UTF-8
+     * @exception java.io.UTFDataFormatException if the modified UTF-8
      * representation of <code>s</code> requires more than 65536 bytes.
      * @exception IOException if an I/O error occurs.
      */
--- a/jdk/src/share/classes/javax/management/relation/RelationNotification.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/management/relation/RelationNotification.java	Wed Jul 05 19:07:19 2017 +0200
@@ -260,7 +260,7 @@
 
         super(notifType, sourceObj, sequence, timeStamp, message);
 
-        if (!isValidBasic(notifType,sourceObj,id,typeName) || !isValidCreate(notifType)) {
+        if (!isValidBasicStrict(notifType,sourceObj,id,typeName) || !isValidCreate(notifType)) {
             throw new IllegalArgumentException("Invalid parameter.");
         }
 
@@ -310,7 +310,7 @@
 
         super(notifType, sourceObj, sequence, timeStamp, message);
 
-        if (!isValidBasic(notifType,sourceObj,id,typeName) || !isValidUpdate(notifType,name,newValue,oldValue)) {
+        if (!isValidBasicStrict(notifType,sourceObj,id,typeName) || !isValidUpdate(notifType,name,newValue,oldValue)) {
             throw new IllegalArgumentException("Invalid parameter.");
         }
 
@@ -457,14 +457,26 @@
     //  - no role old value (for role update)
     //  - no role new value (for role update)
 
+    // Despite the fact, that validation in constructor of RelationNotification prohibit
+    // creation of the class instance with null sourceObj its possible to set it to null later
+    // by public setSource() method.
+    // So we should relax validation rules to preserve serialization behavior compatibility.
+
+    private boolean isValidBasicStrict(String notifType, Object sourceObj, String id, String typeName){
+        if (sourceObj == null) {
+            return false;
+        }
+        return isValidBasic(notifType,sourceObj,id,typeName);
+    }
+
     private boolean isValidBasic(String notifType, Object sourceObj, String id, String typeName){
-        if (notifType == null || sourceObj == null ||
-            id == null || typeName == null) {
+        if (notifType == null || id == null || typeName == null) {
             return false;
         }
 
-        if (!(sourceObj instanceof RelationService) &&
-            !(sourceObj instanceof ObjectName)) {
+        if (sourceObj != null && (
+            !(sourceObj instanceof RelationService) &&
+            !(sourceObj instanceof ObjectName))) {
             return false;
         }
 
--- a/jdk/src/share/classes/javax/print/DocFlavor.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/DocFlavor.java	Wed Jul 05 19:07:19 2017 +0200
@@ -286,7 +286,7 @@
  * "autosensing" works is implementation dependent. In general, preformatted
  * autosense print data is provided in a byte oriented representation class
  * (byte array, InputStream, URL).
- *
+ * </UL>
  * <P>
  * <HR>
  * <H3>Service Formatted Print Data</H3>
@@ -545,7 +545,7 @@
      * the match.
      * @return String representing a mime parameter, or
      * null if that parameter is not in the mime type string.
-     * @exception throws NullPointerException if paramName is null.
+     * @exception NullPointerException if paramName is null.
      */
     public String getParameter(String paramName) {
         return
--- a/jdk/src/share/classes/javax/print/MultiDocPrintJob.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/MultiDocPrintJob.java	Wed Jul 05 19:07:19 2017 +0200
@@ -47,7 +47,7 @@
      * PrintJobListener.
      *
      * @param multiDoc The documents to be printed. ALL must be a flavor
-     *                          supported by the PrintJob & PrintService.
+     *        supported by the PrintJob {@literal &} PrintService.
      *
      * @param attributes The job attributes to be applied to this print job.
      *        If this parameter is null then the default attributes are used.
--- a/jdk/src/share/classes/javax/print/PrintService.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/PrintService.java	Wed Jul 05 19:07:19 2017 +0200
@@ -40,7 +40,7 @@
  * a printer's supported attributes.
  * <P>
  * Example:
- *   <PRE>
+ *   <PRE>{@code
  *   DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
  *   PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
  *   aset.add(MediaSizeName.ISO_A4);
@@ -56,7 +56,7 @@
  *        } catch (PrintException e) {
  *        }
  *   }
- *   </PRE>
+ *   }</PRE>
  */
 public interface PrintService {
 
--- a/jdk/src/share/classes/javax/print/ServiceUI.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/ServiceUI.java	Wed Jul 05 19:07:19 2017 +0200
@@ -118,7 +118,7 @@
      * any changes made by the user.
      *
      * A typical basic usage of this method may be :
-     * <pre>
+     * <pre>{@code
      * PrintService[] services = PrintServiceLookup.lookupPrintServices(
      *                            DocFlavor.INPUT_STREAM.JPEG, null);
      * PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
@@ -131,7 +131,7 @@
      *     ... print ...
      *    }
      * }
-     * </pre>
+     * }</pre>
      * <p>
 
      * @param gc used to select screen. null means primary or default screen.
--- a/jdk/src/share/classes/javax/print/ServiceUIFactory.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/ServiceUIFactory.java	Wed Jul 05 19:07:19 2017 +0200
@@ -39,8 +39,8 @@
  * initialize services only when needed without any API dependencies
  * except in an environment in which they are used.
  * <p>
- * Swing UIs are preferred as they provide a more consistent L&F and
- * can support accessibility APIs.
+ * Swing UIs are preferred as they provide a more consistent {@literal L&F}
+ * and can support accessibility APIs.
  * <p>
  * Example usage:
  * <pre>
--- a/jdk/src/share/classes/javax/print/attribute/AttributeSet.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/AttributeSet.java	Wed Jul 05 19:07:19 2017 +0200
@@ -42,7 +42,7 @@
  * class rather than the attribute object's class itself. An attribute
  * object's
  * category is determined by calling the {@link Attribute#getCategory()
- * <CODE>getCategory()</CODE>} method defined in interface {@link Attribute
+ * getCategory()} method defined in interface {@link Attribute
  * Attribute}.
  * <P>
  * The interfaces of an AttributeSet resemble those of the Java Collections
@@ -217,7 +217,7 @@
     /**
      * Adds all of the elements in the specified set to this attribute.
      * The outcome is the same as if the =
-     * {@link #add(Attribute) <CODE>add(Attribute)</CODE>}
+     * {@link #add(Attribute) add(Attribute)}
      * operation had been applied to this attribute set successively with each
      * element from the specified set.
      * The behavior of the <CODE>addAll(AttributeSet)</CODE>
@@ -301,7 +301,7 @@
      * This ensures that <tt>t1.equals(t2)</tt> implies that
      * <tt>t1.hashCode()==t2.hashCode()</tt> for any two attribute sets
      * <tt>t1</tt> and <tt>t2</tt>, as required by the general contract of
-     * {@link java.lang.Object#hashCode() <CODE>Object.hashCode()</CODE>}.
+     * {@link java.lang.Object#hashCode() Object.hashCode()}.
      *
      * @return  The hash code value for this attribute set.
      */
--- a/jdk/src/share/classes/javax/print/attribute/DateTimeSyntax.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/DateTimeSyntax.java	Wed Jul 05 19:07:19 2017 +0200
@@ -36,9 +36,9 @@
  * <P>
  * Under the hood, a date-time attribute is stored as a value of class <code>
  * java.util.Date</code>. You can get a date-time attribute's Date value by
- * calling {@link #getValue() <CODE>getValue()</CODE>}. A date-time attribute's
+ * calling {@link #getValue() getValue()}. A date-time attribute's
  * Date value is established when it is constructed (see {@link
- * #DateTimeSyntax(Date) <CODE>DateTimeSyntax(Date)</CODE>}). Once
+ * #DateTimeSyntax(Date) DateTimeSyntax(Date)}). Once
  * constructed, a date-time attribute's value is immutable.
  * <P>
  * To construct a date-time attribute from separate values of the year, month,
--- a/jdk/src/share/classes/javax/print/attribute/DocAttributeSet.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/DocAttributeSet.java	Wed Jul 05 19:07:19 2017 +0200
@@ -37,8 +37,8 @@
  * constructors and mutating operations guarantee an additional invariant,
  * namely that all attribute values in the DocAttributeSet must be instances
  * of interface {@link DocAttribute DocAttribute}.
- * The {@link #add(Attribute) <CODE>add(Attribute)</CODE>}, and
- * {@link #addAll(AttributeSet) <CODE>addAll(AttributeSet)</CODE>} operations
+ * The {@link #add(Attribute) add(Attribute)}, and
+ * {@link #addAll(AttributeSet) addAll(AttributeSet)} operations
  * are respecified below to guarantee this additional invariant.
  * <P>
  *
@@ -74,7 +74,7 @@
     /**
      * Adds all of the elements in the specified set to this attribute.
      * The outcome is  the same as if the
-     * {@link #add(Attribute) <CODE>add(Attribute)</CODE>}
+     * {@link #add(Attribute) add(Attribute)}
      * operation had been applied to this attribute set successively with
      * each element from the specified set. If none of the categories in the
      * specified set  are the same as any categories in this attribute set,
--- a/jdk/src/share/classes/javax/print/attribute/EnumSyntax.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/EnumSyntax.java	Wed Jul 05 19:07:19 2017 +0200
@@ -81,15 +81,15 @@
  * for identical objects (<CODE>==</CODE>).
  * <P>
  * You can convert an enumeration value to a string by calling {@link
- * #toString() <CODE>toString()</CODE>}. The string is obtained from a table
+ * #toString() toString()}. The string is obtained from a table
  * supplied by the enumeration class.
  * <P>
  * Under the hood, an enumeration value is just an integer, a different integer
  * for each enumeration value within an enumeration class. You can get an
  * enumeration value's integer value by calling {@link #getValue()
- * <CODE>getValue()</CODE>}. An enumeration value's integer value is established
+ * getValue()}. An enumeration value's integer value is established
  * when it is constructed (see {@link #EnumSyntax(int)
- * <CODE>EnumSyntax(int)</CODE>}). Since the constructor is protected, the only
+ * EnumSyntax(int)}). Since the constructor is protected, the only
  * possible enumeration values are the singleton objects declared in the
  * enumeration class; additional enumeration values cannot be created at run
  * time.
@@ -170,10 +170,10 @@
      *
      * @return  The enumeration singleton value stored at index
      *          <I>i</I>-<I>L</I> in the enumeration value table returned by
-     *          {@link #getEnumValueTable() <CODE>getEnumValueTable()</CODE>},
+     *          {@link #getEnumValueTable() getEnumValueTable()},
      *          where <I>i</I> is this enumeration value's integer value and
      *          <I>L</I> is the value returned by {@link #getOffset()
-     *          <CODE>getOffset()</CODE>}.
+     *          getOffset()}.
      *
      * @throws ObjectStreamException if the stream can't be deserialised
      * @throws  InvalidObjectException
@@ -220,18 +220,18 @@
      * Returns the string table for this enumeration value's enumeration class.
      * The enumeration class's integer values are assumed to lie in the range
      * <I>L</I>..<I>L</I>+<I>N</I>-1, where <I>L</I> is the value returned by
-     * {@link #getOffset() <CODE>getOffset()</CODE>} and <I>N</I> is the length
+     * {@link #getOffset() getOffset()} and <I>N</I> is the length
      * of the string table. The element in the string table at index
      * <I>i</I>-<I>L</I> is the value returned by {@link #toString()
-     * <CODE>toString()</CODE>} for the enumeration value whose integer value
+     * toString()} for the enumeration value whose integer value
      * is <I>i</I>. If an integer within the above range is not used by any
      * enumeration value, leave the corresponding table element null.
      * <P>
      * The default implementation returns null. If the enumeration class (a
      * subclass of class EnumSyntax) does not override this method to return a
      * non-null string table, and the subclass does not override the {@link
-     * #toString() <CODE>toString()</CODE>} method, the base class {@link
-     * #toString() <CODE>toString()</CODE>} method will return just a string
+     * #toString() toString()} method, the base class {@link
+     * #toString() toString()} method will return just a string
      * representation of this enumeration value's integer value.
      * @return the string table
      */
@@ -243,11 +243,11 @@
      * Returns the enumeration value table for this enumeration value's
      * enumeration class. The enumeration class's integer values are assumed to
      * lie in the range <I>L</I>..<I>L</I>+<I>N</I>-1, where <I>L</I> is the
-     * value returned by {@link #getOffset() <CODE>getOffset()</CODE>} and
+     * value returned by {@link #getOffset() getOffset()} and
      * <I>N</I> is the length of the enumeration value table. The element in the
      * enumeration value table at index <I>i</I>-<I>L</I> is the enumeration
      * value object whose integer value is <I>i</I>; the {@link #readResolve()
-     * <CODE>readResolve()</CODE>} method needs this to preserve singleton
+     * readResolve()} method needs this to preserve singleton
      * semantics during deserialization of an enumeration instance. If an
      * integer within the above range is not used by any enumeration value,
      * leave the corresponding table element null.
@@ -255,8 +255,8 @@
      * The default implementation returns null. If the enumeration class (a
      * subclass of class EnumSyntax) does not override this method to return
      * a non-null enumeration value table, and the subclass does not override
-     * the {@link #readResolve() <CODE>readResolve()</CODE>} method, the base
-     * class {@link #readResolve() <CODE>readResolve()</CODE>} method will throw
+     * the {@link #readResolve() readResolve()} method, the base
+     * class {@link #readResolve() readResolve()} method will throw
      * an exception whenever an enumeration instance is deserialized from an
      * object input stream.
      * @return the value table
--- a/jdk/src/share/classes/javax/print/attribute/HashAttributeSet.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/HashAttributeSet.java	Wed Jul 05 19:07:19 2017 +0200
@@ -388,7 +388,7 @@
     /**
      * Adds all of the elements in the specified set to this attribute.
      * The outcome is the same as if the
-     * {@link #add(Attribute) <CODE>add(Attribute)</CODE>}
+     * {@link #add(Attribute) add(Attribute)}
      * operation had been applied to this attribute set successively with
      * each element from the specified set.
      * The behavior of the <CODE>addAll(AttributeSet)</CODE>
@@ -512,7 +512,7 @@
      * This ensures that <tt>t1.equals(t2)</tt> implies that
      * <tt>t1.hashCode()==t2.hashCode()</tt> for any two attribute sets
      * <tt>t1</tt> and <tt>t2</tt>, as required by the general contract of
-     * {@link java.lang.Object#hashCode() <CODE>Object.hashCode()</CODE>}.
+     * {@link java.lang.Object#hashCode() Object.hashCode()}.
      *
      * @return  The hash code value for this attribute set.
      */
--- a/jdk/src/share/classes/javax/print/attribute/IntegerSyntax.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/IntegerSyntax.java	Wed Jul 05 19:07:19 2017 +0200
@@ -33,9 +33,9 @@
  * <P>
  * Under the hood, an integer attribute is just an integer. You can get an
  * integer attribute's integer value by calling {@link #getValue()
- * <CODE>getValue()</CODE>}. An integer attribute's integer value is
+ * getValue()}. An integer attribute's integer value is
  * established when it is constructed (see {@link #IntegerSyntax(int)
- * <CODE>IntegerSyntax(int)</CODE>}). Once constructed, an integer attribute's
+ * IntegerSyntax(int)}). Once constructed, an integer attribute's
  * value is immutable.
  * <P>
  *
--- a/jdk/src/share/classes/javax/print/attribute/PrintJobAttributeSet.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/PrintJobAttributeSet.java	Wed Jul 05 19:07:19 2017 +0200
@@ -36,8 +36,8 @@
  * constructors and mutating operations guarantee an additional invariant,
  * namely that all attribute values in the PrintJobAttributeSet must be
  * instances of interface {@link PrintJobAttribute PrintJobAttribute}.
- * The {@link #add(Attribute) <CODE>add(Attribute)</CODE>}, and
- * {@link #addAll(AttributeSet) <CODE>addAll(AttributeSet)</CODE>} operations
+ * The {@link #add(Attribute) add(Attribute)}, and
+ * {@link #addAll(AttributeSet) >addAll(AttributeSet)} operations
  * are respecified below to guarantee this additional invariant.
  * <P>
  *
@@ -72,7 +72,7 @@
     /**
      * Adds all of the elements in the specified set to this attribute.
      * The outcome is  the same as if the
-     * {@link #add(Attribute) <CODE>add(Attribute)</CODE>}
+     * {@link #add(Attribute) add(Attribute)}
      * operation had been applied to this attribute set successively with
      * each element from the specified set. If none of the categories in the
      * specified set  are the same as any categories in this attribute set,
--- a/jdk/src/share/classes/javax/print/attribute/PrintRequestAttributeSet.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/PrintRequestAttributeSet.java	Wed Jul 05 19:07:19 2017 +0200
@@ -37,8 +37,8 @@
  * constructors and mutating operations guarantee an additional invariant,
  * namely that all attribute values in the PrintRequestAttributeSet must be
  * instances of interface {@link PrintRequestAttribute PrintRequestAttribute}.
- * The {@link #add(Attribute) <CODE>add(Attribute)</CODE>}, and
- * {@link #addAll(AttributeSet) <CODE>addAll(AttributeSet)</CODE>} operations
+ * The {@link #add(Attribute) add(Attribute)}, and
+ * {@link #addAll(AttributeSet) addAll(AttributeSet)} operations
  * are respecified below to guarantee this additional invariant.
  * <P>
  *
@@ -73,7 +73,7 @@
     /**
      * Adds all of the elements in the specified set to this attribute.
      * The outcome is  the same as if the
-     * {@link #add(Attribute) <CODE>add(Attribute)</CODE>}
+     * {@link #add(Attribute) add(Attribute)}
      * operation had been applied to this attribute set successively with
      * each element from the specified set. If none of the categories in the
      * specified set  are the same as any categories in this attribute set,
--- a/jdk/src/share/classes/javax/print/attribute/PrintServiceAttributeSet.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/PrintServiceAttributeSet.java	Wed Jul 05 19:07:19 2017 +0200
@@ -39,8 +39,8 @@
  * invariant,
  * namely that all attribute values in the PrintServiceAttributeSet must be
  * instances of interface {@link PrintServiceAttribute PrintServiceAttribute}.
- * The {@link #add(Attribute) <CODE>add(Attribute)</CODE>}, and
- * {@link #addAll(AttributeSet) <CODE>addAll(AttributeSet)</CODE>} operations
+ * The {@link #add(Attribute) add(Attribute)}, and
+ * {@link #addAll(AttributeSet) addAll(AttributeSet)} operations
  * are respecified below to guarantee this additional invariant.
  * <P>
  *
@@ -77,7 +77,7 @@
     /**
      * Adds all of the elements in the specified set to this attribute.
      * The outcome is  the same as if the
-     * {@link #add(Attribute) <CODE>add(Attribute)</CODE>}
+     * {@link #add(Attribute) add(Attribute)}
      * operation had been applied to this attribute set successively with
      * each element from the specified set. If none of the categories in the
      * specified set  are the same as any categories in this attribute set,
--- a/jdk/src/share/classes/javax/print/attribute/ResolutionSyntax.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/ResolutionSyntax.java	Wed Jul 05 19:07:19 2017 +0200
@@ -39,7 +39,7 @@
  * resolution attribute's values, indicating the units in which the values are
  * to be returned. The two most common resolution units are dots per inch (dpi)
  * and dots per centimeter (dpcm), and exported constants {@link #DPI
- * <CODE>DPI</CODE>} and {@link #DPCM <CODE>DPCM</CODE>} are provided for
+ * DPI} and {@link #DPCM DPCM} are provided for
  * indicating those units.
  * <P>
  * Once constructed, a resolution attribute's value is immutable.
@@ -68,9 +68,9 @@
  * done, which would not be guaranteed if a floating point representation were
  * used.
  * <P>
- * The exported constant {@link #DPI <CODE>DPI</CODE>} is actually the
+ * The exported constant {@link #DPI DPI} is actually the
  * conversion factor by which to multiply a value in dpi to get the value in
- * dphi. Likewise, the exported constant {@link #DPCM <CODE>DPCM</CODE>} is the
+ * dphi. Likewise, the exported constant {@link #DPCM DPCM} is the
  * conversion factor by which to multiply a value in dpcm to get the value in
  * dphi. A client can specify a resolution value in units other than dpi or dpcm
  * by supplying its own conversion factor. However, since the internal units of
@@ -120,12 +120,12 @@
      * @param  feedResolution
      *     Feed direction resolution.
      * @param units
-     *     Unit conversion factor, e.g. {@link #DPI <CODE>DPI</CODE>} or
-     * {@link    #DPCM <CODE>DPCM</CODE>}.
+     *     Unit conversion factor, e.g. {@link #DPI DPI} or
+     * {@link    #DPCM DPCM}.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>crossFeedResolution</CODE> <
-     *     1 or <CODE>feedResolution</CODE> < 1 or <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code crossFeedResolution < 1}
+     *     or {@code feedResolution < 1} or {@code units < 1}.
      */
     public ResolutionSyntax(int crossFeedResolution, int feedResolution,
                             int units) {
@@ -172,14 +172,14 @@
      * The values are rounded to the nearest integer.
      *
      * @param  units
-     *     Unit conversion factor, e.g. {@link #DPI <CODE>DPI</CODE>} or
-     * {@link   #DPCM <CODE>DPCM</CODE>}.
+     *     Unit conversion factor, e.g. {@link #DPI DPI} or
+     * {@link   #DPCM DPCM}.
      *
      * @return  A two-element array with the cross feed direction resolution
      *          at index 0 and the feed direction resolution at index 1.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
     public int[] getResolution(int units) {
         return new int[] { getCrossFeedResolution(units),
@@ -192,13 +192,13 @@
      * the given units. The value is rounded to the nearest integer.
      *
      * @param  units
-     *     Unit conversion factor, e.g. {@link #DPI <CODE>DPI</CODE>} or
-     * {@link  #DPCM <CODE>DPCM</CODE>}.
+     *     Unit conversion factor, e.g. {@link #DPI DPI} or
+     * {@link  #DPCM DPCM}.
      *
      * @return  Cross feed direction resolution.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
     public int getCrossFeedResolution(int units) {
         return convertFromDphi (crossFeedResolution, units);
@@ -209,13 +209,13 @@
      * given units. The value is rounded to the nearest integer.
      *
      * @param  units
-     *     Unit conversion factor, e.g. {@link #DPI <CODE>DPI</CODE>} or {@link
-     *     #DPCM <CODE>DPCM</CODE>}.
+     *     Unit conversion factor, e.g. {@link #DPI DPI} or {@link
+     *     #DPCM DPCM}.
      *
      * @return  Feed direction resolution.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
     public int getFeedResolution(int units) {
         return convertFromDphi (feedResolution, units);
@@ -229,8 +229,8 @@
      * rounded to the nearest integer.
      *
      * @param  units
-     *     Unit conversion factor, e.g. {@link #DPI <CODE>DPI</CODE>} or {@link
-     *     #DPCM <CODE>DPCM</CODE>}.
+     *     Unit conversion factor, e.g. {@link #DPI CODE>DPI} or {@link
+     *     #DPCM DPCM}.
      * @param  unitsName
      *     Units name string, e.g. <CODE>"dpi"</CODE> or <CODE>"dpcm"</CODE>. If
      *     null, no units name is appended to the result.
@@ -238,7 +238,7 @@
      * @return  String version of this resolution attribute.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
     public String toString(int units, String unitsName) {
         StringBuffer result = new StringBuffer();
--- a/jdk/src/share/classes/javax/print/attribute/Size2DSyntax.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/Size2DSyntax.java	Wed Jul 05 19:07:19 2017 +0200
@@ -38,8 +38,8 @@
  * values are measured. Methods are provided to return a two-dimensional size
  * attribute's values, indicating the units in which the values are to be
  * returned. The two most common size units are inches (in) and millimeters
- * (mm), and exported constants {@link #INCH <CODE>INCH</CODE>} and {@link #MM
- * <CODE>MM</CODE>} are provided for indicating those units.
+ * (mm), and exported constants {@link #INCH INCH} and {@link #MM
+ * MM} are provided for indicating those units.
  * <P>
  * Once constructed, a two-dimensional size attribute's value is immutable.
  * <P>
@@ -66,9 +66,9 @@
  * units, you have to search for a media size of 215.9 x 279.4 mm; rounding off
  * to an integral 216 x 279 mm will not match.
  * <P>
- * The exported constant {@link #INCH <CODE>INCH</CODE>} is actually the
+ * The exported constant {@link #INCH INCH} is actually the
  * conversion factor by which to multiply a value in inches to get the value in
- * &#181;m. Likewise, the exported constant {@link #MM <CODE>MM</CODE>} is the
+ * &#181;m. Likewise, the exported constant {@link #MM MM} is the
  * conversion factor by which to multiply a value in mm to get the value in
  * &#181;m. A client can specify a resolution value in units other than inches
  * or mm by supplying its own conversion factor. However, since the internal
@@ -117,12 +117,12 @@
      * @param  x  X dimension.
      * @param  y  Y dimension.
      * @param  units
-     *     Unit conversion factor, e.g. {@link #INCH <CODE>INCH</CODE>} or
-     *     {@link #MM <CODE>MM</CODE>}.
+     *     Unit conversion factor, e.g. {@link #INCH INCH} or
+     *     {@link #MM MM}.
      *
      * @exception  IllegalArgumentException
-     *     (Unchecked exception) Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE>
-     *     < 0 or <CODE>units</CODE> < 1.
+     *     (Unchecked exception) Thrown if {@code x < 0} or {@code y < 0} or
+     *     {@code units < 1}.
      */
     protected Size2DSyntax(float x, float y, int units) {
         if (x < 0.0f) {
@@ -145,12 +145,12 @@
      * @param  x  X dimension.
      * @param  y  Y dimension.
      * @param  units
-     *     Unit conversion factor, e.g. {@link #INCH <CODE>INCH</CODE>} or
-     *     {@link #MM <CODE>MM</CODE>}.
+     *     Unit conversion factor, e.g. {@link #INCH INCH} or
+     *     {@link #MM MM}.
      *
      * @exception  IllegalArgumentException
-     *   (Unchecked exception) Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE>
-     *    < 0 or <CODE>units</CODE> < 1.
+     *   (Unchecked exception) Thrown if {@code x < 0} or {@code y < 0}
+     *    or {@code units < 1}.
      */
     protected Size2DSyntax(int x, int y, int units) {
         if (x < 0) {
@@ -193,14 +193,13 @@
      * as floating-point values.
      *
      * @param  units
-     *     Unit conversion factor, e.g. {@link #INCH <CODE>INCH</CODE>} or
-     *     {@link #MM <CODE>MM</CODE>}.
+     *     Unit conversion factor, e.g. {@link #INCH INCH} or {@link #MM MM}.
      *
      * @return  A two-element array with the X dimension at index 0 and the Y
      *          dimension at index 1.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
     public float[] getSize(int units) {
         return new float[] {getX(units), getY(units)};
@@ -211,13 +210,12 @@
      * units as a floating-point value.
      *
      * @param  units
-     *     Unit conversion factor, e.g. {@link #INCH <CODE>INCH</CODE>} or
-     *     {@link #MM <CODE>MM</CODE>}.
+     *     Unit conversion factor, e.g. {@link #INCH INCH} or {@link #MM MM}.
      *
      * @return  X dimension.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
     public float getX(int units) {
         return convertFromMicrometers(x, units);
@@ -228,13 +226,12 @@
      * units as a floating-point value.
      *
      * @param  units
-     *     Unit conversion factor, e.g. {@link #INCH <CODE>INCH</CODE>} or
-     *     {@link #MM <CODE>MM</CODE>}.
+     *     Unit conversion factor, e.g. {@link #INCH INCH} or {@link #MM MM}.
      *
      * @return  Y dimension.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
     public float getY(int units) {
         return convertFromMicrometers(y, units);
@@ -248,16 +245,16 @@
      * floating point.
      *
      * @param  units
-     *     Unit conversion factor, e.g. {@link #INCH <CODE>INCH</CODE>} or
-     *     {@link #MM <CODE>MM</CODE>}.
+     *     Unit conversion factor, e.g. {@link #INCH INCH} or {@link #MM MM}.
+     *
      * @param  unitsName
-     *     Units name string, e.g. <CODE>"in"</CODE> or <CODE>"mm"</CODE>. If
+     *     Units name string, e.g. {@code in} or {@code mm}. If
      *     null, no units name is appended to the result.
      *
      * @return  String version of this two-dimensional size attribute.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
     public String toString(int units, String unitsName) {
         StringBuffer result = new StringBuffer();
--- a/jdk/src/share/classes/javax/print/attribute/standard/Chromaticity.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/standard/Chromaticity.java	Wed Jul 05 19:07:19 2017 +0200
@@ -40,11 +40,11 @@
  * can be verified to support color printing.
  * <P>
  * The table below shows the effects of specifying a Chromaticity attribute of
- * {@link #MONOCHROME <CODE>MONOCHROME</CODE>} or {@link #COLOR
- * <CODE>COLOR</CODE>} for a monochrome or color document.
+ * {@link #MONOCHROME MONOCHROME} or {@link #COLOR COLOR}
+ * for a monochrome or color document.
  * <P>
  * <TABLE BORDER=1 CELLPADDING=2 CELLSPACING=1 SUMMARY="Shows effects of specifying MONOCHROME or COLOR Chromaticity attributes">
- * <TR BGCOLOR="#E5E5E5">
+ * <TR>
  * <TH>
  * Chromaticity<BR>Attribute
  * </TH>
@@ -57,7 +57,7 @@
  * </TR>
  * <TR>
  * <TD>
- * {@link #MONOCHROME <CODE>MONOCHROME</CODE>}
+ * {@link #MONOCHROME MONOCHROME}
  * </TD>
  * <TD>
  * Printed as is, in monochrome
@@ -68,7 +68,7 @@
  * </TR>
  * <TR>
  * <TD>
- * {@link #COLOR <CODE>COLOR</CODE>}
+ * {@link #COLOR COLOR}
  * </TD>
  * <TD>
  * Printed as is, in monochrome
--- a/jdk/src/share/classes/javax/print/attribute/standard/Compression.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/standard/Compression.java	Wed Jul 05 19:07:19 2017 +0200
@@ -34,7 +34,7 @@
  * print data (the doc), not of the Print Job. If a Compression attribute is not
  * specified for a doc, the printer assumes the doc's print data is uncompressed
  * (i.e., the default Compression value is always {@link #NONE
- * <CODE>NONE</CODE>}).
+ * NONE}).
  * <P>
  * <B>IPP Compatibility:</B> The category name returned by
  * <CODE>getName()</CODE> is the IPP attribute name.  The enumeration's
--- a/jdk/src/share/classes/javax/print/attribute/standard/Finishings.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/standard/Finishings.java	Wed Jul 05 19:07:19 2017 +0200
@@ -46,13 +46,13 @@
  * &nbsp;
  * </TD>
  * <TD WIDTH=27%>
- * {@link #NONE <CODE>NONE</CODE>}
+ * {@link #NONE NONE}
  * </TD>
  * <TD WIDTH=27%>
- * {@link #STAPLE <CODE>STAPLE</CODE>}
+ * {@link #STAPLE STAPLE}
  * </TD>
  * <TD WIDTH=36%>
- * {@link #EDGE_STITCH <CODE>EDGE_STITCH</CODE>}
+ * {@link #EDGE_STITCH EDGE_STITCH}
  * </TD>
  * </TR>
  * <TR>
@@ -60,13 +60,13 @@
  * &nbsp;
  * </TD>
  * <TD>
- * {@link #BIND <CODE>BIND</CODE>}
+ * {@link #BIND BIND}
  * </TD>
  * <TD>
- * {@link #SADDLE_STITCH <CODE>SADDLE_STITCH</CODE>}
+ * {@link #SADDLE_STITCH SADDLE_STITCH}
  * </TD>
  * <TD>
- * {@link #COVER <CODE>COVER</CODE>}
+ * {@link #COVER COVER}
  * </TD>
  * <TD>
  * &nbsp;
@@ -82,13 +82,13 @@
  * &nbsp;
  * </TD>
  * <TD WIDTH=27%>
- * {@link #STAPLE_TOP_LEFT <CODE>STAPLE_TOP_LEFT</CODE>}
+ * {@link #STAPLE_TOP_LEFT STAPLE_TOP_LEFT}
  * </TD>
  * <TD WIDTH=27%>
- * {@link #EDGE_STITCH_LEFT <CODE>EDGE_STITCH_LEFT</CODE>}
+ * {@link #EDGE_STITCH_LEFT EDGE_STITCH_LEFT}
  * </TD>
  * <TD WIDTH=27%>
- * {@link #STAPLE_DUAL_LEFT <CODE>STAPLE_DUAL_LEFT</CODE>}
+ * {@link #STAPLE_DUAL_LEFT STAPLE_DUAL_LEFT}
  * </TD>
  * <TD WIDTH=9%>
  * &nbsp;
@@ -99,13 +99,13 @@
  * &nbsp;
  * </TD>
  * <TD WIDTH=27%>
- * {@link #STAPLE_BOTTOM_LEFT <CODE>STAPLE_BOTTOM_LEFT</CODE>}
+ * {@link #STAPLE_BOTTOM_LEFT STAPLE_BOTTOM_LEFT}
  * </TD>
  * <TD WIDTH=27%>
- * {@link #EDGE_STITCH_TOP <CODE>EDGE_STITCH_TOP</CODE>}
+ * {@link #EDGE_STITCH_TOP EDGE_STITCH_TOP}
  * </TD>
  * <TD WIDTH=27%>
- * {@link #STAPLE_DUAL_TOP <CODE>STAPLE_DUAL_TOP</CODE>}
+ * {@link #STAPLE_DUAL_TOP STAPLE_DUAL_TOP}
  * </TD>
  * <TD WIDTH=9%>
  * &nbsp;
@@ -116,13 +116,13 @@
  * &nbsp;
  * </TD>
  * <TD WIDTH=27%>
- * {@link #STAPLE_TOP_RIGHT <CODE>STAPLE_TOP_RIGHT</CODE>}
+ * {@link #STAPLE_TOP_RIGHT STAPLE_TOP_RIGHT}
  * </TD>
  * <TD WIDTH=27%>
- * {@link #EDGE_STITCH_RIGHT <CODE>EDGE_STITCH_RIGHT</CODE>}
+ * {@link #EDGE_STITCH_RIGHT EDGE_STITCH_RIGHT}
  * </TD>
  * <TD WIDTH=27%>
- * {@link #STAPLE_DUAL_RIGHT <CODE>STAPLE_DUAL_RIGHT</CODE>}
+ * {@link #STAPLE_DUAL_RIGHT STAPLE_DUAL_RIGHT}
  * </TD>
  * <TD WIDTH=9%>
  * &nbsp;
@@ -133,13 +133,13 @@
  * &nbsp;
  * </TD>
  * <TD WIDTH=27%>
- * {@link #STAPLE_BOTTOM_RIGHT <CODE>STAPLE_BOTTOM_RIGHT</CODE>}
+ * {@link #STAPLE_BOTTOM_RIGHT STAPLE_BOTTOM_RIGHT}
  * </TD>
  * <TD WIDTH=27%>
- * {@link #EDGE_STITCH_BOTTOM <CODE>EDGE_STITCH_BOTTOM</CODE>}
+ * {@link #EDGE_STITCH_BOTTOM EDGE_STITCH_BOTTOM}
  * </TD>
  * <TD WIDTH=27%>
- * {@link #STAPLE_DUAL_BOTTOM <CODE>STAPLE_DUAL_BOTTOM</CODE>}
+ * {@link #STAPLE_DUAL_BOTTOM STAPLE_DUAL_BOTTOM}
  * </TD>
  * <TD WIDTH=9%>
  * &nbsp;
@@ -147,16 +147,16 @@
  * </TR>
  * </TABLE>
  * <P>
- * The <CODE>STAPLE_<I>XXX</I></CODE> values are specified with respect to the
+ * The STAPLE_<I>XXX</I> values are specified with respect to the
  * document as if the document were a portrait document. If the document is
  * actually a landscape or a reverse-landscape document, the client supplies the
  * appropriate transformed value. For example, to position a staple in the upper
  * left hand corner of a landscape document when held for reading, the client
- * supplies the <CODE>STAPLE_BOTTOM_LEFT</CODE> value (since landscape is
+ * supplies the STAPLE_BOTTOM_LEFT value (since landscape is
  * defined as a +90 degree rotation from portrait, i.e., anti-clockwise). On the
  * other hand, to position a staple in the upper left hand corner of a
  * reverse-landscape document when held for reading, the client supplies the
- * <CODE>STAPLE_TOP_RIGHT</CODE> value (since reverse-landscape is defined as a
+ * STAPLE_TOP_RIGHT value (since reverse-landscape is defined as a
  * -90 degree rotation from portrait, i.e., clockwise).
  * <P>
  * The angle (vertical, horizontal, angled) of each staple with respect to the
--- a/jdk/src/share/classes/javax/print/attribute/standard/JobKOctets.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/standard/JobKOctets.java	Wed Jul 05 19:07:19 2017 +0200
@@ -67,7 +67,7 @@
  * shown in the table below.
  * <P>
  * <TABLE BORDER=1 CELLPADDING=2 CELLSPACING=1 SUMMARY="Table showing computation of doc sizes">
- * <TR BGCOLOR="#E5E5E5">
+ * <TR>
  * <TH>Representation Class</TH>
  * <TH>Document Size</TH>
  * </TR>
--- a/jdk/src/share/classes/javax/print/attribute/standard/MediaPrintableArea.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/standard/MediaPrintableArea.java	Wed Jul 05 19:07:19 2017 +0200
@@ -62,7 +62,7 @@
  * The (x,y) origin is positioned at the top-left of the paper in portrait
  * mode regardless of the orientation specified in the requesting context.
  * For example a printable area for A4 paper in portrait or landscape
- * orientation will have height > width.
+ * orientation will have height {@literal >} width.
  * <p>
  * A printable area attribute's values are stored
  * internally as integers in units of micrometers (&#181;m), where 1 micrometer
@@ -107,9 +107,9 @@
       * @param units  in which the values are expressed.
       *
       * @exception  IllegalArgumentException
-      *     Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE> < 0
-      *     or <CODE>w</CODE> <= 0 or <CODE>h</CODE> <= 0 or
-      *     <CODE>units</CODE> < 1.
+      *     Thrown if {@code x < 0} or {@code y < 0}
+      *     or {@code w <= 0} or {@code h <= 0} or
+      *     {@code units < 1}.
       */
     public MediaPrintableArea(float x, float y, float w, float h, int units) {
         if ((x < 0.0) || (y < 0.0) || (w <= 0.0) || (h <= 0.0) ||
@@ -133,9 +133,9 @@
       * @param units  in which the values are expressed.
       *
       * @exception  IllegalArgumentException
-      *     Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE> < 0
-      *     or <CODE>w</CODE> <= 0 or <CODE>h</CODE> <= 0 or
-      *     <CODE>units</CODE> < 1.
+      *     Thrown if {@code x < 0} or {@code y < 0}
+      *     or {@code w <= 0} or {@code h <= 0} or
+      *     {@code units < 1}.
       */
     public MediaPrintableArea(int x, int y, int w, int h, int units) {
         if ((x < 0) || (y < 0) || (w <= 0) || (h <= 0) ||
@@ -159,7 +159,7 @@
      * @return printable area as array of x, y, w, h in the specified units.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
     public float[] getPrintableArea(int units) {
         return new float[] { getX(units), getY(units),
@@ -177,7 +177,7 @@
      * specified units.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
      public float getX(int units) {
         return convertFromMicrometers(x, units);
@@ -194,7 +194,7 @@
      * specified units.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
      public float getY(int units) {
         return convertFromMicrometers(y, units);
@@ -209,7 +209,7 @@
      * @return  width of the printable area in the specified units.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
      public float getWidth(int units) {
         return convertFromMicrometers(w, units);
@@ -224,7 +224,7 @@
      * @return  height of the printable area in the specified units.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
      public float getHeight(int units) {
         return convertFromMicrometers(h, units);
@@ -301,7 +301,7 @@
      * @return  String version of this two-dimensional size attribute.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code units < 1}.
      */
     public String toString(int units, String unitsName) {
         if (unitsName == null) {
--- a/jdk/src/share/classes/javax/print/attribute/standard/MediaSize.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/standard/MediaSize.java	Wed Jul 05 19:07:19 2017 +0200
@@ -45,7 +45,7 @@
  * <code>MediaSize.getMediaSizeForName(MediaSizeName)</code>
  * to find the physical dimensions of the MediaSizeName instances
  * enumerated in this API. This is useful for clients which need this
- * information to format & paginate printing.
+ * information to format {@literal &} paginate printing.
  * <P>
  *
  * @author  Phil Race, Alan Kaminsky
@@ -71,8 +71,8 @@
      *     <CODE>Size2DSyntax.MM</CODE>.
      *
      * @exception  IllegalArgumentException
-     *   (Unchecked exception) Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE>
-     *     < 0 or <CODE>units</CODE> < 1 or <CODE>x</CODE> > <CODE>y</CODE>.
+     *   (Unchecked exception) Thrown if {@code x < 0} or {@code y < 0} or
+     *   {@code units < 1} or {@code x > y}.
      */
     public MediaSize(float x, float y,int units) {
         super (x, y, units);
@@ -92,8 +92,8 @@
      *     <CODE>Size2DSyntax.MM</CODE>.
      *
      * @exception  IllegalArgumentException
-     *   (Unchecked exception) Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE>
-     *     < 0 or <CODE>units</CODE> < 1 or <CODE>x</CODE> > <CODE>y</CODE>.
+     *   (Unchecked exception) Thrown if {@code x < 0} or {@code y < 0} or
+     *   {@code units < 1} or {@code x > y}.
      */
     public MediaSize(int x, int y,int units) {
         super (x, y, units);
@@ -115,8 +115,8 @@
      * @param media a media name to associate with this MediaSize
      *
      * @exception  IllegalArgumentException
-     *   (Unchecked exception) Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE>
-     *     < 0 or <CODE>units</CODE> < 1 or <CODE>x</CODE> > <CODE>y</CODE>.
+     *   (Unchecked exception) Thrown if {@code x < 0} or {@code y < 0} or
+     *   {@code units < 1} or {@code x > y}.
      */
     public MediaSize(float x, float y,int units, MediaSizeName media) {
         super (x, y, units);
@@ -141,8 +141,8 @@
      * @param media a media name to associate with this MediaSize
      *
      * @exception  IllegalArgumentException
-     *   (Unchecked exception) Thrown if <CODE>x</CODE> < 0 or <CODE>y</CODE>
-     *     < 0 or <CODE>units</CODE> < 1 or <CODE>x</CODE> > <CODE>y</CODE>.
+     *   (Unchecked exception) Thrown if {@code x < 0} or {@code y < 0} or
+     *   {@code units < 1} or {@code x > y}.
      */
     public MediaSize(int x, int y,int units, MediaSizeName media) {
         super (x, y, units);
@@ -194,7 +194,8 @@
      *     Unit conversion factor, e.g. <CODE>Size2DSyntax.INCH</CODE> or
      *     <CODE>Size2DSyntax.MM</CODE>
      * @return MediaSizeName matching these dimensions, or null.
-     * @exception IllegalArgumentException if x <= 0, y <= 0, or units < 1
+     * @exception IllegalArgumentException if {@code x <= 0},
+     *      {@code y <= 0}, or {@code units < 1}.
      *
      */
     public static MediaSizeName findMedia(float x, float y, int units) {
--- a/jdk/src/share/classes/javax/print/attribute/standard/PresentationDirection.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/standard/PresentationDirection.java	Wed Jul 05 19:07:19 2017 +0200
@@ -56,56 +56,56 @@
 
     /**
      * Pages are laid out in columns starting at the top left,
-     * proceeeding towards the bottom & right.
+     * proceeeding towards the bottom {@literal &} right.
      */
     public static final PresentationDirection TOBOTTOM_TORIGHT =
         new PresentationDirection(0);
 
     /**
      * Pages are laid out in columns starting at the top right,
-     * proceeeding towards the bottom & left.
+     * proceeeding towards the bottom {@literal &} left.
      */
     public static final PresentationDirection TOBOTTOM_TOLEFT =
         new PresentationDirection(1);
 
     /**
      * Pages are laid out in columns starting at the bottom left,
-     * proceeeding towards the top & right.
+     * proceeeding towards the top {@literal &} right.
      */
     public static final PresentationDirection TOTOP_TORIGHT =
         new PresentationDirection(2);
 
     /**
      * Pages are laid out in columns starting at the bottom right,
-     * proceeeding towards the top & left.
+     * proceeeding towards the top {@literal &} left.
      */
     public static final PresentationDirection TOTOP_TOLEFT =
         new PresentationDirection(3);
 
     /**
      * Pages are laid out in rows starting at the top left,
-     * proceeeding towards the right & bottom.
+     * proceeeding towards the right {@literal &} bottom.
      */
     public static final PresentationDirection TORIGHT_TOBOTTOM =
         new PresentationDirection(4);
 
     /**
      * Pages are laid out in rows starting at the bottom left,
-     * proceeeding towards the right & top.
+     * proceeeding towards the right {@literal &} top.
      */
     public static final PresentationDirection TORIGHT_TOTOP =
         new PresentationDirection(5);
 
     /**
      * Pages are laid out in rows starting at the top right,
-     * proceeeding towards the left & bottom.
+     * proceeeding towards the left {@literal &} bottom.
      */
     public static final PresentationDirection TOLEFT_TOBOTTOM =
         new PresentationDirection(6);
 
     /**
      * Pages are laid out in rows starting at the bottom right,
-     * proceeeding towards the left & top.
+     * proceeeding towards the left {@literal &} top.
      */
     public static final PresentationDirection TOLEFT_TOTOP =
         new PresentationDirection(7);
--- a/jdk/src/share/classes/javax/print/attribute/standard/PrinterMoreInfoManufacturer.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/standard/PrinterMoreInfoManufacturer.java	Wed Jul 05 19:07:19 2017 +0200
@@ -40,7 +40,7 @@
  * details on color support). The information is intended to be germane to
  * this kind of printer without regard to site specific modifications or
  * services.
- * <P
+ * <P>
  * In contrast, the {@link PrinterMoreInfo PrinterMoreInfo} attribute is used
  * to find out more information about this specific printer rather than this
  * general kind of printer.
--- a/jdk/src/share/classes/javax/print/attribute/standard/PrinterResolution.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/standard/PrinterResolution.java	Wed Jul 05 19:07:19 2017 +0200
@@ -84,11 +84,11 @@
      *     Feed direction resolution.
      * @param  units
      *    Unit conversion factor, e.g. <code>ResolutionSyntax.DPI</CODE>
-     * or <code>ResolutionSyntax.>DPCM</CODE>.
+     * or <code>ResolutionSyntax.DPCM</CODE>.
      *
      * @exception  IllegalArgumentException
-     *     (unchecked exception) Thrown if <CODE>crossFeedResolution</CODE> <
-     *     1 or <CODE>feedResolution</CODE> < 1 or <CODE>units</CODE> < 1.
+     *     (unchecked exception) Thrown if {@code crossFeedResolution < 1} or
+     *     {@code feedResolution < 1} or {@code units < 1}.
      */
     public PrinterResolution(int crossFeedResolution, int feedResolution,
                              int units) {
--- a/jdk/src/share/classes/javax/sound/midi/MetaMessage.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/midi/MetaMessage.java	Wed Jul 05 19:07:19 2017 +0200
@@ -149,7 +149,7 @@
      * @param data              the data bytes in the MIDI message
      * @param length    the number of bytes in the <code>data</code>
      * byte array
-     * @throws                  <code>InvalidMidiDataException</code>  if the
+     * @throws                  InvalidMidiDataException  if the
      * parameter values do not specify a valid MIDI meta message
      */
     public void setMessage(int type, byte[] data, int length) throws InvalidMidiDataException {
--- a/jdk/src/share/classes/javax/sound/midi/MidiDevice.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/midi/MidiDevice.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -86,13 +86,13 @@
  * To detect if a MidiDevice represents a hardware MIDI port, the
  * following programming technique can be used:
  *
- * <pre>
+ * <pre>{@code
  * MidiDevice device = ...;
  * if ( ! (device instanceof Sequencer) && ! (device instanceof Synthesizer)) {
  *   // we're now sure that device represents a MIDI port
  *   // ...
  * }
- * </pre>
+ * }</pre>
  *
  * <p>
  * A <code>MidiDevice</code> includes a <code>{@link MidiDevice.Info}</code> object
--- a/jdk/src/share/classes/javax/sound/midi/MidiDeviceReceiver.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/midi/MidiDeviceReceiver.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -33,7 +33,9 @@
  * @since 1.7
  */
 public interface MidiDeviceReceiver extends Receiver {
-    /** Obtains a MidiDevice object which is an owner of this Receiver.
+    /**
+     * Obtains a MidiDevice object which is an owner of this Receiver.
+     * @return a MidiDevice object which is an owner of this Receiver
      */
     public MidiDevice getMidiDevice();
 }
--- a/jdk/src/share/classes/javax/sound/midi/MidiDeviceTransmitter.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/midi/MidiDeviceTransmitter.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -35,7 +35,9 @@
  */
 public interface MidiDeviceTransmitter extends Transmitter {
 
-    /** Obtains a MidiDevice object which is an owner of this Transmitter.
+    /**
+     * Obtains a MidiDevice object which is an owner of this Transmitter.
+     * @return a MidiDevice object which is an owner of this Transmitter
      */
     public MidiDevice getMidiDevice();
 }
--- a/jdk/src/share/classes/javax/sound/midi/MidiFileFormat.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/midi/MidiFileFormat.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -50,6 +50,7 @@
  * be used in implementations:
  *
  * <table border=1>
+    <caption>MIDI File Format Properties</caption>
  *  <tr>
  *   <th>Property key</th>
  *   <th>Value type</th>
--- a/jdk/src/share/classes/javax/sound/midi/MidiMessage.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/midi/MidiMessage.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -55,7 +55,7 @@
  * processing MIDI data that originated outside Java Sound and now
  * is encoded as signed bytes, the bytes can
  * can be converted to integers using this conversion:
- * <center><code>int i = (int)(byte & 0xFF)</code></center>
+ * <center>{@code int i = (int)(byte & 0xFF)}</center>
  * <p>
  * If you simply need to pass a known MIDI byte value as a method parameter,
  * it can be expressed directly as an integer, using (for example) decimal or
@@ -118,6 +118,10 @@
      * method is called by concrete subclasses, which should
      * ensure that the data array specifies a complete, valid MIDI
      * message.
+     *
+     * @param data the data bytes in the MIDI message
+     * @param length the number of bytes in the data byte array
+     * @throws InvalidMidiDataException if the parameter values do not specify a valid MIDI meta message
      */
     protected void setMessage(byte[] data, int length) throws InvalidMidiDataException {
         if (length < 0 || (length > 0 && length > data.length)) {
--- a/jdk/src/share/classes/javax/sound/midi/MidiSystem.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/midi/MidiSystem.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -80,6 +80,7 @@
  * consider them:
  *
  * <table border=0>
+ *  <caption>MIDI System Property Keys</caption>
  *  <tr>
  *   <th>Property Key</th>
  *   <th>Interface</th>
@@ -425,6 +426,8 @@
      * it is used to identify the default sequencer.
      * For details, refer to the {@link MidiSystem class description}.
      *
+     * @param connected whether or not the returned {@code Sequencer}
+     * is connected to the default {@code Synthesizer}
      * @return the default sequencer
      * @throws MidiUnavailableException if the sequencer is not
      *         available due to resource restrictions,
--- a/jdk/src/share/classes/javax/sound/midi/ShortMessage.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/midi/ShortMessage.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -283,7 +283,7 @@
     /**
      * Sets the parameters for a MIDI message that takes no data bytes.
      * @param status    the MIDI status byte
-     * @throws  <code>InvalidMidiDataException</code> if <code>status</code> does not
+     * @throws  InvalidMidiDataException if <code>status</code> does not
      * specify a valid MIDI status byte for a message that requires no data bytes.
      * @see #setMessage(int, int, int)
      * @see #setMessage(int, int, int, int)
@@ -307,7 +307,7 @@
      * @param status    the MIDI status byte
      * @param data1             the first data byte
      * @param data2             the second data byte
-     * @throws  <code>InvalidMidiDataException</code> if the
+     * @throws  InvalidMidiDataException if the
      * the status byte, or all data bytes belonging to the message, do
      * not specify a valid MIDI message.
      * @see #setMessage(int, int, int, int)
@@ -357,7 +357,7 @@
      * @param channel   the channel associated with the message
      * @param data1             the first data byte
      * @param data2             the second data byte
-     * @throws          <code>InvalidMidiDataException</code> if the
+     * @throws          InvalidMidiDataException if the
      * status byte or all data bytes belonging to the message, do
      * not specify a valid MIDI message
      *
@@ -397,6 +397,7 @@
      * Obtains the MIDI command associated with this event.  This method
      * assumes that the event is a MIDI channel message; if not, the return
      * value will not be meaningful.
+     * @return the MIDI command associated with this event
      * @see #setMessage(int, int, int, int)
      */
     public int getCommand() {
@@ -450,7 +451,7 @@
      * status byte value.
      * @param status status byte value, which must represent a short MIDI message
      * @return data length in bytes (0, 1, or 2)
-     * @throws <code>InvalidMidiDataException</code> if the
+     * @throws InvalidMidiDataException if the
      * <code>status</code> argument does not represent the status byte for any
      * short message
      */
--- a/jdk/src/share/classes/javax/sound/midi/Synthesizer.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/midi/Synthesizer.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -170,7 +170,7 @@
      * already had been), <code>false</code> if the instrument could not be
      * loaded (for example, if the synthesizer has insufficient
      * memory to load it)
-     * @throws <code>IllegalArgumentException</code> if this
+     * @throws IllegalArgumentException if this
      * <code>Synthesizer</code> doesn't support the specified instrument's
      * soundbank
      * @see #unloadInstrument
@@ -186,7 +186,7 @@
     /**
      * Unloads a particular instrument.
      * @param instrument instrument to unload
-     * @throws <code>IllegalArgumentException</code> if this
+     * @throws IllegalArgumentException if this
      * <code>Synthesizer</code> doesn't support the specified instrument's
      * soundbank
      * @see #loadInstrument
@@ -214,10 +214,10 @@
      * of the old instrument, it should be loaded into the synthesizer
      * @return <code>true</code> if the instrument succeessfully remapped,
      * <code>false</code> if feature is not implemented by synthesizer
-     * @throws <code>IllegalArgumentException</code> if instrument
+     * @throws IllegalArgumentException if instrument
      * <code>from</code> or instrument <code>to</code> aren't supported by
      * synthesizer or if instrument <code>to</code> is not loaded
-     * @throws <code>NullPointerException</code> if <code>from</code> or
+     * @throws NullPointerException if <code>from</code> or
      * <code>to</code> parameters have null value
      * @see #loadInstrument
      * @see #loadInstruments
--- a/jdk/src/share/classes/javax/sound/midi/SysexMessage.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/midi/SysexMessage.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -204,6 +204,7 @@
      * @param data the system exclusive message data
      * @param length the length of the valid message data in
      * the array
+     * @throws InvalidMidiDataException if the status byte is invalid for a sysex message
      */
     public void setMessage(int status, byte[] data, int length) throws InvalidMidiDataException {
         if ( (status != 0xF0) && (status != 0xF7) ) {
--- a/jdk/src/share/classes/javax/sound/midi/Track.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/midi/Track.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -211,10 +211,11 @@
     /**
      * Obtains the event at the specified index.
      * @param index the location of the desired event in the event vector
-     * @throws <code>ArrayIndexOutOfBoundsException</code>  if the
+     * @throws ArrayIndexOutOfBoundsException  if the
      * specified index is negative or not less than the current size of
      * this track.
      * @see #size
+     * @return the event at the specified index
      */
     public MidiEvent get(int index) throws ArrayIndexOutOfBoundsException {
         try {
--- a/jdk/src/share/classes/javax/sound/sampled/AudioFileFormat.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/sampled/AudioFileFormat.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -57,6 +57,7 @@
  * be used in implementations:
  *
  * <table border=1>
+ *  <caption>Audio File Format Property Keys</caption>
  *  <tr>
  *   <th>Property key</th>
  *   <th>Value type</th>
--- a/jdk/src/share/classes/javax/sound/sampled/AudioFormat.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/sampled/AudioFormat.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -85,6 +85,7 @@
  * service providers should use, if applicable:
  *
  * <table border=0>
+ *  <caption>Audio Format Property Keys</caption>
  *  <tr>
  *   <th>Property key</th>
  *   <th>Value type</th>
--- a/jdk/src/share/classes/javax/sound/sampled/AudioSystem.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/sampled/AudioSystem.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -75,6 +75,7 @@
  * consider them:
  *
  * <table border=0>
+ *  <caption>Audio System Property Keys</caption>
  *  <tr>
  *   <th>Property Key</th>
  *   <th>Interface</th>
--- a/jdk/src/share/classes/javax/sound/sampled/BooleanControl.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/sampled/BooleanControl.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -125,6 +125,7 @@
 
     /**
      * Obtains the label for the specified state.
+     * @param state the state whose label will be returned
      * @return the label for the specified state, such as "true" or "on"
      * for <code>true</code>, or "false" or "off" for <code>false</code>.
      */
--- a/jdk/src/share/classes/javax/sound/sampled/Mixer.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/sampled/Mixer.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -133,6 +133,8 @@
      * <code>DataLine</code>.
      *
      * @param info describes the desired line
+     * @return a line that is available for use and that matches the description
+     * in the specified {@code Line.Info} object
      * @throws LineUnavailableException if a matching line
      * is not available due to resource restrictions
      * @throws IllegalArgumentException if this mixer does
--- a/jdk/src/share/classes/javax/sound/sampled/spi/FormatConversionProvider.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/sound/sampled/spi/FormatConversionProvider.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -116,6 +116,7 @@
      * given a particular source format.
      * If no target format encodings are supported for this source format,
      * an array of length 0 is returned.
+     * @param sourceFormat format of the incoming data
      * @return array of supported target format encodings.
      */
     public abstract AudioFormat.Encoding[] getTargetEncodings(AudioFormat sourceFormat);
@@ -146,6 +147,8 @@
      * supported by the format converter
      * If no target formats with the specified encoding are supported
      * for this source format, an array of length 0 is returned.
+     * @param targetEncoding desired encoding of the stream after processing
+     * @param sourceFormat format of the incoming data
      * @return array of supported target formats.
      */
     public abstract AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat);
--- a/jdk/src/share/classes/javax/swing/SwingWorker.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/swing/SwingWorker.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -405,6 +405,7 @@
      *
      */
     @SafeVarargs
+    @SuppressWarnings("varargs") // Passing chunks to add is safe
     protected final void publish(V... chunks) {
         synchronized (this) {
             if (doProcess == null) {
--- a/jdk/src/share/classes/javax/swing/text/GlyphView.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/javax/swing/text/GlyphView.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -514,7 +514,7 @@
             int x1 = x0 + (int) painter.getSpan(this, p0, p1, getTabExpander(), x0);
 
             // calculate y coordinate
-            int y = alloc.y + alloc.height - (int) painter.getDescent(this);
+            int y = alloc.y + (int)(painter.getHeight(this) - painter.getDescent(this));
             if (underline) {
                 int yTmp = y + 1;
                 g.drawLine(x0, yTmp, x1, yTmp);
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/ApacheCanonicalizer.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/ApacheCanonicalizer.java	Wed Jul 05 19:07:19 2017 +0200
@@ -75,7 +75,10 @@
             throw new ClassCastException
                 ("context must be of type DOMCryptoContext");
         }
-        if (parent == null || !(parent instanceof javax.xml.crypto.dom.DOMStructure)) {
+        if (parent == null) {
+            throw new NullPointerException();
+        }
+        if (!(parent instanceof javax.xml.crypto.dom.DOMStructure)) {
             throw new ClassCastException("parent must be of type DOMStructure");
         }
         transformElem = (Element)
@@ -90,7 +93,10 @@
             throw new ClassCastException
                 ("context must be of type DOMCryptoContext");
         }
-        if (parent == null || !(parent instanceof javax.xml.crypto.dom.DOMStructure)) {
+        if (parent == null) {
+            throw new NullPointerException();
+        }
+        if (!(parent instanceof javax.xml.crypto.dom.DOMStructure)) {
             throw new ClassCastException("parent must be of type DOMStructure");
         }
         transformElem = (Element)
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/ApacheTransform.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/ApacheTransform.java	Wed Jul 05 19:07:19 2017 +0200
@@ -76,7 +76,10 @@
             throw new ClassCastException
                 ("context must be of type DOMCryptoContext");
         }
-        if (parent == null || !(parent instanceof javax.xml.crypto.dom.DOMStructure)) {
+        if (parent == null) {
+            throw new NullPointerException();
+        }
+        if (!(parent instanceof javax.xml.crypto.dom.DOMStructure)) {
             throw new ClassCastException("parent must be of type DOMStructure");
         }
         transformElem = (Element)
@@ -91,7 +94,10 @@
             throw new ClassCastException
                 ("context must be of type DOMCryptoContext");
         }
-        if (parent == null || !(parent instanceof javax.xml.crypto.dom.DOMStructure)) {
+        if (parent == null) {
+            throw new NullPointerException();
+        }
+        if (!(parent instanceof javax.xml.crypto.dom.DOMStructure)) {
             throw new ClassCastException("parent must be of type DOMStructure");
         }
         transformElem = (Element)
--- a/jdk/src/share/classes/sun/awt/AppContext.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/awt/AppContext.java	Wed Jul 05 19:07:19 2017 +0200
@@ -310,11 +310,13 @@
                     // and excludes applets because by the time applet starts
                     // a number of contexts have already been created by the plugin.
                     if (numAppContexts.get() == 0) {
-                        // This check is not necessary, its purpose is to help
-                        // Plugin devs to catch all the cases of main AC creation.
                         if (System.getProperty("javaplugin.version") == null &&
                                 System.getProperty("javawebstart.version") == null) {
                             initMainAppContext();
+                        } else if (System.getProperty("javafx.version") != null &&
+                                threadGroup.getParent() != null) {
+                            // Swing inside JavaFX case
+                            SunToolkit.createNewAppContext();
                         }
                     }
 
--- a/jdk/src/share/classes/sun/invoke/anon/ConstantPoolPatch.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/invoke/anon/ConstantPoolPatch.java	Wed Jul 05 19:07:19 2017 +0200
@@ -418,7 +418,7 @@
 
     private static final Map<Class<?>, Byte> CONSTANT_VALUE_CLASS_TAG
         = new IdentityHashMap<Class<?>, Byte>();
-    private static final Class[] CONSTANT_VALUE_CLASS = new Class[16];
+    private static final Class<?>[] CONSTANT_VALUE_CLASS = new Class<?>[16];
     static {
         Object[][] values = {
             {Integer.class, CONSTANT_Integer},
--- a/jdk/src/share/classes/sun/net/www/protocol/http/AuthCacheValue.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/net/www/protocol/http/AuthCacheValue.java	Wed Jul 05 19:07:19 2017 +0200
@@ -37,6 +37,8 @@
 
 public abstract class AuthCacheValue implements Serializable {
 
+    static final long serialVersionUID = 735249334068211611L;
+
     public enum Type {
         Proxy,
         Server
--- a/jdk/src/share/classes/sun/net/www/protocol/http/AuthenticationInfo.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/net/www/protocol/http/AuthenticationInfo.java	Wed Jul 05 19:07:19 2017 +0200
@@ -51,6 +51,8 @@
 
 public abstract class AuthenticationInfo extends AuthCacheValue implements Cloneable {
 
+    static final long serialVersionUID = -2588378268010453259L;
+
     // Constants saying what kind of authroization this is.  This determines
     // the namespace in the hash table lookup.
     public static final char SERVER_AUTHENTICATION = 's';
--- a/jdk/src/share/classes/sun/reflect/annotation/AnnotationParser.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/reflect/annotation/AnnotationParser.java	Wed Jul 05 19:07:19 2017 +0200
@@ -88,6 +88,7 @@
      * @param selectAnnotationClasses an array of annotation types to select when parsing
      */
     @SafeVarargs
+    @SuppressWarnings("varargs") // selectAnnotationClasses is used safely
     static Map<Class<? extends Annotation>, Annotation> parseSelectAnnotations(
                 byte[] rawAnnotations,
                 ConstantPool constPool,
--- a/jdk/src/share/classes/sun/rmi/runtime/Log.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/rmi/runtime/Log.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -61,6 +61,7 @@
  * @author Laird Dornin
  * @since 1.4
  */
+@SuppressWarnings("deprecation")
 public abstract class Log {
 
     /** Logger re-definition of old RMI log values */
--- a/jdk/src/share/classes/sun/rmi/server/ActivatableRef.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/rmi/server/ActivatableRef.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -41,6 +41,7 @@
 import java.rmi.server.RemoteRef;
 import java.rmi.server.RemoteStub;
 
+@SuppressWarnings("deprecation")
 public class ActivatableRef implements RemoteRef {
 
     private static final long serialVersionUID = 7579060052569229166L;
--- a/jdk/src/share/classes/sun/rmi/server/Dispatcher.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/rmi/server/Dispatcher.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -31,6 +31,7 @@
  * The Dispatcher interface allows the transport to make
  * the upcall to the server side remote reference.
  */
+@SuppressWarnings("deprecation")
 public interface Dispatcher {
 
     /**
--- a/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -67,6 +67,7 @@
  * @author      Peter Jones
  * @author      Laird Dornin
  */
+@SuppressWarnings("deprecation")
 public final class LoaderHandler {
 
     /** RMI class loader log level */
--- a/jdk/src/share/classes/sun/rmi/server/UnicastRef.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/rmi/server/UnicastRef.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -49,7 +49,8 @@
  * NOTE: There is a JDK-internal dependency on the existence of this
  * class's getLiveRef method (as it is inherited by UnicastRef2) in
  * the implementation of javax.management.remote.rmi.RMIConnector.
- **/
+ */
+@SuppressWarnings("deprecation")
 public class UnicastRef implements RemoteRef {
 
     /**
--- a/jdk/src/share/classes/sun/rmi/server/UnicastServerRef.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/rmi/server/UnicastServerRef.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -67,6 +67,7 @@
  * @author  Roger Riggs
  * @author  Peter Jones
  */
+@SuppressWarnings("deprecation")
 public class UnicastServerRef extends UnicastRef
     implements ServerRef, Dispatcher
 {
--- a/jdk/src/share/classes/sun/rmi/server/Util.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/rmi/server/Util.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -64,6 +64,7 @@
  * A utility class with static methods for creating stubs/proxies and
  * skeletons for remote objects.
  */
+@SuppressWarnings("deprecation")
 public final class Util {
 
     /** "server" package log level */
--- a/jdk/src/share/classes/sun/rmi/transport/DGCImpl.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/rmi/transport/DGCImpl.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -59,6 +59,7 @@
  *
  * @author Ann Wollrath
  */
+@SuppressWarnings("deprecation")
 final class DGCImpl implements DGC {
 
     /* dgc system log */
--- a/jdk/src/share/classes/sun/rmi/transport/StreamRemoteCall.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/rmi/transport/StreamRemoteCall.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -45,6 +45,7 @@
  *
  * @author Ann Wollrath
  */
+@SuppressWarnings("deprecation")
 public class StreamRemoteCall implements RemoteCall {
     private ConnectionInputStream in = null;
     private ConnectionOutputStream out = null;
--- a/jdk/src/share/classes/sun/rmi/transport/Transport.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/rmi/transport/Transport.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -47,6 +47,7 @@
  *
  * @author Ann Wollrath
  */
+@SuppressWarnings("deprecation")
 public abstract class Transport {
 
     /** "transport" package log level */
--- a/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -44,6 +44,7 @@
  * connect to the same host will automatically use the same
  * mechanism.
  */
+@SuppressWarnings("deprecation")
 public class RMIMasterSocketFactory extends RMISocketFactory {
 
     /** "proxy" package log level */
--- a/jdk/src/share/classes/sun/rmi/transport/tcp/ConnectionMultiplexer.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/rmi/transport/tcp/ConnectionMultiplexer.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -43,6 +43,7 @@
  *
  * @author Peter Jones
  */
+@SuppressWarnings("deprecation")
 final class ConnectionMultiplexer {
 
     /** "multiplex" log level */
--- a/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -84,6 +84,7 @@
  * @author Ann Wollrath
  * @author Peter Jones
  */
+@SuppressWarnings("deprecation")
 public class TCPTransport extends Transport {
 
     /* tcp package log */
--- a/jdk/src/share/classes/sun/security/ec/ECDSASignature.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/security/ec/ECDSASignature.java	Wed Jul 05 19:07:19 2017 +0200
@@ -323,6 +323,7 @@
 
     // set parameter, not supported. See JCA doc
     @Override
+    @Deprecated
     protected void engineSetParameter(String param, Object value)
             throws InvalidParameterException {
         throw new UnsupportedOperationException("setParameter() not supported");
@@ -330,6 +331,7 @@
 
     // get parameter, not supported. See JCA doc
     @Override
+    @Deprecated
     protected Object engineGetParameter(String param)
             throws InvalidParameterException {
         throw new UnsupportedOperationException("getParameter() not supported");
--- a/jdk/src/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -96,10 +96,15 @@
         }
     }
 
-    // SecretKeySpec does not allow zero length keys, so we define our own class.
+    // SecretKeySpec does not allow zero length keys, so we define our
+    // own class.
+    //
+    // As an anonymous class cannot make any guarantees about serialization
+    // compatibility, it is nonsensical for an anonymous class to define a
+    // serialVersionUID. Suppress warnings relative to missing serialVersionUID
+    // field in the anonymous subclass of serializable SecretKey.
+    @SuppressWarnings("serial")
     private static final SecretKey NULL_KEY = new SecretKey() {
-        private static final long serialVersionUID = -8090049519656411362L;
-
         public byte[] getEncoded() {
             return new byte[0];
         }
--- a/jdk/src/share/classes/sun/security/pkcs12/PKCS12KeyStore.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs12/PKCS12KeyStore.java	Wed Jul 05 19:07:19 2017 +0200
@@ -775,7 +775,7 @@
                 }
             }
             if (params != null) {
-                if (algorithm.equals(pbes2_OID)) {
+                if (algorithm.equals((Object)pbes2_OID)) {
                     algParams = AlgorithmParameters.getInstance("PBES2");
                 } else {
                     algParams = AlgorithmParameters.getInstance("PBE");
@@ -912,7 +912,7 @@
     private static String mapPBEParamsToAlgorithm(ObjectIdentifier algorithm,
         AlgorithmParameters algParams) throws NoSuchAlgorithmException {
         // Check for PBES2 algorithms
-        if (algorithm.equals(pbes2_OID) && algParams != null) {
+        if (algorithm.equals((Object)pbes2_OID) && algParams != null) {
             return algParams.toString();
         }
         return algorithm.toString();
@@ -1921,7 +1921,7 @@
                 }
 
                 safeContentsData = safeContents.getData();
-            } else if (contentType.equals(ContentInfo.ENCRYPTED_DATA_OID)) {
+            } else if (contentType.equals((Object)ContentInfo.ENCRYPTED_DATA_OID)) {
                 if (password == null) {
                    continue;
                 }
--- a/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java	Wed Jul 05 19:07:19 2017 +0200
@@ -169,7 +169,7 @@
     /*
      * Drives the protocol state machine.
      */
-    private int                 connectionState;
+    private volatile int        connectionState;
 
     /*
      * Flag indicating if the next record we receive MUST be a Finished
@@ -1467,7 +1467,7 @@
      */
     @Override
     public boolean isClosed() {
-        return getConnectionState() == cs_APP_CLOSED;
+        return connectionState == cs_APP_CLOSED;
     }
 
     /**
--- a/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java	Wed Jul 05 19:07:19 2017 +0200
@@ -291,7 +291,8 @@
 
             String flags = args[n];
             String modifier = null;
-            if (flags.charAt(0) == '-') {
+
+            if (flags.startsWith("-")) {
                 int pos = flags.indexOf(':');
                 if (pos > 0) {
                     modifier = flags.substring(pos+1);
@@ -299,7 +300,14 @@
                 }
             }
 
-            if (collator.compare(flags, "-keystore") == 0) {
+            if (!flags.startsWith("-")) {
+                if (jarfile == null) {
+                    jarfile = flags;
+                } else {
+                    alias = flags;
+                    ckaliases.add(alias);
+                }
+            } else if (collator.compare(flags, "-keystore") == 0) {
                 if (++n == args.length) usageNoArg();
                 keystore = args[n];
             } else if (collator.compare(flags, "-storepass") ==0) {
@@ -380,18 +388,9 @@
                         collator.compare(flags, "-help") == 0) {
                 fullusage();
             } else {
-                if (!flags.startsWith("-")) {
-                    if (jarfile == null) {
-                        jarfile = flags;
-                    } else {
-                        alias = flags;
-                        ckaliases.add(alias);
-                    }
-                } else {
-                    System.err.println(
-                            rb.getString("Illegal.option.") + flags);
-                    usage();
-                }
+                System.err.println(
+                        rb.getString("Illegal.option.") + flags);
+                usage();
             }
         }
 
--- a/jdk/src/share/classes/sun/swing/AccumulativeRunnable.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/swing/AccumulativeRunnable.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -121,6 +121,7 @@
      * @param args the arguments to accumulate
      */
     @SafeVarargs
+    @SuppressWarnings("varargs") // Copying args is safe
     public final synchronized void add(T... args) {
         boolean isSubmitted = true;
         if (arguments == null) {
--- a/jdk/src/share/classes/sun/tools/asm/Assembler.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/tools/asm/Assembler.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 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
@@ -91,9 +91,9 @@
         add(new Instruction(where, opc, flagNoCovered));
     }
 
-    static Vector SourceClassList = new Vector();
+    static Vector<String> SourceClassList = new Vector<>();
 
-    static Vector TmpCovTable = new Vector();
+    static Vector<String> TmpCovTable = new Vector<>();
 
     static int[]  JcovClassCountArray = new int[CT_LAST_KIND + 1];
 
@@ -177,8 +177,8 @@
               case opc_lookupswitch: {
                 SwitchData sw = (SwitchData)inst.value;
                 optimize(env, sw.defaultLabel);
-                for (Enumeration e = sw.tab.elements() ; e.hasMoreElements();) {
-                    optimize(env, (Label)e.nextElement());
+                for (Enumeration<Label> e = sw.tab.elements() ; e.hasMoreElements();) {
+                    optimize(env, e.nextElement());
                 }
                 return;
               }
@@ -186,8 +186,8 @@
               case opc_try: {
                 TryData td = (TryData)inst.value;
                 td.getEndLabel().pc = NEEDED;
-                for (Enumeration e = td.catches.elements() ; e.hasMoreElements();) {
-                    CatchData cd = (CatchData)e.nextElement();
+                for (Enumeration<CatchData> e = td.catches.elements() ; e.hasMoreElements();) {
+                    CatchData cd = e.nextElement();
                     optimize(env, cd.getLabel());
                 }
                 break;
@@ -237,9 +237,11 @@
         // Collect constants for arguments only
         // if a local variable table is generated
         if ((field != null) && env.debug_vars()) {
-            if (field.getArguments() != null) {
-                for (Enumeration e = field.getArguments().elements() ; e.hasMoreElements() ;) {
-                    MemberDefinition f = (MemberDefinition)e.nextElement();
+            @SuppressWarnings("unchecked")
+            Vector<MemberDefinition> v = (Vector<MemberDefinition>)field.getArguments();
+            if (v != null) {
+                for (Enumeration<MemberDefinition> e = v.elements() ; e.hasMoreElements() ;) {
+                    MemberDefinition f = e.nextElement();
                     tab.put(f.getName().toString());
                     tab.put(f.getType().getTypeSignature());
                 }
@@ -355,16 +357,16 @@
               case opc_lookupswitch: {
                 SwitchData sw = (SwitchData)inst.value;
                 balance(sw.defaultLabel, depth);
-                for (Enumeration e = sw.tab.elements() ; e.hasMoreElements();) {
-                    balance((Label)e.nextElement(), depth);
+                for (Enumeration<Label> e = sw.tab.elements() ; e.hasMoreElements();) {
+                    balance(e.nextElement(), depth);
                 }
                 return;
               }
 
               case opc_try: {
                 TryData td = (TryData)inst.value;
-                for (Enumeration e = td.catches.elements() ; e.hasMoreElements();) {
-                    CatchData cd = (CatchData)e.nextElement();
+                for (Enumeration<CatchData> e = td.catches.elements() ; e.hasMoreElements();) {
+                    CatchData cd = e.nextElement();
                     balance(cd.getLabel(), depth + 1);
                 }
                 break;
@@ -383,9 +385,10 @@
 
         if ((field != null) && field.getArguments() != null) {
               int sum = 0;
-              Vector v = field.getArguments();
-              for (Enumeration e = v.elements(); e.hasMoreElements(); ) {
-                  MemberDefinition f = ((MemberDefinition)e.nextElement());
+              @SuppressWarnings("unchecked")
+              Vector<MemberDefinition> v = (Vector<MemberDefinition>)field.getArguments();
+              for (Enumeration<MemberDefinition> e = v.elements(); e.hasMoreElements(); ) {
+                  MemberDefinition f = e.nextElement();
                   sum += f.getType().stackSize();
               }
               maxvar = sum;
@@ -441,8 +444,8 @@
             if (inst.opc == opc_try) {
                 TryData td = (TryData)inst.value;
                 writeExceptions(env, out, tab, inst.next, td.getEndLabel());
-                for (Enumeration e = td.catches.elements() ; e.hasMoreElements();) {
-                    CatchData cd = (CatchData)e.nextElement();
+                for (Enumeration<CatchData> e = td.catches.elements() ; e.hasMoreElements();) {
+                    CatchData cd = e.nextElement();
                     //System.out.println("EXCEPTION: " + env.getSource() + ", pc=" + inst.pc + ", end=" + td.getEndLabel().pc + ", hdl=" + cd.getLabel().pc + ", tp=" + cd.getType());
                     out.writeShort(inst.pc);
                     out.writeShort(td.getEndLabel().pc);
@@ -463,11 +466,12 @@
      * Write the coverage table
      */
     public void writeCoverageTable(Environment env, ClassDefinition c, DataOutputStream out, ConstantPool tab, long whereField) throws IOException {
-        Vector TableLot = new Vector();         /* Coverage table */
+        Vector<Cover> TableLot = new Vector<>();         /* Coverage table */
         boolean begseg = false;
         boolean begmeth = false;
+        @SuppressWarnings("deprecation")
         long whereClass = ((SourceClass)c).getWhere();
-        Vector whereTry = new Vector();
+        Vector<Long> whereTry = new Vector<>();
         int numberTry = 0;
         int count = 0;
 
@@ -484,8 +488,8 @@
                 }
                 if (!begseg && !inst.flagNoCovered ) {
                   boolean findTry = false;
-                  for (Enumeration e = whereTry.elements(); e.hasMoreElements();) {
-                       if ( ((Long)(e.nextElement())).longValue() == inst.where) {
+                  for (Enumeration<Long> e = whereTry.elements(); e.hasMoreElements();) {
+                       if (e.nextElement().longValue() == inst.where) {
                               findTry = true;
                               break;
                        }
@@ -546,7 +550,7 @@
               }
 
               case opc_try: {
-                whereTry.addElement(new Long(inst.where));
+                whereTry.addElement(Long.valueOf(inst.where));
                 begseg = false;
                 break;
               }
@@ -569,8 +573,8 @@
               }
               case opc_lookupswitch: {
                 SwitchData sw = (SwitchData)inst.value;
-                for (Enumeration e = sw.sortedKeys(); e.hasMoreElements() ; ) {
-                     Integer v = (Integer)e.nextElement();
+                for (Enumeration<Integer> e = sw.sortedKeys(); e.hasMoreElements() ; ) {
+                     Integer v = e.nextElement();
                      TableLot.addElement(new Cover(CT_CASE, sw.whereCase(v), inst.pc));
                      count++;
                 }
@@ -591,7 +595,7 @@
 
         out.writeShort(count);
         for (int i = 0; i < count; i++) {
-           Lot = (Cover)TableLot.elementAt(i);
+           Lot = TableLot.elementAt(i);
            ln = (Lot.Addr >> WHEREOFFSETBITS);
            pos = (Lot.Addr << (64 - WHEREOFFSETBITS)) >> (64 - WHEREOFFSETBITS);
            out.writeShort(Lot.NumCommand);
@@ -646,6 +650,7 @@
  */
 
 public void GenVecJCov(Environment env, ClassDefinition c, long Time) {
+        @SuppressWarnings("deprecation")
         String SourceFile = ((SourceClass)c).getAbsoluteName();
 
         TmpCovTable.addElement(createClassJcovElement(env, c));
@@ -667,6 +672,7 @@
  * generate file of coverage data
  */
 
+@SuppressWarnings("deprecation") // for JCovd.readLine() calls
 public void GenJCov(Environment env) {
 
      try {
@@ -686,14 +692,14 @@
                    while((CurrLine = JCovd.readLine()) != null ) {
                       if ( CurrLine.startsWith(JcovClassLine) ) {
                              first = true;
-                             for(Enumeration e = SourceClassList.elements(); e.hasMoreElements();) {
+                             for(Enumeration<String> e = SourceClassList.elements(); e.hasMoreElements();) {
                                  String clsName = CurrLine.substring(JcovClassLine.length());
                                  int idx = clsName.indexOf(' ');
 
                                  if (idx != -1) {
                                      clsName = clsName.substring(0, idx);
                                  }
-                                 Class = (String)e.nextElement();
+                                 Class = e.nextElement();
                                  if ( Class.compareTo(clsName) == 0) {
                                      first = false;
                                      break;
@@ -708,7 +714,7 @@
         }
         PrintStream CovFile = new PrintStream(new DataOutputStream(new FileOutputStream(outFile)));
         CovFile.println(JcovMagicLine);
-        for(Enumeration e = TmpCovTable.elements(); e.hasMoreElements();) {
+        for(Enumeration<String> e = TmpCovTable.elements(); e.hasMoreElements();) {
               CovFile.println(e.nextElement());
         }
         CovFile.close();
@@ -821,16 +827,16 @@
               case opc_lookupswitch: {
                 SwitchData sw = (SwitchData)inst.value;
                 flowFields(env, sw.defaultLabel, locals);
-                for (Enumeration e = sw.tab.elements() ; e.hasMoreElements();) {
-                    flowFields(env, (Label)e.nextElement(), locals);
+                for (Enumeration<Label> e = sw.tab.elements() ; e.hasMoreElements();) {
+                    flowFields(env, e.nextElement(), locals);
                 }
                 return;
               }
 
               case opc_try: {
-                Vector catches = ((TryData)inst.value).catches;
-                for (Enumeration e = catches.elements(); e.hasMoreElements();) {
-                    CatchData cd = (CatchData)e.nextElement();
+                Vector<CatchData> catches = ((TryData)inst.value).catches;
+                for (Enumeration<CatchData> e = catches.elements(); e.hasMoreElements();) {
+                    CatchData cd = e.nextElement();
                     flowFields(env, cd.getLabel(), locals);
                 }
                 break;
@@ -851,9 +857,10 @@
         // Initialize arguments
         if ((field != null) && (field.getArguments() != null)) {
             int reg = 0;
-            Vector v = field.getArguments();
-            for (Enumeration e = v.elements(); e.hasMoreElements(); ) {
-                MemberDefinition f = ((MemberDefinition)e.nextElement());
+            @SuppressWarnings("unchecked")
+            Vector<MemberDefinition> v = (Vector<MemberDefinition>)field.getArguments();
+            for (Enumeration<MemberDefinition> e = v.elements(); e.hasMoreElements(); ) {
+                MemberDefinition f = e.nextElement();
                 locals[reg] = f;
                 reg += f.getType().stackSize();
             }
@@ -867,9 +874,10 @@
             locals[i] = null;
         if ((field != null) && (field.getArguments() != null)) {
             int reg = 0;
-            Vector v = field.getArguments();
-            for (Enumeration e = v.elements(); e.hasMoreElements(); ) {
-                MemberDefinition f = ((MemberDefinition)e.nextElement());
+            @SuppressWarnings("unchecked")
+            Vector<MemberDefinition> v = (Vector<MemberDefinition>)field.getArguments();
+            for (Enumeration<MemberDefinition> e = v.elements(); e.hasMoreElements(); ) {
+                MemberDefinition f = e.nextElement();
                 locals[reg] = f;
                 lvtab.define(f, reg, 0, maxpc);
                 reg += f.getType().stackSize();
--- a/jdk/src/share/classes/sun/tools/asm/ConstantPool.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/tools/asm/ConstantPool.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 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
@@ -42,20 +42,20 @@
  */
 public final
 class ConstantPool implements RuntimeConstants {
-    Hashtable hash = new Hashtable(101);
+    Hashtable<Object,ConstantPoolData> hash = new Hashtable<>(101);
 
     /**
      * Find an entry, may return 0
      */
     public int index(Object obj) {
-        return ((ConstantPoolData)hash.get(obj)).index;
+        return hash.get(obj).index;
     }
 
     /**
      * Add an entry
      */
     public void put(Object obj) {
-        ConstantPoolData data = (ConstantPoolData)hash.get(obj);
+        ConstantPoolData data = hash.get(obj);
         if (data == null) {
             if (obj instanceof String) {
                 data = new StringConstantData(this, (String)obj);
@@ -87,8 +87,8 @@
         // Make a list of all the constant pool items
         for (int n = 0 ; n < 5 ; n++) {
             int first = count;
-            for (Enumeration e = hash.elements() ; e.hasMoreElements() ;) {
-                ConstantPoolData data = (ConstantPoolData)e.nextElement();
+            for (Enumeration<ConstantPoolData> e = hash.elements() ; e.hasMoreElements() ;) {
+                ConstantPoolData data = e.nextElement();
                 if (data.order() == n) {
                     keys[count] = sortKey(data);
                     list[count++] = data;
--- a/jdk/src/share/classes/sun/tools/asm/Instruction.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/tools/asm/Instruction.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 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
@@ -274,9 +274,9 @@
           case opc_lookupswitch: {
             SwitchData sw = (SwitchData)value;
             sw.defaultLabel = sw.defaultLabel.getDestination();
-            for (Enumeration e = sw.tab.keys() ; e.hasMoreElements() ; ) {
-                Integer k = (Integer)e.nextElement();
-                Label lbl = (Label)sw.tab.get(k);
+            for (Enumeration<Integer> e = sw.tab.keys() ; e.hasMoreElements() ; ) {
+                Integer k = e.nextElement();
+                Label lbl = sw.tab.get(k);
                 sw.tab.put(k, lbl.getDestination());
             }
 
@@ -389,8 +389,8 @@
             return;
 
           case opc_try:
-            for (Enumeration e = ((TryData)value).catches.elements() ; e.hasMoreElements() ;) {
-                CatchData cd = (CatchData)e.nextElement();
+            for (Enumeration<CatchData> e = ((TryData)value).catches.elements() ; e.hasMoreElements() ;) {
+                CatchData cd = e.nextElement();
                 if (cd.getType() != null) {
                     tab.put(cd.getType());
                 }
@@ -641,6 +641,7 @@
     /**
      * Generate code
      */
+    @SuppressWarnings("fallthrough")
     void write(DataOutputStream out, ConstantPool tab) throws IOException {
         switch (opc) {
           case opc_try:         case opc_label:         case opc_dead:
@@ -770,8 +771,8 @@
             }
             out.writeInt(sw.defaultLabel.pc - pc);
             out.writeInt(sw.tab.size());
-            for (Enumeration e = sw.sortedKeys(); e.hasMoreElements() ; ) {
-                Integer v = (Integer)e.nextElement();
+            for (Enumeration<Integer> e = sw.sortedKeys(); e.hasMoreElements() ; ) {
+                Integer v = e.nextElement();
                 out.writeInt(v.intValue());
                 out.writeInt(sw.get(v).pc - pc);
             }
--- a/jdk/src/share/classes/sun/tools/asm/SwitchData.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/tools/asm/SwitchData.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 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
@@ -39,23 +39,23 @@
 class SwitchData {
     int minValue, maxValue;
     Label defaultLabel = new Label();
-    Hashtable tab = new Hashtable();
+    Hashtable<Integer,Label> tab = new Hashtable<>();
 // JCOV
-    Hashtable whereCaseTab = null;
+    Hashtable<Integer,Long> whereCaseTab = null;
 // end JCOV
 
     /**
      * Get a label
      */
     public Label get(int n) {
-        return (Label)tab.get(new Integer(n));
+        return tab.get(n);
     }
 
     /**
      * Get a label
      */
     public Label get(Integer n) {
-        return (Label)tab.get(n);
+        return tab.get(n);
     }
 
     /**
@@ -73,7 +73,7 @@
                 maxValue = n;
             }
         }
-        tab.put(new Integer(n), lbl);
+        tab.put(Integer.valueOf(n), lbl);
     }
 
     /**
@@ -86,33 +86,35 @@
     /**
      * Return the keys of this enumaration sorted in ascending order
      */
-    public synchronized Enumeration sortedKeys() {
+    public synchronized Enumeration<Integer> sortedKeys() {
         return new SwitchDataEnumeration(tab);
     }
 
 // JCOV
     public void initTableCase() {
-        whereCaseTab = new Hashtable();
+        whereCaseTab = new Hashtable<Integer,Long>();
     }
     public void addTableCase(int index, long where) {
         if (whereCaseTab != null)
-            whereCaseTab.put(new Integer(index), new Long(where));
+            whereCaseTab.put(Integer.valueOf(index), Long.valueOf(where));
     }
+    // this puts String key into Hashtable<Integer,Long>
+    @SuppressWarnings("unchecked")
     public void addTableDefault(long where) {
         if (whereCaseTab != null)
-            whereCaseTab.put("default", new Long(where));
+            ((Hashtable)whereCaseTab).put("default", Long.valueOf(where));
     }
     public long whereCase(Object key) {
-        Long i = (Long) whereCaseTab.get(key);
-        return (i == null) ? 0 : i.longValue();
+        Long i = whereCaseTab.get(key);
+        return (i == null) ? 0L : i.longValue();
     }
     public boolean getDefault() {
-         return (whereCase("default") != 0);
+         return (whereCase("default") != 0L);
     }
 // end JCOV
 }
 
-class SwitchDataEnumeration implements Enumeration {
+class SwitchDataEnumeration implements Enumeration<Integer> {
     private Integer table[];
     private int current_index = 0;
 
@@ -121,11 +123,11 @@
      * hash table will be an Integer, with the value being a label.  The
      * enumeration returns the keys in sorted order.
      */
-    SwitchDataEnumeration(Hashtable tab) {
+    SwitchDataEnumeration(Hashtable<Integer,Label> tab) {
         table = new Integer[tab.size()];
         int i = 0;
-        for (Enumeration e = tab.keys() ; e.hasMoreElements() ; ) {
-            table[i++] = (Integer)e.nextElement();
+        for (Enumeration<Integer> e = tab.keys() ; e.hasMoreElements() ; ) {
+            table[i++] = e.nextElement();
         }
         Arrays.sort(table);
         current_index = 0;
@@ -141,7 +143,7 @@
     /**
      * Return the next key.
      */
-    public Object nextElement() {
+    public Integer nextElement() {
         return table[current_index++];
     }
 }
--- a/jdk/src/share/classes/sun/tools/asm/TryData.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/tools/asm/TryData.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 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
@@ -35,7 +35,7 @@
  */
 public final
 class TryData {
-    Vector catches = new Vector();
+    Vector<CatchData> catches = new Vector<>();
     Label endLabel = new Label();
 
     /**
@@ -51,7 +51,7 @@
      * Get a label
      */
     public CatchData getCatch(int n) {
-        return (CatchData)catches.elementAt(n);
+        return catches.elementAt(n);
     }
 
     /**
--- a/jdk/src/share/classes/sun/tools/jar/JarException.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/classes/sun/tools/jar/JarException.java	Wed Jul 05 19:07:19 2017 +0200
@@ -29,6 +29,9 @@
 
 public
 class JarException extends IOException {
+
+    static final long serialVersionUID = -4351820108009811497L;
+
     public JarException() {
         super();
     }
--- a/jdk/src/share/demo/scripting/jconsole-plugin/src/com/sun/demo/scripting/jconsole/ScriptShellPanel.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/demo/scripting/jconsole-plugin/src/com/sun/demo/scripting/jconsole/ScriptShellPanel.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -54,7 +54,7 @@
  * jconsole's script console.
  */
 
-class ScriptShellPanel extends JPanel {
+public class ScriptShellPanel extends JPanel {
 
     private static final long serialVersionUID = 4116273141148726319L;
 
--- a/jdk/src/share/demo/scripting/jconsole-plugin/src/resources/jconsole.js	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/demo/scripting/jconsole-plugin/src/resources/jconsole.js	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -77,12 +77,37 @@
 function jcontext() {
     return plugin.getContext();
 }
-jcontext.docString = "returns JConsoleContext for the current jconsole plugin" 
+jcontext.docString = "returns JConsoleContext for the current jconsole plugin";
 
 function mbeanConnection() {
     return jcontext().getMBeanServerConnection();
 }
-mbeanConnection.docString = "returns current MBeanServer connection"
+mbeanConnection.docString = "returns current MBeanServer connection";
+
+// check if there is a build in sync function, define one if missing
+if (typeof sync === "undefined") {
+    var sync = function(func, obj) {
+        if (arguments.length < 1 || arguments.length > 2 ) {
+            throw "sync(function [,object]) parameter count mismatch";
+        }
+
+        var syncobj = (arguments.length == 2 ? obj : this);
+
+        if (!syncobj._syncLock) {
+            syncobj._syncLock = new Lock();
+        }
+
+        return function() {
+            syncobj._syncLock.lock();
+            try {
+                func.apply(null, arguments);
+            } finally {
+                syncobj._syncLock.unlock();
+            }
+        };
+    };
+    sync.docString = "synchronize a function, optionally on an object";
+}
 
 /**
  * Prints one liner help message for each function exposed here
@@ -188,22 +213,12 @@
 
 // wraps a script array as java.lang.Object[]
 function objectArray(array) {
-    var len = array.length;
-    var res = java.lang.reflect.Array.newInstance(java.lang.Object, len);
-    for (var i = 0; i < array.length; i++) {
-        res[i] = array[i];
-    }
-    return res;
+    return Java.to(array, "java.lang.Object[]");
 }
 
 // wraps a script (string) array as java.lang.String[]
 function stringArray(array) {
-    var len = array.length;
-    var res = java.lang.reflect.Array.newInstance(java.lang.String, len);
-    for (var i = 0; i < array.length; i++) {
-        res[i] = String(array[i]);
-    }
-    return res;
+    return Java.to(array, "java.lang.String[]");
 }
 
 // script array to Java List
@@ -286,16 +301,18 @@
  * will be of type FutureTask. When you need value, call 'get' on it.
  */
 function mbean(objName, async) {
+    var index;
+
     objName = objectName(objName);
     var info = mbeanInfo(objName);
     var attrs = info.attributes;
     var attrMap = new Object;
-    for (var index in attrs) {
+    for (index in attrs) {
         attrMap[attrs[index].name] = attrs[index];
     }
     var opers = info.operations;
     var operMap = new Object;
-    for (var index in opers) {
+    for (index in opers) {
         operMap[opers[index].name] = opers[index];
     }
 
@@ -318,21 +335,30 @@
                 } else {
                     return getMBeanAttribute(objName, name); 
                 }
-            } else if (isOperation(name)) {
+            } else {
+                return undefined;
+            }
+        },
+        __call__: function(name) {
+            if (isOperation(name)) {
                 var oper = operMap[name];
-                return function() {
-                    var params = objectArray(arguments);
-                    var sigs = oper.signature;
-                    var sigNames = new Array(sigs.length);
-                    for (var index in sigs) {
-                        sigNames[index] = sigs[index].getType();
-                    }
-                    if (async) {
-                        return invokeMBean.future(objName, name, 
-                                                  params, sigNames);
-                    } else {
-                        return invokeMBean(objName, name, params, sigNames);
-                    }
+
+                var params = [];
+                for (var j = 1; j < arguments.length; j++) {
+                    params[j-1]= arguments[j];
+                }
+
+                var sigs = oper.signature;
+
+                var sigNames = new Array(sigs.length);
+                for (var index in sigs) {
+                    sigNames[index] = sigs[index].getType();
+                }
+
+                if (async) {
+                    return invokeMBean.future(objName, name, params, sigNames);
+                } else {
+                    return invokeMBean(objName, name, params, sigNames);
                 }
             } else {
                 return undefined;
@@ -520,7 +546,7 @@
     } finally {
         lock.unlock();
     }
-}
+};
 
 /**
  * Causes current thread to sleep for specified
@@ -534,8 +560,7 @@
 sleep.docString = "wrapper for java.lang.Thread.sleep method";
 
 /**
- * Schedules a task to be executed once in
- * every N milliseconds specified. 
+ * Schedules a task to be executed once in N milliseconds specified.
  *
  * @param callback function or expression to evaluate
  * @param interval in milliseconds to sleep
@@ -549,15 +574,15 @@
     // start a new thread that sleeps given time
     // and calls callback in an infinite loop
     return (function() {
-         while (true) {
+         try {
              sleep(interval);
-             callback();
-         }
+         } catch (x) { }
+         callback();
     }).daemon();
 }
-setTimeout.docString = "calls given callback once after specified interval"
+setTimeout.docString = "calls given callback once after specified interval";
 
-/** 
+/**
  * Cancels a timeout set earlier.
  * @param tid timeout ID returned from setTimeout
  */
@@ -565,6 +590,45 @@
     // we just interrupt the timer thread
     tid.interrupt();
 }
+clearTimeout.docString = "interrupt a setTimeout timer";
+
+/**
+ * Schedules a task to be executed once in
+ * every N milliseconds specified.
+ *
+ * @param callback function or expression to evaluate
+ * @param interval in milliseconds to sleep
+ * @return timeout ID (which is nothing but Thread instance)
+ */
+function setInterval(callback, interval) {
+    if (! (callback instanceof Function)) {
+        callback = new Function(callback);
+    }
+
+    // start a new thread that sleeps given time
+    // and calls callback in an infinite loop
+    return (function() {
+         while (true) {
+             try {
+                 sleep(interval);
+             } catch (x) {
+                 break;
+             }
+             callback();
+         }
+    }).daemon();
+}
+setInterval.docString = "calls given callback every specified interval";
+
+/**
+ * Cancels a timeout set earlier.
+ * @param tid timeout ID returned from setTimeout
+ */
+function clearInterval(tid) {
+    // we just interrupt the timer thread
+    tid.interrupt();
+}
+clearInterval.docString = "interrupt a setInterval timer";
 
 /**
  * Simple access to thread local storage. 
@@ -680,7 +744,7 @@
         if (msg === undefined) msg = "undefined";
         if (msg === null) msg = "null";
         if (title == undefined) title = msg;
-        if (msgType == undefined) type = JOptionPane.INFORMATION_MESSAGE;
+        if (msgType == undefined) msgType = JOptionPane.INFORMATION_MESSAGE;
         JOptionPane.showMessageDialog(window, msg, title, msgType);
     }
     if (isEventThread()) {
@@ -800,7 +864,7 @@
  * Clear the screen
  */
 function clear() {
-    (function() { window.clear(false) }).invokeLater();
+    (function() { window.clear(false); }).invokeLater();
 }
 clear.docString = "clears interactive console screen";
 
--- a/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/invoke.js	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/invoke.js	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -53,6 +53,6 @@
  *
  */
 function resetPeakThreadCount() {
-    return invokeMBean("java.lang:type=Threading", "resetPeakThreadCount", [], "");    
+    return invokeMBean("java.lang:type=Threading", "resetPeakThreadCount", [], {});    
 }
 
--- a/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/jstack.js	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/jstack.js	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -43,16 +43,16 @@
  * threads.'jstack' function which can be called once or periodically 
  * from a timer thread (calling it periodically would slow down the target
  * application). To call this once, just call 'jstack()' in script
- * console prompt. To call jtop in a timer thread, you can use
+ * console prompt. To call jstack in a timer thread, you can use
  *
- *     var t = setTimeout(function () { jstack(print); }, 5000); 
+ *     var t = setInterval(function () { jstack(print); }, 5000);
  *
  * The above call prints threads in sorted order for every 5 seconds.
  * The print output goes to OS console window from which jconsole was 
  * started. The timer can be cancelled later by clearTimeout() function
  * as shown below:
  * 
- *     clearTimeout(t);    
+ *     clearInterval(t);
  */
 
 
@@ -87,7 +87,7 @@
 
     var tmbean = newPlatformMXBeanProxy(
         "java.lang:type=Threading",
-        java.lang.management.ThreadMXBean);
+        java.lang.management.ThreadMXBean.class);
 
     var tids = tmbean.allThreadIds;
     var tinfos = tmbean["getThreadInfo(long[],int)"](tids, maxFrames);
--- a/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/jtop.js	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/jtop.js	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -45,14 +45,14 @@
  * To call this once, just call 'jtop()' in script console prompt. 
  * To call jtop in a timer thread, you can use
  *
- *     var t = setTimeout(function () { jtop(print); }, 2000); 
+ *     var t = setInterval(function () { jtop(print); }, 2000); 
  *
  * The above call prints threads in sorted order for every 2 seconds.
  * The print output goes to OS console window from which jconsole was 
  * started. The timer can be cancelled later by clearTimeout() function
  * as shown below:
- * 
- *     clearTimeout(t);    
+ *
+ *     clearInterval(t);
  */
 
 /**
@@ -62,10 +62,10 @@
 function getThreadList() {
     var tmbean = newPlatformMXBeanProxy(
         "java.lang:type=Threading",
-        java.lang.management.ThreadMXBean);
+        java.lang.management.ThreadMXBean.class);
 
     if (!tmbean.isThreadCpuTimeSupported()) {
-        return;
+        return java.util.Collections.EMPTY_LIST;
     }
 
     tmbean.setThreadCpuTimeEnabled(true);
--- a/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/sysprops.js	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/demo/scripting/jconsole-plugin/src/scripts/sysprops.js	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -43,16 +43,16 @@
  * properties.'sysprops' function which can be called once or periodically 
  * from a timer thread (calling it periodically would slow down the target
  * application). To call this once, just call 'sysprops()' in script
- * console prompt. To call jtop in a timer thread, you can use
+ * console prompt. To call sysprops in a timer thread, you can use
  *
- *     var t = setTimeout(function () { sysprops(print); }, 5000); 
+ *     var t = setInterval(function () { sysprops(print); }, 5000);
  *
  * The above call prints threads in sorted order for every 5 seconds.
  * The print output goes to OS console window from which jconsole was 
  * started. The timer can be cancelled later by clearTimeout() function
  * as shown below:
  * 
- *     clearTimeout(t);    
+ *     clearInterval(t);
  */
 
 
@@ -62,7 +62,7 @@
 function getSystemProps() {
     var runtimeBean = newPlatformMXBeanProxy(
                 "java.lang:type=Runtime",
-                java.lang.management.RuntimeMXBean);
+                java.lang.management.RuntimeMXBean.class);
     return runtimeBean.systemProperties;
 }
 
--- a/jdk/src/share/sample/scripting/scriptpad/README.txt	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/sample/scripting/scriptpad/README.txt	Wed Jul 05 19:07:19 2017 +0200
@@ -108,7 +108,7 @@
       java -Dcom.sun.management.jmxremote.port=1090          \
            -Dcom.sun.management.jmxremote.ssl=false          \
            -Dcom.sun.management.jmxremote.authenticate=false \
-           -jar $JDK_HOME/demo/jfc/Java2D/Java2Demo.jar
+           -jar $JDK_HOME/demo/jfc/Font2DTest/Font2DTest.jar
 
 (2) Start scriptpad and click on "Tools->JMX Connect" menu.
     In the prompt, enter "localhost:1090" to connect to the above
--- a/jdk/src/share/sample/scripting/scriptpad/src/resources/conc.js	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/sample/scripting/scriptpad/src/resources/conc.js	Wed Jul 05 19:07:19 2017 +0200
@@ -221,7 +221,7 @@
  * @return timeout ID (which is nothing but Thread instance)
  */
 function setTimeout(callback, interval) {
-    if (! (callback instanceof Function) && typeof callback !== "function") {
+    if (! (callback instanceof Function)) {
         callback = new Function(callback);
     }
 
@@ -255,7 +255,7 @@
  * @return timeout ID (which is nothing but Thread instance)
  */
 function setInterval(callback, interval) {
-    if (! (callback instanceof Function) && typeof callback !== "function") {
+    if (! (callback instanceof Function)) {
         callback = new Function(callback);
     }
 
--- a/jdk/src/share/sample/scripting/scriptpad/src/resources/mm.js	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/share/sample/scripting/scriptpad/src/resources/mm.js	Wed Jul 05 19:07:19 2017 +0200
@@ -159,22 +159,12 @@
 
 // wraps a script array as java.lang.Object[]
 function objectArray(array) {
-    var len = array.length;
-    var res = java.lang.reflect.Array.newInstance(java.lang.Object, len);
-    for (var i = 0; i < array.length; i++) {
-        res[i] = array[i];
-    }
-    return res;
+    return Java.to(array, "java.lang.Object[]");
 }
 
 // wraps a script (string) array as java.lang.String[]
 function stringArray(array) {
-    var len = array.length;
-    var res = java.lang.reflect.Array.newInstance(java.lang.String, len);
-    for (var i = 0; i < array.length; i++) {
-        res[i] = String(array[i]);
-    }
-    return res;
+    return Java.to(array, "java.lang.String[]");
 }
 
 // script array to Java List
@@ -284,26 +274,35 @@
         __get__: function (name) {
             if (isAttribute(name)) {
                 if (async) {
-                    return getMBeanAttribute.future(objName, name);
+                    return getMBeanAttribute.future(objName, name); 
                 } else {
-                    return getMBeanAttribute(objName, name);
+                    return getMBeanAttribute(objName, name); 
                 }
-            } else if (isOperation(name)) {
+            } else {
+                return undefined;
+            }
+        },
+        __call__: function(name) {
+            if (isOperation(name)) {
                 var oper = operMap[name];
-                return function() {
-                    var params = objectArray(arguments);
-                    var sigs = oper.signature;
-                    var sigNames = new Array(sigs.length);
-                    for (var index in sigs) {
-                        sigNames[index] = sigs[index].getType();
-                    }
-                    if (async) {
-                        return invokeMBean.future(objName, name,
-                                                  params, sigNames);
-                    } else {
-                        return invokeMBean(objName, name, params, sigNames);
-                    }
-                };
+
+                var params = [];
+                for (var j = 1; j < arguments.length; j++) {
+                    params[j-1]= arguments[j];
+                }
+
+                var sigs = oper.signature;
+
+                var sigNames = new Array(sigs.length);
+                for (var index in sigs) {
+                    sigNames[index] = sigs[index].getType();
+                }
+
+                if (async) {
+                    return invokeMBean.future(objName, name, params, sigNames);
+                } else {
+                    return invokeMBean(objName, name, params, sigNames);
+                }
             } else {
                 return undefined;
             }
--- a/jdk/src/solaris/classes/sun/print/UnixPrintJob.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/solaris/classes/sun/print/UnixPrintJob.java	Wed Jul 05 19:07:19 2017 +0200
@@ -334,6 +334,10 @@
             throw new PrintException("can't get print data: " + e.toString());
         }
 
+        if (data == null) {
+            throw new PrintException("Null print data.");
+        }
+
         if (flavor == null || (!service.isDocFlavorSupported(flavor))) {
             notifyEvent(PrintJobEvent.JOB_FAILED);
             throw new PrintJobFlavorException("invalid flavor", flavor);
--- a/jdk/src/solaris/native/java/lang/java_props_md.c	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/solaris/native/java/lang/java_props_md.c	Wed Jul 05 19:07:19 2017 +0200
@@ -361,6 +361,25 @@
             *std_encoding = "Big5-HKSCS-2001";
         }
 #endif
+#ifdef MACOSX
+        /*
+         * For the case on MacOS X where encoding is set to US-ASCII, but we
+         * don't have any encoding hints from LANG/LC_ALL/LC_CTYPE, use UTF-8
+         * instead.
+         *
+         * The contents of ASCII files will still be read and displayed
+         * correctly, but so will files containing UTF-8 characters beyond the
+         * standard ASCII range.
+         *
+         * Specifically, this allows apps launched by double-clicking a .jar
+         * file to correctly read UTF-8 files using the default encoding (see
+         * 8011194).
+         */
+        if (strcmp(p,"US-ASCII") == 0 && getenv("LANG") == NULL &&
+            getenv("LC_ALL") == NULL && getenv("LC_CTYPE") == NULL) {
+            *std_encoding = "UTF-8";
+        }
+#endif
     }
 
     free(temp);
--- a/jdk/src/solaris/native/sun/awt/gtk2_interface.c	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/solaris/native/sun/awt/gtk2_interface.c	Wed Jul 05 19:07:19 2017 +0200
@@ -794,6 +794,7 @@
             }
             putenv (new_env);
             free (new_env);
+            free (tmp_env);
         }
     }
 
--- a/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c	Wed Jul 05 19:07:19 2017 +0200
@@ -269,6 +269,13 @@
     static jboolean firstTime = JNI_TRUE;
 
     if (firstTime) {
+#ifdef DISABLE_XRENDER_BY_DEFAULT
+        if (verbose == JNI_FALSE) {
+            xrenderAvailable = JNI_FALSE;
+            firstTime = JNI_FALSE;
+            return xrenderAvailable;
+        }
+#endif
         AWT_LOCK();
         xrenderAvailable = IsXRenderAvailable(verbose);
         AWT_UNLOCK();
--- a/jdk/src/windows/classes/sun/print/Win32PrintJob.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/windows/classes/sun/print/Win32PrintJob.java	Wed Jul 05 19:07:19 2017 +0200
@@ -340,6 +340,10 @@
             throw new PrintException("can't get print data: " + e.toString());
         }
 
+        if (data == null) {
+            throw new PrintException("Null print data.");
+        }
+
         if (flavor == null || (!service.isDocFlavorSupported(flavor))) {
             notifyEvent(PrintJobEvent.JOB_FAILED);
             throw new PrintJobFlavorException("invalid flavor", flavor);
--- a/jdk/src/windows/native/java/lang/java_props_md.c	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/windows/native/java/lang/java_props_md.c	Wed Jul 05 19:07:19 2017 +0200
@@ -443,6 +443,7 @@
                     case  0: sprops.os_name = "Windows Vista";        break;
                     case  1: sprops.os_name = "Windows 7";            break;
                     case  2: sprops.os_name = "Windows 8";            break;
+                    case  3: sprops.os_name = "Windows 8.1";          break;
                     default: sprops.os_name = "Windows NT (unknown)";
                     }
                 } else {
@@ -450,6 +451,7 @@
                     case  0: sprops.os_name = "Windows Server 2008";    break;
                     case  1: sprops.os_name = "Windows Server 2008 R2"; break;
                     case  2: sprops.os_name = "Windows Server 2012";    break;
+                    case  3: sprops.os_name = "Windows Server 2012 R2"; break;
                     default: sprops.os_name = "Windows NT (unknown)";
                     }
                 }
--- a/jdk/src/windows/native/sun/windows/awt_Component.cpp	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp	Wed Jul 05 19:07:19 2017 +0200
@@ -3528,8 +3528,12 @@
     if (ops == SAVE) {
         transTable.put(reinterpret_cast<void*>(static_cast<INT_PTR>(wkey)),
                        reinterpret_cast<void*>(static_cast<INT_PTR>(translation)));
-        deadKeyFlagTable.put(reinterpret_cast<void*>(static_cast<INT_PTR>(wkey)),
-                       reinterpret_cast<void*>(static_cast<INT_PTR>(deadKeyFlag)));
+        if (deadKeyFlag) {
+            deadKeyFlagTable.put(reinterpret_cast<void*>(static_cast<INT_PTR>(wkey)),
+                         reinterpret_cast<void*>(static_cast<INT_PTR>(deadKeyFlag)));
+        } else {
+            deadKeyFlagTable.remove(reinterpret_cast<void*>(static_cast<INT_PTR>(wkey)));
+        }
     }
 
     isDeadKey = deadKeyFlag;
--- a/jdk/src/windows/resource/java.manifest	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/src/windows/resource/java.manifest	Wed Jul 05 19:07:19 2017 +0200
@@ -44,8 +44,14 @@
   <!-- Indicate this JDK version is Windows 7 compatible -->
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
       <application>
+        <!-- Windows Vista -->
+        <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
+        <!-- Windows 7 -->
         <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
-        <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
+        <!-- Windows 8 -->
+        <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
+        <!-- Windows 8.1 -->
+        <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
       </application>
     </compatibility>
 
--- a/jdk/test/ProblemList.txt	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/ProblemList.txt	Wed Jul 05 19:07:19 2017 +0200
@@ -138,6 +138,9 @@
 java/lang/instrument/RedefineBigClass.sh                        linux-x64
 java/lang/instrument/RetransformBigClass.sh                     linux-x64
 
+# 8021230
+java/lang/ThreadLocal/ThreadLocalSupplierTest.java              generic-all
+
 
 ############################################################################
 
@@ -367,9 +370,6 @@
 # Filed 6772009
 java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java generic-all
 
-# 8020435
-java/util/concurrent/CompletableFuture/Basic.java                generic-all
-
 # 7041639, Solaris DSA keypair generation bug
 java/util/TimeZone/TimeZoneDatePermissionCheck.sh               solaris-all
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/apple/eawt/DefaultMenuBar/DefaultMenuBarTest.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,108 @@
+/*
+ * 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
+ * @bug 8007267
+ * @summary [macosx] com.apple.eawt.Application.setDefaultMenuBar is not working
+ * @author leonid.romanov@oracle.com
+ * @run main DefaultMenuBarTest
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import sun.awt.*;
+import java.lang.reflect.Method;
+
+
+public class DefaultMenuBarTest {
+    static KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.META_MASK);
+
+    static volatile int listenerCallCounter = 0;
+    public static void main(String[] args) throws Exception {
+        if (sun.awt.OSInfo.getOSType() != sun.awt.OSInfo.OSType.MACOSX) {
+            System.out.println("This test is for MacOS only. Automatically passed on other platforms.");
+            return;
+        }
+
+        System.setProperty("apple.laf.useScreenMenuBar", "true");
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                createAndShowGUI();
+            }
+        });
+
+        SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+        Robot robot = new Robot();
+        robot.setAutoDelay(100);
+
+        robot.keyPress(KeyEvent.VK_META);
+        robot.keyPress(ks.getKeyCode());
+        robot.keyRelease(ks.getKeyCode());
+        robot.keyRelease(KeyEvent.VK_META);
+
+        toolkit.realSync();
+
+        if (listenerCallCounter != 1) {
+            throw new Exception("Test failed: ActionListener either wasn't called or was called more than once");
+        }
+    }
+
+    private static void createAndShowGUI() {
+        JMenu menu = new JMenu("File");
+        JMenuItem newItem = new JMenuItem("Open");
+
+        newItem.setAccelerator(ks);
+        newItem.addActionListener(
+            new ActionListener(){
+                public void actionPerformed(ActionEvent e) {
+                    listenerCallCounter++;
+                }
+            }
+        );
+        menu.add(newItem);
+
+        JMenuBar defaultMenu = new JMenuBar();
+        defaultMenu.add(menu);
+
+        // Application.getApplication().setDefaultMenuBar(defaultMenu);
+        try {
+            Class appClass = Class.forName("com.apple.eawt.Application");
+            if (appClass != null) {
+                Method method = appClass.getMethod("getApplication");
+                if (method != null) {
+                    Object app = method.invoke(null, new Object[]{});
+                    if (app != null) {
+                        method = appClass.getMethod("setDefaultMenuBar", new Class[]{JMenuBar.class});
+                        if (method != null) {
+                            method.invoke(app, new Object[]{defaultMenu});
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
--- a/jdk/test/java/awt/EventDispatchThread/LoopRobustness/LoopRobustness.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/awt/EventDispatchThread/LoopRobustness/LoopRobustness.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -49,6 +49,8 @@
     public static volatile boolean otherExceptionsCaught = false;
 
     public static void main(String [] args) throws Exception {
+        SunToolkit.createNewAppContext();
+
         ThreadGroup mainThreadGroup = Thread.currentThread().getThreadGroup();
 
         long at;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/event/KeyEvent/DeadKey/DeadKeySystemAssertionDialog.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 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.
+ */
+
+import java.awt.Frame;
+import java.awt.Robot;
+import java.awt.TextField;
+import java.awt.Toolkit;
+import java.awt.event.KeyEvent;
+import sun.awt.SunToolkit;
+/*
+ * @test
+ * @bug 8013849
+ * @summary Awt assert on Hashtable.cpp:124
+ * @author alexandr.scherbatiy area=awt.event
+ * @run main/timeout=5 DeadKeySystemAssertionDialog
+ */
+
+public class DeadKeySystemAssertionDialog {
+
+    public static void main(String[] args) throws Exception {
+
+        SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+        Frame frame = new Frame();
+        frame.setSize(300, 200);
+
+        TextField textField = new TextField();
+        frame.add(textField);
+
+        frame.setVisible(true);
+        toolkit.realSync();
+
+        textField.requestFocus();
+        toolkit.realSync();
+
+        // Check that the system assertion dialog does not block Java
+        Robot robot = new Robot();
+        robot.setAutoDelay(50);
+        robot.keyPress(KeyEvent.VK_A);
+        robot.keyRelease(KeyEvent.VK_A);
+        toolkit.realSync();
+
+        frame.setVisible(false);
+        frame.dispose();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/MacEncoding/ExpectedEncoding.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 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.
+ */
+
+/**
+ * Check that the value of file.encoding and sun.jnu.encoding match the expected
+ * values passed in on the command-line.
+ */
+public class ExpectedEncoding {
+    public static void main(String[] args) {
+        boolean failed = false;
+        if (args.length != 2) {
+            System.out.println("Usage:");
+            System.out.println("$ java ExpectedEncoding <expected file.encoding> <expected sun.jnu.encoding>");
+            System.out.println("$   use \"skip\" to skip checking property's value");
+            System.exit(1);
+        }
+        String expectFileEnc = args[0];
+        String expectSunJnuEnc = args[1];
+
+        String fileEnc = System.getProperty("file.encoding");
+        String jnuEnc = System.getProperty("sun.jnu.encoding");
+
+        if ("skip".equals(expectFileEnc)) {
+            System.err.println("Expected file.encoding is \"skip\", ignoring");
+        } else {
+            System.err.println("Expected file.encoding: " + expectFileEnc);
+            System.err.println("Actual file.encoding: " + fileEnc);
+            if (fileEnc == null || !fileEnc.equals(expectFileEnc)) {
+                failed = true;
+            }
+        }
+        if ("skip".equals(expectSunJnuEnc)) {
+            System.err.println("Expected sun.jnu.encoding is \"skip\", ignoring");
+        } else {
+            if (jnuEnc == null || !jnuEnc.equals(expectSunJnuEnc)) {
+                System.err.println("Expected sun.jnu.encoding: " + expectSunJnuEnc);
+                System.err.println("Actual sun.jnu.encoding: " + jnuEnc);
+                failed = true;
+            }
+        }
+
+        if (failed) {
+            throw new RuntimeException("Test Failed");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/MacEncoding/MacJNUEncoding.sh	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,101 @@
+#!/bin/sh
+
+#
+# Copyright (c) 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 8003228
+# @summary Test the value of sun.jnu.encoding on Mac
+# @author Brent Christian
+#
+# @run shell MacJNUEncoding.sh
+
+# Only run test on Mac
+OS=`uname -s`
+case "$OS" in
+  Darwin )  ;;
+  * )
+    exit 0
+    ;;
+esac
+
+if [ "${TESTJAVA}" = "" ]
+then
+  echo "TESTJAVA not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+
+if [ "${COMPILEJAVA}" = "" ]; then
+  COMPILEJAVA="${TESTJAVA}"
+fi
+
+
+if [ "${TESTSRC}" = "" ]
+then
+  echo "TESTSRC not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+  echo "TESTCLASSES not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+
+JAVAC="${COMPILEJAVA}"/bin/javac
+JAVA="${TESTJAVA}"/bin/java
+
+echo "Building test classes..."
+"$JAVAC" ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d "${TESTCLASSES}" "${TESTSRC}"/ExpectedEncoding.java 
+
+echo ""
+echo "Running test for C locale"
+export LANG=C
+export LC_ALL=C
+"${JAVA}" ${TESTVMOPTS} -classpath "${TESTCLASSES}" ExpectedEncoding US-ASCII UTF-8
+result1=$?
+
+echo ""
+echo "Running test for en_US.UTF-8 locale"
+export LANG=en_US.UTF-8
+export LC_ALL=en_US.UTF-8
+"${JAVA}" ${TESTVMOPTS} -classpath "${TESTCLASSES}" ExpectedEncoding UTF-8 UTF-8
+result2=$?
+
+echo ""
+echo "Cleanup"
+rm ${TESTCLASSES}/ExpectedEncoding.class
+
+if [ ${result1} -ne 0 ] ; then
+    echo "Test failed for C locale"
+    echo "  LANG=\"${LANG}\""
+    echo "  LC_ALL=\"${LC_ALL}\""
+    exit ${result1}
+fi
+if [ ${result2} -ne 0 ] ; then
+    echo "Test failed for en_US.UTF-8 locale"
+    echo "  LANG=\"${LANG}\""
+    echo "  LC_ALL=\"${LC_ALL}\""
+    exit ${result2}
+fi
+exit 0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/MacEncoding/TestFileEncoding.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,168 @@
+/*
+ * 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.
+ */
+
+import java.util.*;
+
+/*
+ * @test
+ * @bug 8011194
+ * @summary Test value of file.encoding for corresponding value of LANG, etc
+ * @library ../../../../tools/launcher/ ../
+ * @build TestHelper TestFileEncoding ExpectedEncoding
+ * @run main TestFileEncoding UTF-8
+ * @run main/othervm -Dfile.encoding=MyEncoding -DuserEncoding=MyEncoding TestFileEncoding MyEncoding
+ * @run main TestFileEncoding UTF-8 en_US.UTF-8
+ * @run main/othervm -Dfile.encoding=MyEncoding -DuserEncoding=MyEncoding TestFileEncoding MyEncoding en_US.UTF-8
+ * @run main TestFileEncoding US-ASCII C
+ * @run main/othervm -Dfile.encoding=MyEncoding -DuserEncoding=MyEncoding TestFileEncoding MyEncoding C
+ * @author Brent Christian
+ */
+
+/**
+ * Setup the environment and run a sub-test to check the expected value of
+ * file.encoding, based on the value(s) of encoding-related environment vars
+ * (LANG, LC_ALL, LC_CTYPE).
+ *
+ * The first argument (required) is the expected value of the
+ * file.encoding System property.
+ * The second argument (optional) is the value to set to the LANG/etc env vars.
+ */
+public class TestFileEncoding {
+    private static final String TEST_NAME = "ExpectedEncoding";
+
+    private String expectedEncoding; // Expected value for file.encoding
+    private String langVar = null; // Value to set for LANG, etc
+
+    private static Set<String> envToRm = new HashSet<>(3);
+    static {
+        // Take these vars out of the test's run environment, possibly adding
+        // our own value back in.
+        envToRm.add("LANG");
+        envToRm.add("LC_ALL");
+        envToRm.add("LC_CTYPE");
+    }
+
+    public TestFileEncoding(String expectedEncoding) {
+        this.expectedEncoding = expectedEncoding;
+    }
+
+    public TestFileEncoding(String expectedEncoding, String langVar) {
+        this.expectedEncoding = expectedEncoding;
+        this.langVar = langVar;
+    }
+
+    /*
+     * Launch ExpectedEncoding with the given parameters, check for the
+     * expected file.encoding.
+     */
+    private void run() {
+        String testClasses = System.getProperty("test.classes");
+
+        // Pick up VM opts
+        String vmOptsStr = System.getProperty("test.vm.opts");
+        System.out.println("test.vm.opts: " + vmOptsStr);
+        String[] vmOpts = new String[0];
+        if (vmOptsStr != null && !"".equals(vmOptsStr)) {
+            vmOpts = vmOptsStr.split(" ");
+            System.out.println("found vm options:");
+            for (String opt : vmOpts) {
+                System.out.println("  <" + opt + ">");
+            }
+        }
+
+        // Build java cmd
+        LinkedList<String> cmdList = new LinkedList<>();
+        cmdList.add(TestHelper.javaCmd);
+        for (String vmOpt : vmOpts) {
+            if (vmOpt != null && !vmOpt.equals("")) {
+                cmdList.add(vmOpt);
+            }
+        }
+
+        // See if the user specified a file.encoding that we should pass through
+        String userEncoding = System.getProperty("userEncoding");
+        if (userEncoding != null) {
+            cmdList.add("-Dfile.encoding="+userEncoding);
+        }
+
+        cmdList.add("-cp");
+        cmdList.add(testClasses);
+        cmdList.add(TEST_NAME);
+        cmdList.add(expectedEncoding);
+        cmdList.add("skip"); // ignore sun.jnu.encoding for this test
+
+        String cmdArray[] = new String[cmdList.size()];
+        cmdList.toArray(cmdArray);
+
+        // Run the test(s)
+        if (langVar == null) {
+            System.out.println("TestFileEncoding: Running with no envvars set");
+            TestHelper.TestResult tr = TestHelper.doExec(null, envToRm,
+                                                         cmdArray);
+            checkResult(tr);
+        } else {
+            runWithEnvVar("LANG", cmdArray);
+            runWithEnvVar("LC_ALL", cmdArray);
+            runWithEnvVar("LC_CTYPE", cmdArray);
+        }
+    }
+
+    /*
+     * Run the test, setting the environment named by envVarName to the value
+     * in langVar.
+     */
+    private void runWithEnvVar(String envVarName, String[] cmdArray) {
+        Map<String, String> envToAdd = new HashMap<>(1);
+        TestHelper.TestResult tr = null;
+
+        System.out.println("TestFileEncoding: Running with " + envVarName + "=" + langVar);
+        envToAdd.put(envVarName, langVar);
+        tr = TestHelper.doExec(envToAdd, envToRm, cmdArray);
+        checkResult(tr);
+    }
+
+    private void checkResult(TestHelper.TestResult tr) {
+        System.out.println(tr);
+        if (!tr.isOK()) {
+            throw new RuntimeException("TEST FAILED: !tr.isOK()");
+        }
+    }
+
+    public static void main(String[] args) {
+        TestFileEncoding cfe = null;
+        if (!TestHelper.isMacOSX) {
+            System.out.println("Test is currently only for Mac OS X - pass.");
+            return;
+        }
+        if (args.length == 1) {
+            cfe = new TestFileEncoding(args[0]);
+        } else if (args.length == 2) {
+            cfe = new TestFileEncoding(args[0], args[1]);
+        } else {
+            System.out.println("Usage: TestFileEncoding <expected file.encoding>");
+            System.out.println("       TestFileEncoding <expected file.encoding> <value for LANG/etc env var>");
+            return;
+        }
+        cfe.run();
+    }
+}
--- a/jdk/test/java/lang/System/MacJNUEncoding/ExpectedEncoding.java	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 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.
- */
-
-/**
- * Check that the value of file.encoding and sun.jnu.encoding match the expected
- * values passed in on the command-line.
- */
-public class ExpectedEncoding {
-    public static void main(String[] args) {
-        boolean failed = false;
-        if (args.length != 2) {
-            System.out.println("Usage:");
-            System.out.println("$ java ExpectedEncoding <expected file.encoding> <expected sun.jnu.encoding>");
-            System.exit(1);
-        }
-        String expectFileEnc = args[0];
-        String expectSunJnuEnc = args[1];
-
-        String fileEnc = System.getProperty("file.encoding");
-        String jnuEnc = System.getProperty("sun.jnu.encoding");
-
-        if (fileEnc == null || !fileEnc.equals(expectFileEnc)) {
-            System.err.println("Expected file.encoding: " + expectFileEnc);
-            System.err.println("Actual file.encoding: " + fileEnc);
-            failed = true;
-        }
-        if (jnuEnc == null || !jnuEnc.equals(expectSunJnuEnc)) {
-            System.err.println("Expected sun.jnu.encoding: " + expectSunJnuEnc);
-            System.err.println("Actual sun.jnu.encoding: " + jnuEnc);
-            failed = true;
-        }
-        if (failed) {
-            throw new RuntimeException("Test Failed");
-        }
-    }
-}
--- a/jdk/test/java/lang/System/MacJNUEncoding/MacJNUEncoding.sh	Thu Aug 08 10:10:37 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-#!/bin/sh
-
-#
-# Copyright (c) 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 8003228
-# @summary Test the value of sun.jnu.encoding on Mac
-# @author Brent Christian
-#
-# @run shell MacJNUEncoding.sh
-
-# Only run test on Mac
-OS=`uname -s`
-case "$OS" in
-  Darwin )  ;;
-  * )
-    exit 0
-    ;;
-esac
-
-if [ "${TESTJAVA}" = "" ]
-then
-  echo "TESTJAVA not set.  Test cannot execute.  Failed."
-  exit 1
-fi
-
-if [ "${COMPILEJAVA}" = "" ]; then
-  COMPILEJAVA="${TESTJAVA}"
-fi
-
-
-if [ "${TESTSRC}" = "" ]
-then
-  echo "TESTSRC not set.  Test cannot execute.  Failed."
-  exit 1
-fi
-
-if [ "${TESTCLASSES}" = "" ]
-then
-  echo "TESTCLASSES not set.  Test cannot execute.  Failed."
-  exit 1
-fi
-
-JAVAC="${COMPILEJAVA}"/bin/javac
-JAVA="${TESTJAVA}"/bin/java
-
-echo "Building test classes..."
-"$JAVAC" ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d "${TESTCLASSES}" "${TESTSRC}"/ExpectedEncoding.java 
-
-echo ""
-echo "Running test for C locale"
-export LANG=C
-export LC_ALL=C
-"${JAVA}" ${TESTVMOPTS} -classpath "${TESTCLASSES}" ExpectedEncoding US-ASCII UTF-8
-result1=$?
-
-echo ""
-echo "Running test for en_US.UTF-8 locale"
-export LANG=en_US.UTF-8
-export LC_ALL=en_US.UTF-8
-"${JAVA}" ${TESTVMOPTS} -classpath "${TESTCLASSES}" ExpectedEncoding UTF-8 UTF-8
-result2=$?
-
-echo ""
-echo "Cleanup"
-rm ${TESTCLASSES}/ExpectedEncoding.class
-
-if [ ${result1} -ne 0 ] ; then
-    echo "Test failed for C locale"
-    echo "  LANG=\"${LANG}\""
-    echo "  LC_ALL=\"${LC_ALL}\""
-    exit ${result1}
-fi
-if [ ${result2} -ne 0 ] ; then
-    echo "Test failed for en_US.UTF-8 locale"
-    echo "  LANG=\"${LANG}\""
-    echo "  LC_ALL=\"${LC_ALL}\""
-    exit ${result2}
-fi
-exit 0
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/reflect/DefaultStaticTest/DefaultStaticInvokeTest.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,307 @@
+/*
+ * 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
+ * @summary Test locating and invoking default/static method that defined
+ *          in interfaces and/or in inheritance
+ * @bug 7184826
+ * @build helper.Mod helper.Declared DefaultStaticTestData
+ * @run testng DefaultStaticInvokeTest
+ * @author Yong Lu
+ */
+
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+import static helper.Mod.*;
+import static helper.Declared.*;
+import helper.Mod;
+
+public class DefaultStaticInvokeTest {
+
+    @Test(dataProvider = "testCasesAll",
+            dataProviderClass = DefaultStaticTestData.class)
+    public void testGetMethods(String testTarget, Object param)
+            throws Exception {
+        // test the methods retrieved by getMethods()
+        testMethods(ALL_METHODS, testTarget, param);
+    }
+
+    @Test(dataProvider = "testCasesAll",
+            dataProviderClass = DefaultStaticTestData.class)
+    public void testGetDeclaredMethods(String testTarget, Object param)
+            throws Exception {
+        // test the methods retrieved by getDeclaredMethods()
+        testMethods(DECLARED_ONLY, testTarget, param);
+    }
+
+    @Test(dataProvider = "testCasesAll",
+            dataProviderClass = DefaultStaticTestData.class)
+    public void testMethodInvoke(String testTarget, Object param)
+            throws Exception {
+        Class<?> typeUnderTest = Class.forName(testTarget);
+        MethodDesc[] expectedMethods = typeUnderTest.getAnnotationsByType(MethodDesc.class);
+
+        // test the method retrieved by Class.getMethod(String, Object[])
+        for (MethodDesc toTest : expectedMethods) {
+            String name = toTest.name();
+            Method m = getTestMethod(typeUnderTest, name, param);
+            testThisMethod(toTest, m, typeUnderTest, param);
+        }
+    }
+
+    @Test(dataProvider = "testCasesAll",
+            dataProviderClass = DefaultStaticTestData.class)
+    public void testMethodHandleInvoke(String testTarget, Object param)
+            throws Throwable {
+        Class<?> typeUnderTest = Class.forName(testTarget);
+        MethodDesc[] expectedMethods = typeUnderTest.getAnnotationsByType(MethodDesc.class);
+
+        for (MethodDesc toTest : expectedMethods) {
+            String mName = toTest.name();
+            Mod mod = toTest.mod();
+            if (mod != STATIC && typeUnderTest.isInterface()) {
+                return;
+            }
+
+            String result = null;
+            String expectedReturn = toTest.retval();
+
+            MethodHandle methodHandle = getTestMH(typeUnderTest, mName, param);
+            if (mName.equals("staticMethod")) {
+                result = (param == null)
+                        ? (String) methodHandle.invoke()
+                        : (String) methodHandle.invoke(param);
+            } else {
+                result = (param == null)
+                        ? (String) methodHandle.invoke(typeUnderTest.newInstance())
+                        : (String) methodHandle.invoke(typeUnderTest.newInstance(), param);
+            }
+
+            assertEquals(result, expectedReturn);
+        }
+
+    }
+
+    @Test(dataProvider = "testClasses",
+            dataProviderClass = DefaultStaticTestData.class)
+    public void testIAE(String testTarget, Object param)
+            throws ClassNotFoundException {
+
+        Class<?> typeUnderTest = Class.forName(testTarget);
+        MethodDesc[] expectedMethods = typeUnderTest.getAnnotationsByType(MethodDesc.class);
+
+        for (MethodDesc toTest : expectedMethods) {
+            String mName = toTest.name();
+            Mod mod = toTest.mod();
+            if (mod != STATIC && typeUnderTest.isInterface()) {
+                return;
+            }
+            Exception caught = null;
+            try {
+                getTestMH(typeUnderTest, mName, param, true);
+            } catch (Exception e) {
+                caught = e;
+            }
+            assertTrue(caught != null);
+            assertEquals(caught.getClass(), IllegalAccessException.class);
+        }
+    }
+    private static final String[] OBJECT_METHOD_NAMES = {
+        "equals",
+        "hashCode",
+        "getClass",
+        "notify",
+        "notifyAll",
+        "toString",
+        "wait",
+        "wait",
+        "wait",};
+    private static final String LAMBDA_METHOD_NAMES = "lambda$";
+    private static final HashSet<String> OBJECT_NAMES = new HashSet<>(Arrays.asList(OBJECT_METHOD_NAMES));
+    private static final boolean DECLARED_ONLY = true;
+    private static final boolean ALL_METHODS = false;
+
+    private void testMethods(boolean declaredOnly, String testTarget, Object param)
+            throws Exception {
+        Class<?> typeUnderTest = Class.forName(testTarget);
+        Method[] methods = declaredOnly
+                ? typeUnderTest.getDeclaredMethods()
+                : typeUnderTest.getMethods();
+
+        MethodDesc[] baseExpectedMethods = typeUnderTest.getAnnotationsByType(MethodDesc.class);
+        MethodDesc[] expectedMethods;
+
+        // If only declared filter out non-declared from expected result
+        if (declaredOnly) {
+            int nonDeclared = 0;
+            for (MethodDesc desc : baseExpectedMethods) {
+                if (desc.declared() == NO) {
+                    nonDeclared++;
+                }
+            }
+            expectedMethods = new MethodDesc[baseExpectedMethods.length - nonDeclared];
+            int i = 0;
+            for (MethodDesc desc : baseExpectedMethods) {
+                if (desc.declared() == YES) {
+                    expectedMethods[i++] = desc;
+                }
+            }
+        } else {
+            expectedMethods = baseExpectedMethods;
+        }
+
+        HashMap<String, Method> myMethods = new HashMap<>(methods.length);
+        for (Method m : methods) {
+            String mName = m.getName();
+            // don't add Object methods and method created from lambda expression
+            if ((!OBJECT_NAMES.contains(mName)) && (!mName.contains(LAMBDA_METHOD_NAMES))) {
+                myMethods.put(mName, m);
+            }
+        }
+        assertEquals(expectedMethods.length, myMethods.size());
+
+        for (MethodDesc toTest : expectedMethods) {
+
+            String name = toTest.name();
+            Method candidate = myMethods.get(name);
+
+            assertNotNull(candidate);
+            myMethods.remove(name);
+
+            testThisMethod(toTest, candidate, typeUnderTest, param);
+
+        }
+
+        // Should be no methods left since we remove all we expect to see
+        assertTrue(myMethods.isEmpty());
+    }
+
+    private void testThisMethod(MethodDesc toTest, Method method,
+            Class<?> typeUnderTest, Object param) throws Exception {
+        // Test modifiers, and invoke
+        Mod mod = toTest.mod();
+        String expectedReturn = toTest.retval();
+        switch (mod) {
+            case STATIC:
+                //assert candidate is static
+                assertTrue(Modifier.isStatic(method.getModifiers()));
+                assertFalse(method.isDefault());
+
+                // Test invoke it
+                assertEquals(tryInvoke(method, null, param), expectedReturn);
+                break;
+            case DEFAULT:
+                // if typeUnderTest is a class then instantiate and invoke
+                if (!typeUnderTest.isInterface()) {
+                    assertEquals(tryInvoke(
+                            method,
+                            typeUnderTest,
+                            param),
+                            expectedReturn);
+                }
+
+                //assert candidate is default
+                assertFalse(Modifier.isStatic(method.getModifiers()));
+                assertTrue(method.isDefault());
+                break;
+            case REGULAR:
+                // if typeUnderTest must be a class
+                assertEquals(tryInvoke(
+                        method,
+                        typeUnderTest,
+                        param),
+                        expectedReturn);
+
+                //assert candidate is neither default nor static
+                assertFalse(Modifier.isStatic(method.getModifiers()));
+                assertFalse(method.isDefault());
+                break;
+            case ABSTRACT:
+                //assert candidate is neither default nor static
+                assertFalse(Modifier.isStatic(method.getModifiers()));
+                assertFalse(method.isDefault());
+                break;
+            default:
+                assertFalse(true); //this should never happen
+                break;
+        }
+
+    }
+
+    private Object tryInvoke(Method m, Class<?> receiverType, Object param)
+            throws Exception {
+        Object receiver = receiverType == null ? null : receiverType.newInstance();
+        Object result = null;
+        if (param == null) {
+            result = m.invoke(receiver);
+        } else {
+            result = m.invoke(receiver, param);
+        }
+        return result;
+    }
+
+    private Method getTestMethod(Class clazz, String methodName, Object param)
+            throws NoSuchMethodException {
+        Class[] paramsType = (param != null)
+                ? new Class[]{Object.class}
+                : new Class[]{};
+        return clazz.getMethod(methodName, paramsType);
+    }
+
+    private MethodHandle getTestMH(Class clazz, String methodName, Object param)
+            throws Exception {
+        return getTestMH(clazz, methodName, param, false);
+    }
+
+    private MethodHandle getTestMH(Class clazz, String methodName,
+            Object param, boolean isNegativeTest)
+            throws Exception {
+        MethodType mType = (param != null)
+                ? MethodType.genericMethodType(1)
+                : MethodType.methodType(String.class);
+        MethodHandles.Lookup lookup = MethodHandles.lookup();
+        if (!isNegativeTest) {
+            return methodName.equals("staticMethod")
+                    ? lookup.findStatic(clazz, methodName, mType)
+                    : lookup.findVirtual(clazz, methodName, mType);
+        } else {
+            return methodName.equals("staticMethod")
+                    ? lookup.findVirtual(clazz, methodName, mType)
+                    : lookup.findStatic(clazz, methodName, mType);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/reflect/DefaultStaticTest/DefaultStaticTestData.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,401 @@
+/*
+ * 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 Data used for testing default/static method
+ *
+ * @author Yong Lu
+ */
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.testng.annotations.DataProvider;
+import org.testng.collections.Lists;
+
+import static helper.Mod.*;
+import static helper.Declared.*;
+import helper.Mod;
+import helper.Declared;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = YES)
+interface TestIF1 {
+
+    default String defaultMethod() {
+        return "TestIF1.defaultMethod";
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = NO)
+class TestClass1 implements TestIF1 {
+}
+
+@MethodDesc(name = "staticMethod", retval = "TestIF2.staticMethod", mod = STATIC, declared = YES)
+interface TestIF2 {
+
+    static String staticMethod() {
+        return "TestIF2.staticMethod";
+    }
+}
+
+@MethodDesc(name = "method", retval = "TestIF2.staticMethod", mod = REGULAR, declared = YES)
+class TestClass2 implements TestIF2 {
+
+    public String method() {
+        return TestIF2.staticMethod();
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF3.defaultMethod", mod = DEFAULT, declared = YES)
+@MethodDesc(name = "method", retval = "", mod = ABSTRACT, declared = YES)
+interface TestIF3 {
+
+    String method();
+
+    default String defaultMethod() {
+        return "TestIF3.defaultMethod";
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF3.defaultMethod", mod = DEFAULT, declared = NO)
+@MethodDesc(name = "method", retval = "TestClass3.method", mod = REGULAR, declared = YES)
+class TestClass3 implements TestIF3 {
+
+    public String method() {
+        return "TestClass3.method";
+    }
+}
+
+@MethodDesc(name = "staticMethod", retval = "TestIF4.staticMethod", mod = STATIC, declared = YES)
+@MethodDesc(name = "method", retval = "", mod = ABSTRACT, declared = YES)
+interface TestIF4 {
+
+    String method();
+
+    static String staticMethod() {
+        return "TestIF4.staticMethod";
+    }
+}
+
+@MethodDesc(name = "method", retval = "TestClass4.method", mod = REGULAR, declared = YES)
+class TestClass4 implements TestIF4 {
+
+    public String method() {
+        return "TestClass4.method";
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF5.defaultMethod", mod = DEFAULT, declared = YES)
+@MethodDesc(name = "staticMethod", retval = "TestIF5.staticMethod", mod = STATIC, declared = YES)
+interface TestIF5 {
+
+    default String defaultMethod() {
+        return "TestIF5.defaultMethod";
+    }
+
+    static String staticMethod() {
+        return "TestIF5.staticMethod";
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF5.defaultMethod", mod = DEFAULT, declared = NO)
+class TestClass5 implements TestIF5 {
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF6.defaultMethod", mod = DEFAULT, declared = YES)
+@MethodDesc(name = "staticMethod", retval = "TestIF6.staticMethod", mod = STATIC, declared = YES)
+@MethodDesc(name = "method", retval = "", mod = ABSTRACT, declared = YES)
+interface TestIF6 {
+
+    String method();
+
+    default String defaultMethod() {
+        return "TestIF6.defaultMethod";
+    }
+
+    static String staticMethod() {
+        return "TestIF6.staticMethod";
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF6.defaultMethod", mod = DEFAULT, declared = NO)
+@MethodDesc(name = "method", retval = "TestClass6.method", mod = REGULAR, declared = YES)
+class TestClass6 implements TestIF6 {
+
+    public String method() {
+        return "TestClass6.method";
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF7.TestClass7", mod = DEFAULT, declared = YES)
+interface TestIF7<T> {
+
+    default T defaultMethod(T t) {
+        return t;
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF7.TestClass7", mod = DEFAULT, declared = NO)
+class TestClass7<T> implements TestIF7<T> {
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF8.TestClass8", mod = DEFAULT, declared = YES)
+interface TestIF8<E> {
+
+    default <E> E defaultMethod(E e) {
+        return e;
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF8.TestClass8", mod = DEFAULT, declared = NO)
+class TestClass8<T> implements TestIF8<T> {
+};
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF9.defaultMethod", mod = DEFAULT, declared = YES)
+interface TestIF9 extends TestIF1 {
+
+    default String defaultMethod() {
+        return "TestIF9.defaultMethod";
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF9.defaultMethod", mod = DEFAULT, declared = NO)
+class TestClass9 implements TestIF9 {
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF9.defaultMethod", mod = DEFAULT, declared = NO)
+@MethodDesc(name = "method", retval = "TestIF9.defaultMethod", mod = REGULAR, declared = YES)
+class TestClass91 implements TestIF9, TestIF1 {
+
+    public String method() {
+        return defaultMethod();
+    }
+}
+
+@MethodDesc(name = "staticMethod", retval = "TestIF10.staticMethod", mod = STATIC, declared = YES)
+interface TestIF10 extends TestIF2 {
+
+    static String staticMethod() {
+
+        return "TestIF10.staticMethod";
+    }
+}
+
+@MethodDesc(name = "staticMethod", retval = "TestIF11.staticMethod", mod = STATIC, declared = YES)
+@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = NO)
+interface TestIF11 extends TestIF1 {
+
+    static String staticMethod() {
+        return "TestIF11.staticMethod";
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = NO)
+class TestClass11 implements TestIF11 {
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF12.defaultMethod", mod = DEFAULT, declared = YES)
+@MethodDesc(name = "staticMethod", retval = "TestIF2.staticMethod", mod = STATIC, declared = NO)
+interface TestIF12 extends TestIF2 {
+
+    default String defaultMethod() {
+        return "TestIF12.defaultMethod";
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF12.defaultMethod", mod = DEFAULT, declared = NO)
+class TestClass12 implements TestIF12 {
+}
+
+//Diamond Case
+@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = NO)
+interface TestIF1A extends TestIF1 {
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = NO)
+interface TestIF1B extends TestIF1 {
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF1.defaultMethod", mod = DEFAULT, declared = NO)
+class TestClass13 implements TestIF1A, TestIF1B {
+}
+
+//Diamond Override Case
+@MethodDesc(name = "defaultMethod", retval = "TestIF1C.defaultMethod", mod = DEFAULT, declared = YES)
+interface TestIF1C extends TestIF1 {
+
+    default String defaultMethod() {
+        return "TestIF1C.defaultMethod";
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF1D.defaultMethod", mod = DEFAULT, declared = YES)
+interface TestIF1D extends TestIF1 {
+
+    default String defaultMethod() {
+        return "TestIF1D.defaultMethod";
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestClass14.defaultMethod", mod = REGULAR, declared = YES)
+class TestClass14 implements TestIF1C, TestIF1D {
+
+    public String defaultMethod() {
+        return "TestClass14.defaultMethod";
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "", mod = ABSTRACT, declared = YES)
+interface TestIF15 extends TestIF1 {
+
+    String defaultMethod();
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestClass15.defaultMethod", mod = REGULAR, declared = YES)
+class TestClass15 implements TestIF15 {
+
+    public String defaultMethod() {
+        return "TestClass15.defaultMethod";
+    }
+}
+
+interface FuncInterface<T> {
+
+    String test(T t);
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF16.defaultMethod", mod = DEFAULT, declared = YES)
+interface TestIF16 {
+
+    default String defaultMethod() {
+        FuncInterface<Object> fi = o -> o.toString();
+        Object o = "TestIF16.defaultMethod";
+        return fi.test(o);
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF16.defaultMethod", mod = DEFAULT, declared = NO)
+class TestClass16 implements TestIF16 {
+};
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF17.defaultMethod", mod = DEFAULT, declared = YES)
+@MethodDesc(name = "staticMethod", retval = "TestIF17.staticMethod", mod = STATIC, declared = YES)
+interface TestIF17 {
+
+    default String defaultMethod() {
+        return staticMethod().replace("staticMethod", "defaultMethod");
+    }
+
+    public static String staticMethod() {
+        return "TestIF17.staticMethod";
+    }
+}
+
+@MethodDesc(name = "defaultMethod", retval = "TestIF17.defaultMethod", mod = DEFAULT, declared = NO)
+class TestClass17 implements TestIF17 {
+}
+
+@Retention(RetentionPolicy.RUNTIME)
+@Repeatable(MethodDescs.class)
+@interface MethodDesc {
+    String name();
+    String retval();
+    Mod mod();
+    Declared declared();
+}
+
+@Retention(RetentionPolicy.RUNTIME)
+@interface MethodDescs {
+    MethodDesc[] value();
+}
+
+public class DefaultStaticTestData {
+
+    /**
+     * Test data for DefaultStaticInvokeTest The format of inner array is: First
+     * data is the name of the class under test Second data used in test as the
+     * arguments used for the method call.
+     */
+    @DataProvider
+    static Object[][] testClasses() {
+        return new Object[][]{
+            {"TestClass1", null},
+            //{"TestClass2", null}, @ignore due to JDK-8009411
+            {"TestClass3", null},
+            //{"TestClass4", null}, @ignore due to JDK-8009411
+            //{"TestClass5", null}, @ignore due to JDK-8009411
+            //{"TestClass6", null}, @ignore due to JDK-8009411
+            {"TestClass7", "TestIF7.TestClass7"},
+            {"TestClass8", "TestIF8.TestClass8"},
+            {"TestClass9", null},
+            {"TestClass91", null},
+            //{"TestClass11", null}, @ignore due to JDK-8009411
+            //{"TestClass12", null}, @ignore due to JDK-8009411
+            {"TestClass13", null},
+            {"TestClass14", null},
+            {"TestClass15", null},
+            {"TestClass16", null}
+        //{"TestClass17", null} @ignore due to JDK-8009411
+        };
+    }
+
+    /**
+     * Test data for DefaultStaticInvokeTest The format of inner array is: First
+     * data is the name of the interface under test Second data used in test as
+     * the arguments used for the method call.
+     */
+    @DataProvider
+    static Object[][] testInterfaces() {
+        return new Object[][]{
+            {"TestIF1", null},
+            {"TestIF2", null},
+            {"TestIF3", null},
+            {"TestIF4", null},
+            {"TestIF5", null},
+            {"TestIF6", null},
+            {"TestIF7", "TestIF7.TestClass7"},
+            {"TestIF8", "TestIF8.TestClass8"},
+            {"TestIF9", null},
+            {"TestIF10", null},
+            {"TestIF11", null},
+            {"TestIF12", null},
+            {"TestIF1A", null},
+            {"TestIF1B", null},
+            {"TestIF1C", null},
+            {"TestIF1D", null},
+            {"TestIF15", null},
+            {"TestIF16", null},
+            {"TestIF17", null},};
+    }
+
+    @DataProvider
+    static Object[][] testCasesAll() {
+        List<Object[]> result = Lists.newArrayList();
+        result.addAll(Arrays.asList(testClasses()));
+        result.addAll(Arrays.asList(testInterfaces()));
+        return result.toArray(new Object[result.size()][]);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/reflect/DefaultStaticTest/helper/Declared.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+/*
+ * Helper class used for testing default/static method
+ *
+ * @author Yong Lu
+ */
+
+package helper;
+
+public enum Declared {
+    YES,
+    NO
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/reflect/DefaultStaticTest/helper/Mod.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+/*
+ * Helper class used for testing default/static method
+ *
+ * @author Yong Lu
+ */
+
+package helper;
+
+public enum Mod {
+    DEFAULT,
+    STATIC,
+    REGULAR,
+    ABSTRACT
+}
--- a/jdk/test/java/lang/reflect/Method/DefaultMethodModeling.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/lang/reflect/Method/DefaultMethodModeling.java	Wed Jul 05 19:07:19 2017 +0200
@@ -43,7 +43,7 @@
                               SuperIwithDefault.class, SuperIwithDefaultChild.class,
                               Base.class, Combo1.class, Combo2.class,
                               SonSuperIwithDefault.class, DaughterSuperIwithDefault.class, GrandchildSuperIwithDefault.class, D.class,
-                              B.class, C.class
+                              B.class, C.class, B1.class, D1.class
         };
 
         for(Class<?> clazz : classes) {
@@ -202,6 +202,17 @@
     public void quux(){}
 }
 
+class D1 implements SonSuperIwithDefault, DaughterSuperIwithDefault {
+    @ExpectedModel(declaringClass=D1.class)
+    public void foo(){}
+
+    @ExpectedModel(declaringClass=D1.class)
+    public void  baz(){}
+
+    @ExpectedModel(declaringClass=D1.class)
+    public void quux(){}
+}
+
 // -=-=-=-
 
 // What does re-abstraction look like?
@@ -222,3 +233,21 @@
     @ExpectedModel(declaringClass=C.class)
     public void bar(){}
 }
+
+abstract class A1 implements SonSuperIwithDefault {
+    @ExpectedModel(modifiers=PUBLIC|ABSTRACT, declaringClass=A1.class)
+    public abstract void baz();
+
+    @ExpectedModel(modifiers=PUBLIC|ABSTRACT, declaringClass=A1.class)
+    public abstract void foo();
+}
+
+class B1 extends A1 {
+    @ExpectedModel(declaringClass=B1.class)
+    @Override
+    public void foo(){;}
+
+    @ExpectedModel(declaringClass=B1.class)
+    @Override
+    public void baz(){}
+}
--- a/jdk/test/java/lang/reflect/Method/IsDefaultTest.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/lang/reflect/Method/IsDefaultTest.java	Wed Jul 05 19:07:19 2017 +0200
@@ -42,6 +42,12 @@
         classList.add(TestType2.class);
         classList.add(TestType3.class);
         classList.add(TestType4.class);
+        classList.add(TestType2.nestedTestType2.class);
+        classList.add(TestType5.class);
+        classList.add(TestType5.nestedTestType5.class);
+        classList.add(TestType6.class);
+        classList.add(TestType6.nestedTestType6.class);
+        classList.add(TestType7.class);
 
         for(Class<?> clazz: classList) {
             for(Method method: clazz.getDeclaredMethods()) {
@@ -78,11 +84,22 @@
 
     @ExpectedIsDefault(true)
     default void bar() {}; // Default method
+
+    @ExpectedIsDefault(true)
+    default void bar(int i) {}; // Default method
+
+    @ExpectedIsDefault(true)
+    default void bar(String i) {}; // Default method
 }
 
 class TestType2 {
     @ExpectedIsDefault(false)
     void bar() {};
+
+    interface nestedTestType2 {
+        @ExpectedIsDefault(true)
+        default void nestedBar() {};
+   }
 }
 
 class TestType3 implements TestType1 {
@@ -92,6 +109,10 @@
     @ExpectedIsDefault(false)
     @Override
     public void bar() {};
+
+    @ExpectedIsDefault(false)
+    @Override
+    public void bar(int i) {};
 }
 
 @interface TestType4 {
@@ -102,6 +123,51 @@
     String anotherValue() default "";
 }
 
+interface TestType5 {
+    @ExpectedIsDefault(false)
+    abstract void aFoo();
+
+    @ExpectedIsDefault(false)
+    static void sFoo() {};
+
+    @ExpectedIsDefault(true)
+    public default void pBar() {};
+
+    @ExpectedIsDefault(true)
+    public default String sBar() {return "";};
+
+    interface nestedTestType5{
+        @ExpectedIsDefault(false)
+        void nestedFoo();
+
+        @ExpectedIsDefault(true)
+        default void nestedBar() {};
+    }
+}
+
+class TestType6{
+    interface nestedTestType6 {
+        @ExpectedIsDefault(true)
+        default void nestedBar() {};
+
+        @ExpectedIsDefault(false)
+        void nestedFoo();
+   }
+
+    @ExpectedIsDefault(false)
+    void foo(nestedTestType6 n) {}
+}
+
+class TestType7 implements TestType6.nestedTestType6 {
+
+    @ExpectedIsDefault(false)
+    public void nestedFoo() {}
+
+    @ExpectedIsDefault(false)
+    @Override
+    public void nestedBar() {};
+}
+
 @Retention(RetentionPolicy.RUNTIME)
 @interface ExpectedIsDefault {
     boolean value();
--- a/jdk/test/java/math/BigDecimal/CompareToTests.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/math/BigDecimal/CompareToTests.java	Wed Jul 05 19:07:19 2017 +0200
@@ -53,12 +53,29 @@
             {valueOf(5,-1),     valueOf(2),     ONE},
 
             // Boundary and near boundary values
-            {valueOf(Long.MAX_VALUE),   valueOf(Long.MAX_VALUE),        ZERO},
-            {valueOf(Long.MAX_VALUE-1), valueOf(Long.MAX_VALUE),        MINUS_ONE},
-            {valueOf(Long.MIN_VALUE),   valueOf(Long.MAX_VALUE),        MINUS_ONE},
-            {valueOf(Long.MIN_VALUE+1), valueOf(Long.MAX_VALUE),        MINUS_ONE},
-            {valueOf(Long.MIN_VALUE),   valueOf(Long.MIN_VALUE),        ZERO},
-            {valueOf(Long.MIN_VALUE+1), valueOf(Long.MAX_VALUE),        ONE},
+            {valueOf(Long.MAX_VALUE),            valueOf(Long.MAX_VALUE), ZERO},
+            {valueOf(Long.MAX_VALUE).negate(),   valueOf(Long.MAX_VALUE), MINUS_ONE},
+
+            {valueOf(Long.MAX_VALUE-1),          valueOf(Long.MAX_VALUE), MINUS_ONE},
+            {valueOf(Long.MAX_VALUE-1).negate(), valueOf(Long.MAX_VALUE), MINUS_ONE},
+
+            {valueOf(Long.MIN_VALUE),            valueOf(Long.MAX_VALUE), MINUS_ONE},
+            {valueOf(Long.MIN_VALUE).negate(),   valueOf(Long.MAX_VALUE), ONE},
+
+            {valueOf(Long.MIN_VALUE+1),          valueOf(Long.MAX_VALUE), MINUS_ONE},
+            {valueOf(Long.MIN_VALUE+1).negate(), valueOf(Long.MAX_VALUE), ZERO},
+
+            {valueOf(Long.MAX_VALUE),            valueOf(Long.MIN_VALUE), ONE},
+            {valueOf(Long.MAX_VALUE).negate(),   valueOf(Long.MIN_VALUE), ONE},
+
+            {valueOf(Long.MAX_VALUE-1),          valueOf(Long.MIN_VALUE), ONE},
+            {valueOf(Long.MAX_VALUE-1).negate(), valueOf(Long.MIN_VALUE), ONE},
+
+            {valueOf(Long.MIN_VALUE),            valueOf(Long.MIN_VALUE), ZERO},
+            {valueOf(Long.MIN_VALUE).negate(),   valueOf(Long.MIN_VALUE), ONE},
+
+            {valueOf(Long.MIN_VALUE+1),          valueOf(Long.MIN_VALUE), ONE},
+            {valueOf(Long.MIN_VALUE+1).negate(), valueOf(Long.MIN_VALUE), ONE},
         };
 
         for (BigDecimal[] testCase : testCases) {
@@ -69,8 +86,6 @@
             int expected = testCase[2].intValue();
 
             failures += compareToTest(a,        b,         expected);
-            failures += compareToTest(a_negate, b,        -1);
-            failures += compareToTest(a,        b_negate,  1);
             failures += compareToTest(a_negate, b_negate, -expected);
         }
 
@@ -81,11 +96,11 @@
     private static int compareToTest(BigDecimal a, BigDecimal b, int expected) {
         int result = a.compareTo(b);
         int failed = (result==expected) ? 0 : 1;
-        if (result == 1) {
+        if (failed == 1) {
             System.err.println("(" + a + ").compareTo(" + b + ") => " + result +
                                "\n\tExpected " + expected);
         }
-        return result;
+        return failed;
     }
 
     public static void main(String argv[]) {
--- a/jdk/test/java/math/BigInteger/CompareToTests.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/math/BigInteger/CompareToTests.java	Wed Jul 05 19:07:19 2017 +0200
@@ -24,20 +24,23 @@
 /*
  * @test
  * @bug 6473768
- * @summary Tests of BigDecimal.compareTo
+ * @summary Tests of BigInteger.compareTo
  * @author Joseph D. Darcy
  */
 import java.math.*;
-import static java.math.BigDecimal.*;
+import static java.math.BigInteger.*;
 
 public class CompareToTests {
     private static int compareToTests() {
         int failures = 0;
 
-        final BigDecimal MINUS_ONE = BigDecimal.ONE.negate();
+        final BigInteger MINUS_ONE = BigInteger.ONE.negate();
+        final BigInteger TWO_POW_126 = ONE.shiftLeft(126);
+        final BigInteger TWO_POW_127 = ONE.shiftLeft(127);
+        final BigInteger TWO_POW_128 = ONE.shiftLeft(128);
 
         // First operand, second operand, expected compareTo result
-        BigDecimal [][] testCases = {
+        BigInteger [][] testCases = {
             // Basics
             {valueOf(0),        valueOf(0),     ZERO},
             {valueOf(0),        valueOf(1),     MINUS_ONE},
@@ -45,32 +48,56 @@
             {valueOf(2),        valueOf(1),     ONE},
             {valueOf(10),       valueOf(10),    ZERO},
 
-            // Significands would compare differently than scaled value
-            {valueOf(2,1),      valueOf(2),     MINUS_ONE},
-            {valueOf(2,-1),     valueOf(2),     ONE},
-            {valueOf(1,1),      valueOf(2),     MINUS_ONE},
-            {valueOf(1,-1),     valueOf(2),     ONE},
-            {valueOf(5,-1),     valueOf(2),     ONE},
+            // Various relative lengths of internal mag array.
+            {TWO_POW_127,                 TWO_POW_127,                 ZERO},
+            {TWO_POW_127.negate(),        TWO_POW_127,                 MINUS_ONE},
+
+            {TWO_POW_128.or(TWO_POW_126), TWO_POW_128,                 ONE},
+            {TWO_POW_128.or(TWO_POW_126), TWO_POW_128.negate(),        ONE},
+
+            {TWO_POW_128,                 TWO_POW_128.or(TWO_POW_126), MINUS_ONE},
+            {TWO_POW_128.negate(),        TWO_POW_128.or(TWO_POW_126), MINUS_ONE},
+
+            {TWO_POW_127,                 TWO_POW_128,                 MINUS_ONE},
+            {TWO_POW_127.negate(),        TWO_POW_128,                 MINUS_ONE},
+
+            {TWO_POW_128,                 TWO_POW_127,                 ONE},
+            {TWO_POW_128.negate(),        TWO_POW_127,                 MINUS_ONE},
+
+            // Long boundary and near boundary values
+            {valueOf(Long.MAX_VALUE),            valueOf(Long.MAX_VALUE), ZERO},
+            {valueOf(Long.MAX_VALUE).negate(),   valueOf(Long.MAX_VALUE), MINUS_ONE},
 
-            // Boundary and near boundary values
-            {valueOf(Long.MAX_VALUE),   valueOf(Long.MAX_VALUE),        ZERO},
-            {valueOf(Long.MAX_VALUE-1), valueOf(Long.MAX_VALUE),        MINUS_ONE},
-            {valueOf(Long.MIN_VALUE),   valueOf(Long.MAX_VALUE),        MINUS_ONE},
-            {valueOf(Long.MIN_VALUE+1), valueOf(Long.MAX_VALUE),        MINUS_ONE},
-            {valueOf(Long.MIN_VALUE),   valueOf(Long.MIN_VALUE),        ZERO},
-            {valueOf(Long.MIN_VALUE+1), valueOf(Long.MAX_VALUE),        ONE},
+            {valueOf(Long.MAX_VALUE-1),          valueOf(Long.MAX_VALUE), MINUS_ONE},
+            {valueOf(Long.MAX_VALUE-1).negate(), valueOf(Long.MAX_VALUE), MINUS_ONE},
+
+            {valueOf(Long.MIN_VALUE),            valueOf(Long.MAX_VALUE), MINUS_ONE},
+            {valueOf(Long.MIN_VALUE).negate(),   valueOf(Long.MAX_VALUE), ONE},
+
+            {valueOf(Long.MIN_VALUE+1),          valueOf(Long.MAX_VALUE), MINUS_ONE},
+            {valueOf(Long.MIN_VALUE+1).negate(), valueOf(Long.MAX_VALUE), ZERO},
+
+            {valueOf(Long.MAX_VALUE),            valueOf(Long.MIN_VALUE), ONE},
+            {valueOf(Long.MAX_VALUE).negate(),   valueOf(Long.MIN_VALUE), ONE},
+
+            {valueOf(Long.MAX_VALUE-1),          valueOf(Long.MIN_VALUE), ONE},
+            {valueOf(Long.MAX_VALUE-1).negate(), valueOf(Long.MIN_VALUE), ONE},
+
+            {valueOf(Long.MIN_VALUE),            valueOf(Long.MIN_VALUE), ZERO},
+            {valueOf(Long.MIN_VALUE).negate(),   valueOf(Long.MIN_VALUE), ONE},
+
+            {valueOf(Long.MIN_VALUE+1),          valueOf(Long.MIN_VALUE), ONE},
+            {valueOf(Long.MIN_VALUE+1).negate(), valueOf(Long.MIN_VALUE), ONE},
         };
 
-        for (BigDecimal[] testCase : testCases) {
-            BigDecimal a = testCase[0];
-            BigDecimal a_negate = a.negate();
-            BigDecimal b = testCase[1];
-            BigDecimal b_negate = b.negate();
+        for (BigInteger[] testCase : testCases) {
+            BigInteger a = testCase[0];
+            BigInteger a_negate = a.negate();
+            BigInteger b = testCase[1];
+            BigInteger b_negate = b.negate();
             int expected = testCase[2].intValue();
 
             failures += compareToTest(a,        b,         expected);
-            failures += compareToTest(a_negate, b,        -1);
-            failures += compareToTest(a,        b_negate,  1);
             failures += compareToTest(a_negate, b_negate, -expected);
         }
 
@@ -78,14 +105,14 @@
         return failures;
     }
 
-    private static int compareToTest(BigDecimal a, BigDecimal b, int expected) {
+    private static int compareToTest(BigInteger a, BigInteger b, int expected) {
         int result = a.compareTo(b);
         int failed = (result==expected) ? 0 : 1;
-        if (result == 1) {
+        if (failed == 1) {
             System.err.println("(" + a + ").compareTo(" + b + ") => " + result +
                                "\n\tExpected " + expected);
         }
-        return result;
+        return failed;
     }
 
     public static void main(String argv[]) {
--- a/jdk/test/java/net/NetworkInterface/IndexTest.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/net/NetworkInterface/IndexTest.java	Wed Jul 05 19:07:19 2017 +0200
@@ -27,7 +27,10 @@
  */
 
 import java.net.*;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.Enumeration;
+import static java.lang.System.out;
 
 public class IndexTest {
     public static void main(String[] args) throws Exception {
@@ -39,12 +42,17 @@
             if (index >= 0) {
                 NetworkInterface nif2 = NetworkInterface.getByIndex(index);
                 if (! nif.equals(nif2)) {
+                    out.printf("%nExpected interfaces to be the same, but got:%n");
+                    displayInterfaceInformation(nif);
+                    displayInterfaceInformation(nif2);
                     throw new RuntimeException("both interfaces should be equal");
                 }
             }
         }
         try {
             nif = NetworkInterface.getByIndex(-1);
+            out.printf("%ngetByIndex(-1) should have thrown, but instead returned:%n");
+            displayInterfaceInformation(nif);
             throw new RuntimeException("Should have thrown IllegalArgumentException");
         } catch (IllegalArgumentException e) {
             // OK
@@ -52,7 +60,29 @@
         // In all likelyhood, this interface should not exist.
         nif = NetworkInterface.getByIndex(Integer.MAX_VALUE - 1);
         if (nif != null) {
+            out.printf("%ngetByIndex(MAX_VALUE - 1), expected null, got:%n");
+            displayInterfaceInformation(nif);
             throw new RuntimeException("getByIndex() should have returned null");
         }
     }
+
+    static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {
+        out.printf("Display name: %s%n", netint.getDisplayName());
+        out.printf("Name: %s%n", netint.getName());
+        Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
+
+        for (InetAddress inetAddress : Collections.list(inetAddresses))
+            out.printf("InetAddress: %s%n", inetAddress);
+
+        out.printf("Up? %s%n", netint.isUp());
+        out.printf("Loopback? %s%n", netint.isLoopback());
+        out.printf("PointToPoint? %s%n", netint.isPointToPoint());
+        out.printf("Supports multicast? %s%n", netint.supportsMulticast());
+        out.printf("Virtual? %s%n", netint.isVirtual());
+        out.printf("Hardware address: %s%n",
+                    Arrays.toString(netint.getHardwareAddress()));
+        out.printf("MTU: %s%n", netint.getMTU());
+        out.printf("Index: %s%n", netint.getIndex());
+        out.printf("%n");
+     }
 }
--- a/jdk/test/java/nio/file/Files/BytesAndLines.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/nio/file/Files/BytesAndLines.java	Wed Jul 05 19:07:19 2017 +0200
@@ -22,7 +22,7 @@
  */
 
 /* @test
- * @bug 7006126
+ * @bug 7006126 8020669
  * @summary Unit test for methods for Files readAllBytes, readAllLines and
  *     and write methods.
  */
@@ -82,6 +82,16 @@
             write(file, lines, Charset.defaultCharset(), opts);
             throw new RuntimeException("NullPointerException expected");
         } catch (NullPointerException ignore) { }
+
+        // read from procfs
+        if (System.getProperty("os.name").equals("Linux")) {
+            // Refer to the Linux proc(5) man page for details about /proc/self/stat file
+            // procfs reports it to be zero sized, even though data can be read from it
+            String statFile = "/proc/self/stat";
+            Path pathStat = Paths.get(statFile);
+            byte[] data = Files.readAllBytes(pathStat);
+            assertTrue(data.length > 0, "Files.readAllBytes('" + statFile + "') failed to read");
+        }
     }
 
 
@@ -174,6 +184,16 @@
                 throw new RuntimeException("NullPointerException expected");
             } catch (NullPointerException ignore) { }
 
+            // read from procfs
+            if (System.getProperty("os.name").equals("Linux")) {
+                // Refer to the Linux proc(5) man page for details about /proc/self/status file
+                // procfs reports this file to be zero sized, even though data can be read from it
+                String statusFile = "/proc/self/status";
+                Path pathStatus = Paths.get(statusFile);
+                lines = Files.readAllLines(pathStatus, US_ASCII);
+                assertTrue(lines.size() > 0, "Files.readAllLines('" + pathStatus + "') failed to read");
+            }
+
         } finally {
             delete(tmpfile);
         }
@@ -242,7 +262,6 @@
         } finally {
             delete(tmpfile);
         }
-
     }
 
     static void assertTrue(boolean expr, String errmsg) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/Security/AddProvider.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * 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
+ * @bug 8001319
+ * @summary check that SecurityPermission insertProvider permission is enforced
+ *          correctly
+ * @run main/othervm/policy=AddProvider.policy.1 AddProvider 1
+ * @run main/othervm/policy=AddProvider.policy.2 AddProvider 2
+ * @run main/othervm/policy=AddProvider.policy.3 AddProvider 3
+ */
+import java.security.Provider;
+import java.security.Security;
+
+public class AddProvider {
+
+    public static void main(String[] args) throws Exception {
+        boolean legacy = args[0].equals("2");
+        Security.addProvider(new TestProvider("Test1"));
+        Security.insertProviderAt(new TestProvider("Test2"), 1);
+        try {
+            Security.addProvider(new TestProvider("Test3"));
+            if (legacy) {
+                throw new Exception("Expected SecurityException");
+            }
+        } catch (SecurityException se) {
+            if (!legacy) {
+                throw se;
+            }
+        }
+    }
+
+    private static class TestProvider extends Provider {
+        TestProvider(String name) {
+            super(name, 0.0, "Not for use in production systems!");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/Security/AddProvider.policy.1	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,7 @@
+grant codeBase "file:${{java.ext.dirs}}/*" {
+	permission java.security.AllPermission;
+};
+
+grant {
+    permission java.security.SecurityPermission "insertProvider";
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/Security/AddProvider.policy.2	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,8 @@
+grant codeBase "file:${{java.ext.dirs}}/*" {
+	permission java.security.AllPermission;
+};
+
+grant {
+    permission java.security.SecurityPermission "insertProvider.Test1";
+    permission java.security.SecurityPermission "insertProvider.Test2";
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/Security/AddProvider.policy.3	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,7 @@
+grant codeBase "file:${{java.ext.dirs}}/*" {
+	permission java.security.AllPermission;
+};
+
+grant {
+    permission java.security.SecurityPermission "insertProvider.*";
+};
--- a/jdk/test/java/util/Formatter/Basic-X.java.template	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/util/Formatter/Basic-X.java.template	Wed Jul 05 19:07:19 2017 +0200
@@ -1319,10 +1319,8 @@
              Math.nextDown(DoubleConsts.MIN_NORMAL));
         test("%.1a", "0x1.0p-1022",
              Math.nextDown(DoubleConsts.MIN_NORMAL));
-        test("%.11a", "0x1.ffffffffffep-1023",
-             Double.parseDouble("0x0.fffffffffffp-1022"));
-        test("%.1a", "0x1.0p-1022",
-             Double.parseDouble("0x0.fffffffffffp-1022"));
+        test("%.11a", "0x1.ffffffffffep-1023", 0x0.fffffffffffp-1022);
+        test("%.1a", "0x1.0p-1022", 0x0.fffffffffffp-1022);
         test("%.30a", "0x0.000000000000100000000000000000p-1022", Double.MIN_VALUE);
         test("%.13a", "0x0.0000000000001p-1022", Double.MIN_VALUE);
         test("%.11a", "0x1.00000000000p-1074", Double.MIN_VALUE);
@@ -1336,19 +1334,50 @@
         test("%.13a", "0x1.fffffffffffffp1023", Double.MAX_VALUE);
         test("%.11a", "0x1.00000000000p1024", Double.MAX_VALUE);
         test("%.1a", "0x1.0p1024", Double.MAX_VALUE);
-        test("%.11a", "0x1.18000000000p0", Double.parseDouble("0x1.18p0"));
-        test("%.1a", "0x1.2p0", Double.parseDouble("0x1.18p0"));
+        test("%.11a", "0x1.18000000000p0", 0x1.18p0);
+        test("%.1a", "0x1.2p0", 0x1.18p0);
+
+        test("%.11a", "0x1.18000000000p0", 0x1.180000000001p0);
+        test("%.1a", "0x1.2p0", 0x1.180000000001p0);
+        test("%.11a", "0x1.28000000000p0", 0x1.28p0);
+        test("%.1a", "0x1.2p0", 0x1.28p0);
+
+        test("%.11a", "0x1.28000000000p0", 0x1.280000000001p0);
+        test("%.1a", "0x1.3p0", 0x1.280000000001p0);
+
+        test("%a", "0x0.123p-1022", 0x0.123p-1022);
+        test("%1.3a", "0x1.230p-1026", 0x0.123p-1022);
+        test("%1.12a", "0x1.230000000000p-1026", 0x0.123p-1022);
+        test("%1.15a", "0x0.123000000000000p-1022", 0x0.123p-1022);
+        test("%1.5a", "0x1.00000p-1074", 0x0.0000000000001p-1022);
+        test("%1.7a", "0x1.0000000p-1022", 0x0.fffffffffffffp-1022);
 
-        test("%.11a", "0x1.18000000000p0",
-             Double.parseDouble("0x1.180000000001p0"));
-        test("%.1a", "0x1.2p0",
-             Double.parseDouble("0x1.180000000001p0"));
-        test("%.11a", "0x1.28000000000p0", Double.parseDouble("0x1.28p0"));
-        test("%.1a", "0x1.2p0", Double.parseDouble("0x1.28p0"));
+        test("%1.6a", "0x1.230000p-1026", 0x0.123000057p-1022);
+        test("%1.7a", "0x1.2300005p-1026", 0x0.123000057p-1022);
+        test("%1.8a", "0x1.23000057p-1026", 0x0.123000057p-1022);
+        test("%1.9a", "0x1.230000570p-1026", 0x0.123000057p-1022);
+
+        test("%1.6a", "0x1.230000p-1026", 0x0.123000058p-1022);
+        test("%1.7a", "0x1.2300006p-1026", 0x0.123000058p-1022);
+        test("%1.8a", "0x1.23000058p-1026", 0x0.123000058p-1022);
+        test("%1.9a", "0x1.230000580p-1026", 0x0.123000058p-1022);
 
-        test("%.11a", "0x1.28000000000p0",
-             Double.parseDouble("0x1.280000000001p0"));
-        test("%.1a", "0x1.3p0", Double.parseDouble("0x1.280000000001p0"));
+        test("%1.6a", "0x1.230000p-1026", 0x0.123000059p-1022);
+        test("%1.7a", "0x1.2300006p-1026", 0x0.123000059p-1022);
+        test("%1.8a", "0x1.23000059p-1026", 0x0.123000059p-1022);
+        test("%1.9a", "0x1.230000590p-1026", 0x0.123000059p-1022);
+
+        test("%1.4a", "0x1.0000p-1022", Math.nextDown(Double.MIN_NORMAL));
+
+        test("%a", "0x1.fffffffffffffp1023", Double.MAX_VALUE);
+        test("%1.1a", "0x1.0p1024", Double.MAX_VALUE);
+        test("%1.2a", "0x1.00p1024", Double.MAX_VALUE);
+        test("%1.6a", "0x1.000000p1024", Double.MAX_VALUE);
+        test("%1.9a", "0x1.000000000p1024", Double.MAX_VALUE);
+        test("%1.11a", "0x1.00000000000p1024", Double.MAX_VALUE);
+        test("%1.12a", "0x1.000000000000p1024", Double.MAX_VALUE);
+        test("%1.13a", "0x1.fffffffffffffp1023", Double.MAX_VALUE);
+
 #end[double]
 
         //---------------------------------------------------------------------
--- a/jdk/test/java/util/Formatter/Basic.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/util/Formatter/Basic.java	Wed Jul 05 19:07:19 2017 +0200
@@ -25,7 +25,7 @@
  * @summary Unit test for formatter
  * @bug 4906370 4962433 4973103 4989961 5005818 5031150 4970931 4989491 5002937
  *      5005104 5007745 5061412 5055180 5066788 5088703 6317248 6318369 6320122
- *      6344623 6369500 6534606 6282094 6286592 6476425 5063507 6469160
+ *      6344623 6369500 6534606 6282094 6286592 6476425 5063507 6469160 6476168
  *
  * @run shell/timeout=240 Basic.sh
  */
--- a/jdk/test/java/util/Formatter/BasicDouble.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/util/Formatter/BasicDouble.java	Wed Jul 05 19:07:19 2017 +0200
@@ -1319,10 +1319,8 @@
              Math.nextDown(DoubleConsts.MIN_NORMAL));
         test("%.1a", "0x1.0p-1022",
              Math.nextDown(DoubleConsts.MIN_NORMAL));
-        test("%.11a", "0x1.ffffffffffep-1023",
-             Double.parseDouble("0x0.fffffffffffp-1022"));
-        test("%.1a", "0x1.0p-1022",
-             Double.parseDouble("0x0.fffffffffffp-1022"));
+        test("%.11a", "0x1.ffffffffffep-1023", 0x0.fffffffffffp-1022);
+        test("%.1a", "0x1.0p-1022", 0x0.fffffffffffp-1022);
         test("%.30a", "0x0.000000000000100000000000000000p-1022", Double.MIN_VALUE);
         test("%.13a", "0x0.0000000000001p-1022", Double.MIN_VALUE);
         test("%.11a", "0x1.00000000000p-1074", Double.MIN_VALUE);
@@ -1336,19 +1334,50 @@
         test("%.13a", "0x1.fffffffffffffp1023", Double.MAX_VALUE);
         test("%.11a", "0x1.00000000000p1024", Double.MAX_VALUE);
         test("%.1a", "0x1.0p1024", Double.MAX_VALUE);
-        test("%.11a", "0x1.18000000000p0", Double.parseDouble("0x1.18p0"));
-        test("%.1a", "0x1.2p0", Double.parseDouble("0x1.18p0"));
-
-        test("%.11a", "0x1.18000000000p0",
-             Double.parseDouble("0x1.180000000001p0"));
-        test("%.1a", "0x1.2p0",
-             Double.parseDouble("0x1.180000000001p0"));
-        test("%.11a", "0x1.28000000000p0", Double.parseDouble("0x1.28p0"));
-        test("%.1a", "0x1.2p0", Double.parseDouble("0x1.28p0"));
-
-        test("%.11a", "0x1.28000000000p0",
-             Double.parseDouble("0x1.280000000001p0"));
-        test("%.1a", "0x1.3p0", Double.parseDouble("0x1.280000000001p0"));
+        test("%.11a", "0x1.18000000000p0", 0x1.18p0);
+        test("%.1a", "0x1.2p0", 0x1.18p0);
+
+        test("%.11a", "0x1.18000000000p0", 0x1.180000000001p0);
+        test("%.1a", "0x1.2p0", 0x1.180000000001p0);
+        test("%.11a", "0x1.28000000000p0", 0x1.28p0);
+        test("%.1a", "0x1.2p0", 0x1.28p0);
+
+        test("%.11a", "0x1.28000000000p0", 0x1.280000000001p0);
+        test("%.1a", "0x1.3p0", 0x1.280000000001p0);
+
+        test("%a", "0x0.123p-1022", 0x0.123p-1022);
+        test("%1.3a", "0x1.230p-1026", 0x0.123p-1022);
+        test("%1.12a", "0x1.230000000000p-1026", 0x0.123p-1022);
+        test("%1.15a", "0x0.123000000000000p-1022", 0x0.123p-1022);
+        test("%1.5a", "0x1.00000p-1074", 0x0.0000000000001p-1022);
+        test("%1.7a", "0x1.0000000p-1022", 0x0.fffffffffffffp-1022);
+
+        test("%1.6a", "0x1.230000p-1026", 0x0.123000057p-1022);
+        test("%1.7a", "0x1.2300005p-1026", 0x0.123000057p-1022);
+        test("%1.8a", "0x1.23000057p-1026", 0x0.123000057p-1022);
+        test("%1.9a", "0x1.230000570p-1026", 0x0.123000057p-1022);
+
+        test("%1.6a", "0x1.230000p-1026", 0x0.123000058p-1022);
+        test("%1.7a", "0x1.2300006p-1026", 0x0.123000058p-1022);
+        test("%1.8a", "0x1.23000058p-1026", 0x0.123000058p-1022);
+        test("%1.9a", "0x1.230000580p-1026", 0x0.123000058p-1022);
+
+        test("%1.6a", "0x1.230000p-1026", 0x0.123000059p-1022);
+        test("%1.7a", "0x1.2300006p-1026", 0x0.123000059p-1022);
+        test("%1.8a", "0x1.23000059p-1026", 0x0.123000059p-1022);
+        test("%1.9a", "0x1.230000590p-1026", 0x0.123000059p-1022);
+
+        test("%1.4a", "0x1.0000p-1022", Math.nextDown(Double.MIN_NORMAL));
+
+        test("%a", "0x1.fffffffffffffp1023", Double.MAX_VALUE);
+        test("%1.1a", "0x1.0p1024", Double.MAX_VALUE);
+        test("%1.2a", "0x1.00p1024", Double.MAX_VALUE);
+        test("%1.6a", "0x1.000000p1024", Double.MAX_VALUE);
+        test("%1.9a", "0x1.000000000p1024", Double.MAX_VALUE);
+        test("%1.11a", "0x1.00000000000p1024", Double.MAX_VALUE);
+        test("%1.12a", "0x1.000000000000p1024", Double.MAX_VALUE);
+        test("%1.13a", "0x1.fffffffffffffp1023", Double.MAX_VALUE);
+
 
 
         //---------------------------------------------------------------------
--- a/jdk/test/java/util/Spliterator/SpliteratorTraversingAndSplittingTest.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/util/Spliterator/SpliteratorTraversingAndSplittingTest.java	Wed Jul 05 19:07:19 2017 +0200
@@ -25,6 +25,7 @@
  * @test
  * @summary Spliterator traversing and splitting tests
  * @run testng SpliteratorTraversingAndSplittingTest
+ * @bug 8020016
  */
 
 import org.testng.annotations.DataProvider;
@@ -386,11 +387,23 @@
 
             db.addCollection(CopyOnWriteArraySet::new);
 
-            if (size == 1) {
+            if (size == 0) {
+                db.addCollection(c -> Collections.<Integer>emptySet());
+                db.addList(c -> Collections.<Integer>emptyList());
+            }
+            else if (size == 1) {
                 db.addCollection(c -> Collections.singleton(exp.get(0)));
                 db.addCollection(c -> Collections.singletonList(exp.get(0)));
             }
 
+            {
+                Integer[] ai = new Integer[size];
+                Arrays.fill(ai, 1);
+                db.add(String.format("Collections.nCopies(%d, 1)", exp.size()),
+                       Arrays.asList(ai),
+                       () -> Collections.nCopies(exp.size(), 1).spliterator());
+            }
+
             // Collections.synchronized/unmodifiable/checked wrappers
             db.addCollection(Collections::unmodifiableCollection);
             db.addCollection(c -> Collections.unmodifiableSet(new HashSet<>(c)));
@@ -454,6 +467,13 @@
             db.addMap(ConcurrentHashMap::new);
 
             db.addMap(ConcurrentSkipListMap::new);
+
+            if (size == 0) {
+                db.addMap(m -> Collections.<Integer, Integer>emptyMap());
+            }
+            else if (size == 1) {
+                db.addMap(m -> Collections.singletonMap(exp.get(0), exp.get(0)));
+            }
         }
 
         return spliteratorDataProvider = data.toArray(new Object[0][]);
--- a/jdk/test/java/util/concurrent/CompletableFuture/Basic.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/util/concurrent/CompletableFuture/Basic.java	Wed Jul 05 19:07:19 2017 +0200
@@ -34,6 +34,8 @@
 /*
  * @test
  * @bug 8005696
+ * @run main Basic
+ * @run main/othervm -Djava.util.concurrent.ForkJoinPool.common.parallelism=0 Basic
  * @summary Basic tests for CompletableFuture
  * @author Chris Hegarty
  */
--- a/jdk/test/java/util/stream/bootlib/java/util/stream/SpliteratorTestHelper.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/util/stream/bootlib/java/util/stream/SpliteratorTestHelper.java	Wed Jul 05 19:07:19 2017 +0200
@@ -22,6 +22,8 @@
  */
 package java.util.stream;
 
+import org.testng.annotations.Test;
+
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -154,6 +156,7 @@
 
         Collection<T> exp = Collections.unmodifiableList(fromForEach);
 
+        testNullPointerException(supplier);
         testForEach(exp, supplier, boxingAdapter, asserter);
         testTryAdvance(exp, supplier, boxingAdapter, asserter);
         testMixedTryAdvanceForEach(exp, supplier, boxingAdapter, asserter);
@@ -166,6 +169,31 @@
 
     //
 
+    private static <T, S extends Spliterator<T>> void testNullPointerException(Supplier<S> s) {
+        S sp = s.get();
+        // Have to check instances and use casts to avoid tripwire messages and
+        // directly test the primitive methods
+        if (sp instanceof Spliterator.OfInt) {
+            Spliterator.OfInt psp = (Spliterator.OfInt) sp;
+            executeAndCatch(NullPointerException.class, () -> psp.forEachRemaining((IntConsumer) null));
+            executeAndCatch(NullPointerException.class, () -> psp.tryAdvance((IntConsumer) null));
+        }
+        else if (sp instanceof Spliterator.OfLong) {
+            Spliterator.OfLong psp = (Spliterator.OfLong) sp;
+            executeAndCatch(NullPointerException.class, () -> psp.forEachRemaining((LongConsumer) null));
+            executeAndCatch(NullPointerException.class, () -> psp.tryAdvance((LongConsumer) null));
+        }
+        else if (sp instanceof Spliterator.OfDouble) {
+            Spliterator.OfDouble psp = (Spliterator.OfDouble) sp;
+            executeAndCatch(NullPointerException.class, () -> psp.forEachRemaining((DoubleConsumer) null));
+            executeAndCatch(NullPointerException.class, () -> psp.tryAdvance((DoubleConsumer) null));
+        }
+        else {
+            executeAndCatch(NullPointerException.class, () -> sp.forEachRemaining(null));
+            executeAndCatch(NullPointerException.class, () -> sp.tryAdvance(null));
+        }
+    }
+
     private static <T, S extends Spliterator<T>> void testForEach(
             Collection<T> exp,
             Supplier<S> supplier,
@@ -573,6 +601,23 @@
         }
     }
 
+    private static void executeAndCatch(Class<? extends Exception> expected, Runnable r) {
+        Exception caught = null;
+        try {
+            r.run();
+        }
+        catch (Exception e) {
+            caught = e;
+        }
+
+        assertNotNull(caught,
+                      String.format("No Exception was thrown, expected an Exception of %s to be thrown",
+                                    expected.getName()));
+        assertTrue(expected.isInstance(caught),
+                   String.format("Exception thrown %s not an instance of %s",
+                                 caught.getClass().getName(), expected.getName()));
+    }
+
     static<U> void mixedTraverseAndSplit(Consumer<U> b, Spliterator<U> splTop) {
         Spliterator<U> spl1, spl2, spl3;
         splTop.tryAdvance(b);
--- a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/FillableStringTest.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/FillableStringTest.java	Wed Jul 05 19:07:19 2017 +0200
@@ -40,17 +40,17 @@
     }
 
     public void testStringBuilder() {
-        String s = generate().collect(Collectors.toStringBuilder()).toString();
+        String s = generate().collect(Collectors.joining());
         assertEquals(s, "THREEFOURFIVE");
     }
 
     public void testStringBuffer() {
-        String s = generate().collect(Collectors.toStringBuilder()).toString();
+        String s = generate().collect(Collectors.joining());
         assertEquals(s, "THREEFOURFIVE");
     }
 
     public void testStringJoiner() {
-        String s = generate().collect(Collectors.toStringJoiner("-")).toString();
+        String s = generate().collect(Collectors.joining("-"));
         assertEquals(s, "THREE-FOUR-FIVE");
     }
 }
--- a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/GroupByOpTest.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/GroupByOpTest.java	Wed Jul 05 19:07:19 2017 +0200
@@ -36,7 +36,6 @@
 import java.util.stream.LambdaTestHelpers;
 import java.util.stream.OpTestCase;
 import java.util.stream.Stream;
-import java.util.stream.StreamOpFlagTestHelper;
 import java.util.stream.StreamTestDataProvider;
 import java.util.stream.TestData;
 
@@ -59,13 +58,14 @@
 public class GroupByOpTest extends OpTestCase {
 
     public void testBypassCollect() {
-        Collector<Integer, Map<Boolean, List<Integer>>> collector
-                = Collectors.groupingBy(LambdaTestHelpers.forPredicate(pEven, true, false));
+        @SuppressWarnings("unchecked")
+        Collector<Integer, Map<Boolean, List<Integer>>, Map<Boolean, List<Integer>>> collector
+                = (Collector<Integer, Map<Boolean, List<Integer>>, Map<Boolean, List<Integer>>>) Collectors.groupingBy(LambdaTestHelpers.forPredicate(pEven, true, false));
 
-        Map<Boolean, List<Integer>> m = collector.resultSupplier().get();
+        Map<Boolean, List<Integer>> m = collector.supplier().get();
         int[] ints = countTo(10).stream().mapToInt(e -> (int) e).toArray();
         for (int i : ints)
-            m = collector.accumulator().apply(m, i);
+            collector.accumulator().accept(m, i);
 
         assertEquals(2, m.keySet().size());
         for(Collection<Integer> group : m.values()) {
@@ -130,7 +130,7 @@
         //     - Total number of values equals size of data
 
         for (MapperData<Integer, ?> md : getMapperData(data)) {
-            Collector<Integer, Map<Object, List<Integer>>> tab = Collectors.groupingBy(md.m);
+            Collector<Integer, ?, Map<Object, List<Integer>>> tab = Collectors.groupingBy(md.m);
             Map<Object, List<Integer>> result =
                     withData(data)
                     .terminal(s -> s, s -> s.collect(tab))
--- a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/SummaryStatisticsTest.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/SummaryStatisticsTest.java	Wed Jul 05 19:07:19 2017 +0200
@@ -43,9 +43,9 @@
 public class SummaryStatisticsTest extends OpTestCase {
     public void testIntStatistics() {
         List<IntSummaryStatistics> instances = new ArrayList<>();
-        instances.add(countTo(1000).stream().collect(Collectors.toIntSummaryStatistics(i -> i)));
+        instances.add(countTo(1000).stream().collect(Collectors.summarizingInt(i -> i)));
         instances.add(countTo(1000).stream().mapToInt(i -> i).summaryStatistics());
-        instances.add(countTo(1000).parallelStream().collect(Collectors.toIntSummaryStatistics(i -> i)));
+        instances.add(countTo(1000).parallelStream().collect(Collectors.summarizingInt(i -> i)));
         instances.add(countTo(1000).parallelStream().mapToInt(i -> i).summaryStatistics());
 
         for (IntSummaryStatistics stats : instances) {
@@ -58,9 +58,9 @@
 
     public void testLongStatistics() {
         List<LongSummaryStatistics> instances = new ArrayList<>();
-        instances.add(countTo(1000).stream().collect(Collectors.toLongSummaryStatistics(i -> i)));
+        instances.add(countTo(1000).stream().collect(Collectors.summarizingLong(i -> i)));
         instances.add(countTo(1000).stream().mapToLong(i -> i).summaryStatistics());
-        instances.add(countTo(1000).parallelStream().collect(Collectors.toLongSummaryStatistics(i -> i)));
+        instances.add(countTo(1000).parallelStream().collect(Collectors.summarizingLong(i -> i)));
         instances.add(countTo(1000).parallelStream().mapToLong(i -> i).summaryStatistics());
 
         for (LongSummaryStatistics stats : instances) {
@@ -73,9 +73,9 @@
 
     public void testDoubleStatistics() {
         List<DoubleSummaryStatistics> instances = new ArrayList<>();
-        instances.add(countTo(1000).stream().collect(Collectors.toDoubleSummaryStatistics(i -> i)));
+        instances.add(countTo(1000).stream().collect(Collectors.summarizingDouble(i -> i)));
         instances.add(countTo(1000).stream().mapToDouble(i -> i).summaryStatistics());
-        instances.add(countTo(1000).parallelStream().collect(Collectors.toDoubleSummaryStatistics(i -> i)));
+        instances.add(countTo(1000).parallelStream().collect(Collectors.summarizingDouble(i -> i)));
         instances.add(countTo(1000).parallelStream().mapToDouble(i -> i).summaryStatistics());
 
         for (DoubleSummaryStatistics stats : instances) {
--- a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/TabulatorsTest.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/TabulatorsTest.java	Wed Jul 05 19:07:19 2017 +0200
@@ -23,13 +23,17 @@
 package org.openjdk.tests.java.util.stream;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
+import java.util.StringJoiner;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentSkipListMap;
@@ -53,7 +57,10 @@
 import static java.util.stream.Collectors.partitioningBy;
 import static java.util.stream.Collectors.reducing;
 import static java.util.stream.Collectors.toCollection;
+import static java.util.stream.Collectors.toConcurrentMap;
 import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toMap;
+import static java.util.stream.Collectors.toSet;
 import static java.util.stream.LambdaTestHelpers.assertContents;
 import static java.util.stream.LambdaTestHelpers.assertContentsUnordered;
 import static java.util.stream.LambdaTestHelpers.mDoubler;
@@ -65,16 +72,6 @@
  */
 @SuppressWarnings({"rawtypes", "unchecked"})
 public class TabulatorsTest extends OpTestCase {
-    // There are 8 versions of groupingBy:
-    //   groupingBy: { map supplier, not } x { downstream collector, not } x { concurrent, not }
-    // There are 2 versions of partition: { map supplier, not }
-    // There are 4 versions of toMap
-    //   mappedTo(function, mapSupplier?, mergeFunction?)
-    // Each variety needs at least one test
-    // Plus a variety of multi-level tests (groupBy(..., partition), partition(..., groupBy))
-    // Plus negative tests for mapping to null
-    // Each test should be matched by a nest of asserters (see TabulationAssertion...)
-
 
     private static abstract class TabulationAssertion<T, U> {
         abstract void assertValue(U value,
@@ -101,7 +98,7 @@
                          boolean ordered) throws ReflectiveOperationException {
             if (!clazz.isAssignableFrom(map.getClass()))
                 fail(String.format("Class mismatch in GroupedMapAssertion: %s, %s", clazz, map.getClass()));
-            assertContentsUnordered(map.keySet(), source.get().map(classifier).collect(Collectors.toSet()));
+            assertContentsUnordered(map.keySet(), source.get().map(classifier).collect(toSet()));
             for (Map.Entry<K, ? extends V> entry : map.entrySet()) {
                 K key = entry.getKey();
                 downstream.assertValue(entry.getValue(),
@@ -111,6 +108,39 @@
         }
     }
 
+    static class ToMapAssertion<T, K, V, M extends Map<K,V>> extends TabulationAssertion<T, M> {
+        private final Class<? extends Map> clazz;
+        private final Function<T, K> keyFn;
+        private final Function<T, V> valueFn;
+        private final BinaryOperator<V> mergeFn;
+
+        ToMapAssertion(Function<T, K> keyFn,
+                       Function<T, V> valueFn,
+                       BinaryOperator<V> mergeFn,
+                       Class<? extends Map> clazz) {
+            this.clazz = clazz;
+            this.keyFn = keyFn;
+            this.valueFn = valueFn;
+            this.mergeFn = mergeFn;
+        }
+
+        @Override
+        void assertValue(M map, Supplier<Stream<T>> source, boolean ordered) throws ReflectiveOperationException {
+            Set<K> uniqueKeys = source.get().map(keyFn).collect(toSet());
+            assertTrue(clazz.isAssignableFrom(map.getClass()));
+            assertEquals(uniqueKeys, map.keySet());
+            source.get().forEach(t -> {
+                K key = keyFn.apply(t);
+                V v = source.get()
+                            .filter(e -> key.equals(keyFn.apply(e)))
+                            .map(valueFn)
+                            .reduce(mergeFn)
+                            .get();
+                assertEquals(map.get(key), v);
+            });
+        }
+    }
+
     static class PartitionAssertion<T, D> extends TabulationAssertion<T, Map<Boolean,D>> {
         private final Predicate<T> predicate;
         private final TabulationAssertion<T,D> downstream;
@@ -204,7 +234,7 @@
 
     private <T> ResultAsserter<T> mapTabulationAsserter(boolean ordered) {
         return (act, exp, ord, par) -> {
-            if (par & (!ordered || !ord)) {
+            if (par && (!ordered || !ord)) {
                 TabulatorsTest.nestedMapEqualityAssertion(act, exp);
             }
             else {
@@ -215,7 +245,7 @@
 
     private<T, M extends Map>
     void exerciseMapTabulation(TestData<T, Stream<T>> data,
-                               Collector<T, ? extends M> collector,
+                               Collector<T, ?, ? extends M> collector,
                                TabulationAssertion<T, M> assertion)
             throws ReflectiveOperationException {
         boolean ordered = !collector.characteristics().contains(Collector.Characteristics.UNORDERED);
@@ -248,6 +278,172 @@
             assertEquals(o1, o2);
     }
 
+    private<T, R> void assertCollect(TestData.OfRef<T> data,
+                                     Collector<T, ?, R> collector,
+                                     Function<Stream<T>, R> streamReduction) {
+        R check = streamReduction.apply(data.stream());
+        withData(data).terminal(s -> s.collect(collector)).expectedResult(check).exercise();
+    }
+
+    @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
+    public void testReduce(String name, TestData.OfRef<Integer> data) throws ReflectiveOperationException {
+        assertCollect(data, Collectors.reducing(0, Integer::sum),
+                      s -> s.reduce(0, Integer::sum));
+        assertCollect(data, Collectors.reducing(Integer.MAX_VALUE, Integer::min),
+                      s -> s.min(Integer::compare).orElse(Integer.MAX_VALUE));
+        assertCollect(data, Collectors.reducing(Integer.MIN_VALUE, Integer::max),
+                      s -> s.max(Integer::compare).orElse(Integer.MIN_VALUE));
+
+        assertCollect(data, Collectors.reducing(Integer::sum),
+                      s -> s.reduce(Integer::sum));
+        assertCollect(data, Collectors.minBy(Comparator.naturalOrder()),
+                      s -> s.min(Integer::compare));
+        assertCollect(data, Collectors.maxBy(Comparator.naturalOrder()),
+                      s -> s.max(Integer::compare));
+
+        assertCollect(data, Collectors.reducing(0, x -> x*2, Integer::sum),
+                      s -> s.map(x -> x*2).reduce(0, Integer::sum));
+
+        assertCollect(data, Collectors.summingLong(x -> x * 2L),
+                      s -> s.map(x -> x*2L).reduce(0L, Long::sum));
+        assertCollect(data, Collectors.summingInt(x -> x * 2),
+                      s -> s.map(x -> x*2).reduce(0, Integer::sum));
+        assertCollect(data, Collectors.summingDouble(x -> x * 2.0d),
+                      s -> s.map(x -> x * 2.0d).reduce(0.0d, Double::sum));
+
+        assertCollect(data, Collectors.averagingInt(x -> x * 2),
+                      s -> s.mapToInt(x -> x * 2).average().orElse(0));
+        assertCollect(data, Collectors.averagingLong(x -> x * 2),
+                      s -> s.mapToLong(x -> x * 2).average().orElse(0));
+        assertCollect(data, Collectors.averagingDouble(x -> x * 2),
+                      s -> s.mapToDouble(x -> x * 2).average().orElse(0));
+
+        // Test explicit Collector.of
+        Collector<Integer, long[], Double> avg2xint = Collector.of(() -> new long[2],
+                                                                   (a, b) -> {
+                                                                       a[0] += b * 2;
+                                                                       a[1]++;
+                                                                   },
+                                                                   (a, b) -> {
+                                                                       a[0] += b[0];
+                                                                       a[1] += b[1];
+                                                                       return a;
+                                                                   },
+                                                                   a -> a[1] == 0 ? 0.0d : (double) a[0] / a[1]);
+        assertCollect(data, avg2xint,
+                      s -> s.mapToInt(x -> x * 2).average().orElse(0));
+    }
+
+    @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
+    public void testJoin(String name, TestData.OfRef<Integer> data) throws ReflectiveOperationException {
+        withData(data)
+                .terminal(s -> s.map(Object::toString).collect(Collectors.joining()))
+                .expectedResult(join(data, ""))
+                .exercise();
+
+        Collector<String, StringBuilder, String> likeJoining = Collector.of(StringBuilder::new, StringBuilder::append, (sb1, sb2) -> sb1.append(sb2.toString()), StringBuilder::toString);
+        withData(data)
+                .terminal(s -> s.map(Object::toString).collect(likeJoining))
+                .expectedResult(join(data, ""))
+                .exercise();
+
+        withData(data)
+                .terminal(s -> s.map(Object::toString).collect(Collectors.joining(",")))
+                .expectedResult(join(data, ","))
+                .exercise();
+
+        withData(data)
+                .terminal(s -> s.map(Object::toString).collect(Collectors.joining(",", "[", "]")))
+                .expectedResult("[" + join(data, ",") + "]")
+                .exercise();
+
+        withData(data)
+                .terminal(s -> s.map(Object::toString)
+                                .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
+                                .toString())
+                .expectedResult(join(data, ""))
+                .exercise();
+
+        withData(data)
+                .terminal(s -> s.map(Object::toString)
+                                .collect(() -> new StringJoiner(","),
+                                         (sj, cs) -> sj.add(cs),
+                                         (j1, j2) -> j1.merge(j2))
+                                .toString())
+                .expectedResult(join(data, ","))
+                .exercise();
+
+        withData(data)
+                .terminal(s -> s.map(Object::toString)
+                                .collect(() -> new StringJoiner(",", "[", "]"),
+                                         (sj, cs) -> sj.add(cs),
+                                         (j1, j2) -> j1.merge(j2))
+                                .toString())
+                .expectedResult("[" + join(data, ",") + "]")
+                .exercise();
+    }
+
+    private<T> String join(TestData.OfRef<T> data, String delim) {
+        StringBuilder sb = new StringBuilder();
+        boolean first = true;
+        for (T i : data) {
+            if (!first)
+                sb.append(delim);
+            sb.append(i.toString());
+            first = false;
+        }
+        return sb.toString();
+    }
+
+    @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
+    public void testSimpleToMap(String name, TestData.OfRef<Integer> data) throws ReflectiveOperationException {
+        Function<Integer, Integer> keyFn = i -> i * 2;
+        Function<Integer, Integer> valueFn = i -> i * 4;
+
+        List<Integer> dataAsList = Arrays.asList(data.stream().toArray(Integer[]::new));
+        Set<Integer> dataAsSet = new HashSet<>(dataAsList);
+
+        BinaryOperator<Integer> sum = Integer::sum;
+        for (BinaryOperator<Integer> op : Arrays.asList((u, v) -> u,
+                                                        (u, v) -> v,
+                                                        sum)) {
+            try {
+                exerciseMapTabulation(data, toMap(keyFn, valueFn),
+                                      new ToMapAssertion<>(keyFn, valueFn, op, HashMap.class));
+                if (dataAsList.size() != dataAsSet.size())
+                    fail("Expected ISE on input with duplicates");
+            }
+            catch (IllegalStateException e) {
+                if (dataAsList.size() == dataAsSet.size())
+                    fail("Expected no ISE on input without duplicates");
+            }
+
+            exerciseMapTabulation(data, toMap(keyFn, valueFn, op),
+                                  new ToMapAssertion<>(keyFn, valueFn, op, HashMap.class));
+
+            exerciseMapTabulation(data, toMap(keyFn, valueFn, op, TreeMap::new),
+                                  new ToMapAssertion<>(keyFn, valueFn, op, TreeMap.class));
+        }
+
+        // For concurrent maps, only use commutative merge functions
+        try {
+            exerciseMapTabulation(data, toConcurrentMap(keyFn, valueFn),
+                                  new ToMapAssertion<>(keyFn, valueFn, sum, ConcurrentHashMap.class));
+            if (dataAsList.size() != dataAsSet.size())
+                fail("Expected ISE on input with duplicates");
+        }
+        catch (IllegalStateException e) {
+            if (dataAsList.size() == dataAsSet.size())
+                fail("Expected no ISE on input without duplicates");
+        }
+
+        exerciseMapTabulation(data, toConcurrentMap(keyFn, valueFn, sum),
+                              new ToMapAssertion<>(keyFn, valueFn, sum, ConcurrentHashMap.class));
+
+        exerciseMapTabulation(data, toConcurrentMap(keyFn, valueFn, sum, ConcurrentSkipListMap::new),
+                              new ToMapAssertion<>(keyFn, valueFn, sum, ConcurrentSkipListMap.class));
+    }
+
     @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
     public void testSimpleGroupBy(String name, TestData.OfRef<Integer> data) throws ReflectiveOperationException {
         Function<Integer, Integer> classifier = i -> i % 3;
--- a/jdk/test/javax/print/attribute/autosense/PrintAutoSenseData.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/javax/print/attribute/autosense/PrintAutoSenseData.java	Wed Jul 05 19:07:19 2017 +0200
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 4468109
+ * @bug 4468109 8021583
  * @summary Test for printing AUTOSENSE DocFlavor.  No exception should be thrown.
  * @run main PrintAutoSenseData
 */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/print/attribute/autosense/sample.txt	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,1 @@
+This is a program for testing AutoSense data.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JTabbedPane/4361477/bug4361477.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,100 @@
+/*
+ * 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.
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.event.*;
+import sun.awt.SunToolkit;
+
+/*
+ * @test
+ * @bug 4361477
+ * @summary JTabbedPane throws ArrayOutOfBoundsException
+ * @author Oleg Mokhovikov
+ * @run main bug4361477
+ */
+public class bug4361477 {
+
+    static JTabbedPane tabbedPane;
+    volatile static boolean bStateChanged = false;
+    volatile static Rectangle bounds;
+
+    public static void main(String args[]) throws Exception {
+
+        SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+        Robot robot = new Robot();
+        robot.setAutoDelay(50);
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+
+            @Override
+            public void run() {
+                createAndShowUI();
+            }
+        });
+
+        toolkit.realSync();
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+
+            @Override
+            public void run() {
+                bounds = tabbedPane.getUI().getTabBounds(tabbedPane, 0);
+            }
+        });
+
+        Point location = bounds.getLocation();
+        SwingUtilities.convertPointToScreen(location, tabbedPane);
+        robot.mouseMove(location.x + 1, location.y + 1);
+        robot.mousePress(InputEvent.BUTTON1_MASK);
+        robot.mouseRelease(InputEvent.BUTTON1_MASK);
+
+        if (!bStateChanged) {
+            throw new RuntimeException("Tabbed pane state is not changed");
+        }
+    }
+
+    static void createAndShowUI() {
+
+        final JFrame frame = new JFrame();
+        tabbedPane = new JTabbedPane();
+        tabbedPane.add("Tab0", new JPanel());
+        tabbedPane.add("Tab1", new JPanel());
+        tabbedPane.add("Tab2", new JPanel());
+        tabbedPane.setSelectedIndex(2);
+        tabbedPane.addChangeListener(new ChangeListener() {
+
+            public void stateChanged(final ChangeEvent pick) {
+                bStateChanged = true;
+                if (tabbedPane.getTabCount() == 3) {
+                    tabbedPane.remove(2);
+                }
+            }
+        });
+
+        frame.getContentPane().add(tabbedPane);
+        frame.setSize(300, 200);
+        frame.setVisible(true);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JTabbedPane/6495408/bug6495408.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ */
+
+import javax.swing.*;
+import java.awt.*;
+import sun.awt.SunToolkit;
+/*
+ * @test
+ * @bug 6495408
+ * @summary REGRESSION: JTabbedPane throws ArrayIndexOutOfBoundsException
+ * @author Alexander Potochkin
+ * @run main bug6495408
+ */
+
+public class bug6495408 {
+
+    static JTabbedPane tabbedPane;
+
+    public static void main(String[] args) throws Exception {
+        SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+        final Robot robot = new Robot();
+        robot.setAutoDelay(50);
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+
+            public void run() {
+                final JFrame frame = new JFrame();
+                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                tabbedPane = new JTabbedPane();
+                tabbedPane.setTabPlacement(JTabbedPane.LEFT);
+                tabbedPane.addTab("Hello", null);
+                frame.add(tabbedPane);
+                frame.setSize(400, 400);
+                frame.setLocationRelativeTo(null);
+                frame.setVisible(true);
+            }
+        });
+
+        toolkit.realSync();
+
+        final Rectangle d = new Rectangle();
+        final Point p = new Point();
+
+        for (int i = 0; i < 7; i++) {
+            SwingUtilities.invokeLater(new Runnable() {
+
+                public void run() {
+                    int tab = tabbedPane.getTabCount() - 1;
+                    Rectangle bounds = tabbedPane.getBoundsAt(tab);
+                    if (bounds != null) {
+                        d.setBounds(bounds);
+                        p.setLocation(d.x + d.width / 2, d.y + d.height / 2);
+                        SwingUtilities.convertPointToScreen(p, tabbedPane);
+                        robot.mouseMove(p.x, p.y + d.height);
+                        tabbedPane.addTab("Hello", null);
+                    }
+                }
+            });
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JTabbedPane/7161568/bug7161568.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,90 @@
+/*
+ * 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.
+ */
+import java.awt.*;
+import javax.swing.*;
+import java.awt.event.*;
+import sun.awt.SunToolkit;
+
+/**
+ * @test
+ * @bug 7161568
+ * @author Alexander Scherbatiy
+ * @summary Tests that navigating tabs in the JTAbbedPane does not throw NPE
+ * @run main bug7161568
+ */
+public class bug7161568 {
+
+    private static final int N = 50;
+    private static JTabbedPane tabbedPane;
+
+    public static void main(String[] args) throws Exception {
+        UIManager.put("TabbedPane.selectionFollowsFocus", Boolean.FALSE);
+
+        SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+        Robot robot = new Robot();
+        robot.setAutoDelay(50);
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+
+            @Override
+            public void run() {
+                createAndShowUI();
+            }
+        });
+
+        toolkit.realSync();
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+
+            @Override
+            public void run() {
+                tabbedPane.requestFocus();
+            }
+        });
+
+        toolkit.realSync();
+
+        for (int i = 0; i < N; i++) {
+            robot.keyPress(KeyEvent.VK_LEFT);
+            robot.keyRelease(KeyEvent.VK_LEFT);
+            toolkit.realSync();
+        }
+    }
+
+    static void createAndShowUI() {
+        JFrame frame = new JFrame("Test");
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.setSize(100, 100);
+
+        tabbedPane = new JTabbedPane();
+
+        for (int i = 0; i < N; i++) {
+            tabbedPane.addTab("Tab: " + i, new JLabel("Test"));
+        }
+
+        tabbedPane.setSelectedIndex(0);
+
+        frame.getContentPane().add(tabbedPane);
+        frame.setVisible(true);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/text/StyledEditorKit/8016833/bug8016833.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,270 @@
+/*
+ * 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
+   @bug 8016833
+   @summary underlines and strikethroughs should be  painted at the correct
+            positions for different kind of text styles: normal, superscript and subscript
+   @author Anton Nashatyrev
+   @run main bug8016833
+*/
+import javax.swing.*;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Style;
+import javax.swing.text.StyleConstants;
+import javax.swing.text.StyledDocument;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.lang.reflect.InvocationTargetException;
+
+public class bug8016833 {
+
+    void drawText(final Graphics g, final boolean underline, final boolean strikethrough, final boolean background) {
+        drawText(g, "mama", underline, strikethrough, background);
+    }
+
+    void drawText(final Graphics g, final String text, final boolean underline, final boolean strikethrough, final boolean background) {
+        try {
+            SwingUtilities.invokeAndWait(new Runnable() {
+                @Override
+                public void run() {
+                    final JTextPane comp = new JTextPane();
+                    final StyledDocument doc = comp.getStyledDocument();
+
+                    Style style = comp.addStyle("superscript", null);
+                    setNormalStyle(style);
+
+                    if (underline) {
+                        StyleConstants.setUnderline(style, true);
+                    }
+                    if (strikethrough) {
+                        StyleConstants.setStrikeThrough(style, true);
+                    }
+                    if (background) {
+                        StyleConstants.setBackground(style, Color.BLUE);
+                    }
+                    try {
+                        doc.insertString(doc.getLength(), "mama", style);
+                    } catch (BadLocationException e) {
+                        throw new RuntimeException(e);
+                    }
+
+                    comp.setSize(200, 100);
+                    comp.paint(g);
+                }
+            });
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        } catch (InvocationTargetException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    void setNormalStyle(Style style) {
+        StyleConstants.setSuperscript(style, true);
+    }
+
+    int getEmptyPixel() {
+        return 0xFFFFFFFF;
+    }
+
+    boolean isPixelEmpty(int argb) {
+        return (argb & 0x00FFFFFF) == (getEmptyPixel() & 0x00FFFFFF);
+    }
+
+    boolean isLineEmpty(BufferedImage img, int coord, boolean isHorizontal) {
+        int len = isHorizontal ? img.getWidth() : img.getHeight();
+        for (int i = 0; i < len; i++) {
+            int pixel = isHorizontal ? img.getRGB(i, coord) : img.getRGB(coord, i);
+            if (!isPixelEmpty(pixel)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    Rectangle getPixelsOutline(BufferedImage img) {
+        int x1 = 0;
+        while (x1 < img.getWidth() && isLineEmpty(img, x1, false)) {
+            x1++;
+        }
+        int x2 = img.getWidth() - 1;
+        while (x2 >= 0 && isLineEmpty(img, x2, false)) {
+            x2--;
+        }
+        int y1 = 0;
+        while (y1 < img.getHeight() && isLineEmpty(img, y1, true)) {
+            y1++;
+        }
+        int y2 = img.getHeight() - 1;
+        while (y2 >= 0 && isLineEmpty(img, y2, true)) {
+            y2--;
+        }
+
+        return new Rectangle(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
+    }
+
+    BufferedImage createImage() {
+        final BufferedImage img = new BufferedImage(200, 100, BufferedImage.TYPE_INT_ARGB);
+        try {
+            SwingUtilities.invokeAndWait(new Runnable() {
+                @Override
+                public void run() {
+                    Graphics g = img.getGraphics();
+                    g.setColor(new Color(getEmptyPixel()));
+                    g.fillRect(0, 0, 10000, 10000);
+                }
+            });
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        } catch (InvocationTargetException e) {
+            throw new RuntimeException(e);
+        }
+        return img;
+    }
+
+    int subPixels(int pix1, int pix2) {
+        if (pix1 == pix2) {
+            return getEmptyPixel();
+        }
+        return pix1;
+    }
+
+    /**
+     * Subtracts img2 from img1
+     */
+    BufferedImage subImages(BufferedImage img1, BufferedImage img2) {
+        if (img1.getHeight() != img2.getHeight() ||
+                img1.getWidth() != img2.getWidth()) {
+            throw new RuntimeException("Different sizes");
+        }
+        BufferedImage ret = new BufferedImage(img1.getWidth(), img1.getHeight(), img1.getType());
+
+        for (int x = 0; x < ret.getWidth(); x++) {
+            for (int y = 0; y < ret.getHeight(); y++) {
+                ret.setRGB(x, y, subPixels(img1.getRGB(x, y), img2.getRGB(x, y)));
+            }
+        }
+        return ret;
+    }
+
+    void testUnderline() {
+        System.out.println("  testUnderline()");
+
+        final BufferedImage img1 = createImage();
+        drawText(img1.getGraphics(), true, false, false);
+        final Rectangle out1 = getPixelsOutline(img1);
+        System.out.println("   Underlined: " + out1);
+
+        final BufferedImage img2 = createImage();
+        drawText(img2.getGraphics(), false, false, false);
+        final Rectangle out2 = getPixelsOutline(img2);
+        System.out.println("   Normal: " + out2);
+
+        final BufferedImage img3 = subImages(img1, img2);
+        final Rectangle out3 = getPixelsOutline(img3);
+        System.out.println("   Sub: " + out3);
+
+        // underline is not too thick
+        assertTrue(out3.getHeight() <= 2);
+        // not too wide
+        assertTrue(out3.getWidth() * 0.8 < out2.getWidth());
+        // not too low
+        assertTrue(out3.getY() - (out1.getY() + out2.getHeight()) < 3);
+        // not too high
+        assertTrue(out3.getY() - (out1.getY() + out2.getHeight()) > 0);
+    }
+
+    void testStrikthrough() {
+        System.out.println("  testStrikthrough()");
+
+        final BufferedImage img1 = createImage();
+        drawText(img1.getGraphics(), false, true, false);
+        final Rectangle out1 = getPixelsOutline(img1);
+        System.out.println("   Striked: " + out1);
+
+        final BufferedImage img2 = createImage();
+        drawText(img2.getGraphics(), false, false, false);
+        final Rectangle out2 = getPixelsOutline(img2);
+        System.out.println("   Normal: " + out2);
+
+        final BufferedImage img3 = subImages(img1, img2);
+        final Rectangle out3 = getPixelsOutline(img3);
+        System.out.println("   Sub: " + out3);
+
+        // strikethrough is not too thick
+        assertTrue(out3.getHeight() <= 2);
+        // not too wide
+        assertTrue(out3.getWidth() * 0.8 < out2.getWidth());
+        // not too low
+        assertTrue(out3.getY() - (out1.getY() + out2.getHeight()) < 0);
+        // not too high
+        assertTrue(out3.getY() - out1.getY() > 1);
+    }
+    void assertTrue(boolean b) {
+        if (!b) {
+            throw new RuntimeException("Assertion failed");
+        }
+    }
+
+    static void testSuperScript() {
+        System.out.println("testSuperScript()");
+        bug8016833 b = new bug8016833() {
+            @Override
+            void setNormalStyle(Style style) {
+                StyleConstants.setSuperscript(style, true);
+            }
+        };
+        b.testUnderline();
+        b.testStrikthrough();
+    }
+
+    static void testSubScript() {
+        System.out.println("testSubScript()");
+        bug8016833 b = new bug8016833() {
+            @Override
+            void setNormalStyle(Style style) {
+                StyleConstants.setSubscript(style, true);
+            }
+        };
+        b.testUnderline();
+        b.testStrikthrough();
+    }
+
+    static void testNormalScript() {
+        System.out.println("testNormalScript()");
+        bug8016833 b = new bug8016833() {
+            @Override
+            void setNormalStyle(Style style) {
+            }
+        };
+        b.testUnderline();
+        b.testStrikthrough();
+    }
+
+    public static void main(String[] args) {
+        testSubScript();
+        testSuperScript();
+        testNormalScript();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/TransformService/NullParent.java	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,63 @@
+/*
+ * 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
+ * @bug 8022120
+ * @summary check that the init and marshalParams methods throw
+ *          NullPointerException when the parent parameter is null
+ */
+
+import javax.xml.crypto.dsig.CanonicalizationMethod;
+import javax.xml.crypto.dsig.Transform;
+import javax.xml.crypto.dsig.TransformService;
+
+public class NullParent {
+
+    public static void main(String[] args) throws Exception {
+        String[] transforms = new String[]
+            { Transform.BASE64, Transform.ENVELOPED, Transform.XPATH,
+              Transform.XPATH2, Transform.XSLT,
+              CanonicalizationMethod.EXCLUSIVE,
+              CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS,
+              CanonicalizationMethod.INCLUSIVE,
+              CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS };
+
+        for (String transform : transforms) {
+            System.out.println("Testing " + transform);
+            TransformService ts = TransformService.getInstance(transform,
+                                                               "DOM");
+            try {
+                ts.init(null, null);
+                throw new Exception("init must throw NullPointerException " +
+                                    "when the parent parameter is null");
+            } catch (NullPointerException npe) { }
+            try {
+                ts.marshalParams(null, null);
+                throw new Exception("marshalParams must throw " +
+                                    "NullPointerException when the parent " +
+                                    "parameter is null");
+            } catch (NullPointerException npe) { }
+        }
+    }
+}
--- a/jdk/test/jdk/lambda/MethodReferenceTestInstanceMethod.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/jdk/lambda/MethodReferenceTestInstanceMethod.java	Wed Jul 05 19:07:19 2017 +0200
@@ -47,7 +47,7 @@
     }
 
     public void testStringBuffer() {
-        String s = generate().collect(Collectors.toStringBuilder()).toString();
+        String s = generate().collect(Collectors.joining());
         assertEquals(s, "THREEFOURFIVE");
     }
 
--- a/jdk/test/jdk/lambda/separate/TestHarness.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/jdk/test/jdk/lambda/separate/TestHarness.java	Wed Jul 05 19:07:19 2017 +0200
@@ -119,7 +119,7 @@
         Class stub = new Class(specimen.getName(), cm);
 
         String params =
-            Arrays.asList(args).stream().collect(Collectors.toStringJoiner(", ")).toString();
+            Arrays.asList(args).stream().collect(Collectors.joining(", ")).toString();
 
         ConcreteMethod sm = new ConcreteMethod(
             method.getReturnType(), method.getName(),
@@ -150,7 +150,7 @@
             null, Arrays.asList((Method)method));
         Class cstub = new Class(specimen.getName());
 
-        String params = Arrays.asList(args).stream().collect(Collectors.toStringJoiner(", ")).toString();
+        String params = Arrays.asList(args).stream().collect(Collectors.joining(", ")).toString();
 
         ConcreteMethod sm = new ConcreteMethod(
             "int", SourceModel.stdMethodName,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/tools/jarsigner/collator.sh	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,76 @@
+#
+# 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
+# @bug 8021789
+# @summary jarsigner parses alias as command line option (depending on locale)
+#
+
+if [ "${TESTJAVA}" = "" ] ; then
+  JAVAC_CMD=`which javac`
+  TESTJAVA=`dirname $JAVAC_CMD`/..
+fi
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+  Windows_* )
+    FS="\\"
+    ;;
+  * )
+    FS="/"
+    ;;
+esac
+
+F=collator
+KS=collator.jks
+JFILE=collator.jar
+
+KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit \
+        -keystore $KS"
+JAR=$TESTJAVA${FS}bin${FS}jar
+JARSIGNER="$TESTJAVA${FS}bin${FS}jarsigner -keystore $KS -storepass changeit"
+
+rm $F $KS $JFILE 2> /dev/null
+
+echo 12345 > $F
+$JAR cvf $JFILE $F
+
+ERR=""
+
+$KT -alias debug -dname CN=debug -genkey -validity 300 || ERR="$ERR 1"
+
+# use "debug" as alias name
+$JARSIGNER $JFILE debug || ERR="$ERR 2"
+
+# use "" as alias name (although there will be a warning)
+$JARSIGNER -verify $JFILE "" || ERR="$ERR 3"
+
+if [ "$ERR" = "" ]; then
+    exit 0
+else
+    echo "ERR is $ERR"
+    exit 1
+fi
+
+
--- a/nashorn/.hgtags	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/.hgtags	Wed Jul 05 19:07:19 2017 +0200
@@ -211,3 +211,4 @@
 10a1ab9e20a42d278aa1a89698f2a4cf5883d00d jdk8-b99
 598321c438b52d9408a2671fb3fc2b2947d0f654 jdk8-b100
 a302b05d0ee460679501dc01004f70eb395fadf5 jdk8-b101
+e966ff0a3ffef8a687eaf5a14167bb595b623d02 jdk8-b102
--- a/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java	Wed Jul 05 19:07:19 2017 +0200
@@ -45,6 +45,7 @@
 import static jdk.nashorn.internal.codegen.CompilerConstants.staticCallNoLookup;
 import static jdk.nashorn.internal.codegen.CompilerConstants.staticField;
 import static jdk.nashorn.internal.codegen.CompilerConstants.typeDescriptor;
+import static jdk.nashorn.internal.codegen.CompilerConstants.virtualCallNoLookup;
 import static jdk.nashorn.internal.ir.Symbol.IS_INTERNAL;
 import static jdk.nashorn.internal.ir.Symbol.IS_TEMP;
 import static jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor.CALLSITE_FAST_SCOPE;
@@ -131,6 +132,7 @@
 import jdk.nashorn.internal.runtime.ScriptRuntime;
 import jdk.nashorn.internal.runtime.Source;
 import jdk.nashorn.internal.runtime.Undefined;
+import jdk.nashorn.internal.runtime.arrays.ArrayData;
 import jdk.nashorn.internal.runtime.linker.LinkerCallSite;
 
 /**
@@ -1262,7 +1264,11 @@
             classEmitter.needGetConstantMethod(cls);
         } else {
             method.loadConstants().load(index).arrayload();
-            if (cls != Object.class) {
+            if (object instanceof ArrayData) {
+                // avoid cast to non-public ArrayData subclass
+                method.checkcast(ArrayData.class);
+                method.invoke(virtualCallNoLookup(ArrayData.class, "copy", ArrayData.class));
+            } else if (cls != Object.class) {
                 method.checkcast(cls);
             }
         }
--- a/nashorn/src/jdk/nashorn/internal/codegen/FieldObjectCreator.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/codegen/FieldObjectCreator.java	Wed Jul 05 19:07:19 2017 +0200
@@ -30,12 +30,15 @@
 import static jdk.nashorn.internal.codegen.CompilerConstants.typeDescriptor;
 import static jdk.nashorn.internal.codegen.ObjectClassGenerator.getPaddedFieldCount;
 import static jdk.nashorn.internal.codegen.types.Type.OBJECT;
+import static jdk.nashorn.internal.runtime.arrays.ArrayIndex.getArrayIndex;
+import static jdk.nashorn.internal.runtime.arrays.ArrayIndex.isValidArrayIndex;
 
 import java.util.Iterator;
 import java.util.List;
 import jdk.nashorn.internal.codegen.types.Type;
 import jdk.nashorn.internal.ir.Symbol;
 import jdk.nashorn.internal.runtime.Context;
+import jdk.nashorn.internal.runtime.JSType;
 import jdk.nashorn.internal.runtime.PropertyMap;
 import jdk.nashorn.internal.runtime.ScriptObject;
 import jdk.nashorn.internal.runtime.arrays.ArrayIndex;
@@ -129,12 +132,12 @@
             final T      value  = valueIter.next();
 
             if (symbol != null && value != null) {
-                final int index = ArrayIndex.getArrayIndex(key);
+                final int index = getArrayIndex(key);
 
-                if (index < 0) {
+                if (!isValidArrayIndex(index)) {
                     putField(method, key, symbol.getFieldIndex(), value);
                 } else {
-                    putSlot(method, index, value);
+                    putSlot(method, ArrayIndex.toLongIndex(index), value);
                 }
             }
         }
@@ -177,9 +180,13 @@
      * @param index  Slot index.
      * @param value  Value to store.
      */
-    private void putSlot(final MethodEmitter method, final int index, final T value) {
+    private void putSlot(final MethodEmitter method, final long index, final T value) {
         method.dup();
-        method.load(index);
+        if (JSType.isRepresentableAsInt(index)) {
+            method.load((int) index);
+        } else {
+            method.load(index);
+        }
         loadValue(value);
         method.dynamicSetIndex(callSiteFlags);
     }
--- a/nashorn/src/jdk/nashorn/internal/codegen/MapCreator.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/codegen/MapCreator.java	Wed Jul 05 19:07:19 2017 +0200
@@ -25,13 +25,15 @@
 
 package jdk.nashorn.internal.codegen;
 
+import static jdk.nashorn.internal.runtime.arrays.ArrayIndex.getArrayIndex;
+import static jdk.nashorn.internal.runtime.arrays.ArrayIndex.isValidArrayIndex;
+
 import java.util.ArrayList;
 import java.util.List;
 import jdk.nashorn.internal.ir.Symbol;
 import jdk.nashorn.internal.runtime.AccessorProperty;
 import jdk.nashorn.internal.runtime.Property;
 import jdk.nashorn.internal.runtime.PropertyMap;
-import jdk.nashorn.internal.runtime.arrays.ArrayIndex;
 
 /**
  * Class that creates PropertyMap sent to script object constructors.
@@ -76,7 +78,7 @@
             final String key    = keys.get(i);
             final Symbol symbol = symbols.get(i);
 
-            if (symbol != null && !ArrayIndex.isIntArrayIndex(key)) {
+            if (symbol != null && !isValidArrayIndex(getArrayIndex(key))) {
                 properties.add(new AccessorProperty(key, getPropertyFlags(symbol, hasArguments), structure, symbol.getFieldIndex()));
             }
         }
@@ -93,7 +95,7 @@
             final String key    = keys.get(i);
             final Symbol symbol = symbols.get(i);
 
-            if (symbol != null && !ArrayIndex.isIntArrayIndex(key)) {
+            if (symbol != null && !isValidArrayIndex(getArrayIndex(key))) {
                 properties.add(new AccessorProperty(key, getPropertyFlags(symbol, hasArguments), spillIndex++));
             }
         }
--- a/nashorn/src/jdk/nashorn/internal/codegen/SpillObjectCreator.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/codegen/SpillObjectCreator.java	Wed Jul 05 19:07:19 2017 +0200
@@ -26,9 +26,13 @@
 package jdk.nashorn.internal.codegen;
 
 import static jdk.nashorn.internal.codegen.CompilerConstants.constructorNoLookup;
+import static jdk.nashorn.internal.codegen.CompilerConstants.virtualCallNoLookup;
 import static jdk.nashorn.internal.codegen.types.Type.OBJECT;
 
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Set;
+
 import jdk.nashorn.internal.codegen.types.Type;
 import jdk.nashorn.internal.ir.Expression;
 import jdk.nashorn.internal.ir.LiteralNode;
@@ -36,6 +40,8 @@
 import jdk.nashorn.internal.runtime.Property;
 import jdk.nashorn.internal.runtime.PropertyMap;
 import jdk.nashorn.internal.runtime.ScriptObject;
+import jdk.nashorn.internal.runtime.arrays.ArrayData;
+import jdk.nashorn.internal.runtime.arrays.ArrayIndex;
 import jdk.nashorn.internal.scripts.JO;
 
 /**
@@ -63,56 +69,82 @@
     protected void makeObject(final MethodEmitter method) {
         assert !isScope() : "spill scope objects are not currently supported";
 
-        final int      length       = keys.size();
-        final Object[] presetValues = new Object[propertyMap.size()];
-        final Class<?> clazz        = JO.class;
+        final int          length        = keys.size();
+        final Object[]     presetValues  = new Object[length];
+        final Set<Integer> postsetValues = new LinkedHashSet<>();
+        final int          callSiteFlags = codegen.getCallSiteFlags();
+        ArrayData          arrayData     = ArrayData.allocate(new Object[0]);
 
-        // Compute constant values
+        // Compute constant property values
         for (int i = 0; i < length; i++) {
             final String key = keys.get(i);
-            final Property property = propertyMap.findProperty(key);
+            final Expression value = values.get(i);
+
+            if (value == null) {
+                continue; // getter or setter
+            }
+
+            final Object constantValue = LiteralNode.objectAsConstant(value);
+            if (constantValue == LiteralNode.POSTSET_MARKER) {
+                postsetValues.add(i);
+                continue;
+            }
 
+            final Property property = propertyMap.findProperty(key);
             if (property != null) {
-                presetValues[property.getSlot()] = LiteralNode.objectAsConstant(values.get(i));
+                // normal property key
+                presetValues[property.getSlot()] = constantValue;
+            } else {
+                // array index key
+                final long oldLength = arrayData.length();
+                final int index = ArrayIndex.getArrayIndex(key);
+                assert ArrayIndex.isValidArrayIndex(index);
+                final long longIndex =  ArrayIndex.toLongIndex(index);
+                if (longIndex >= oldLength) {
+                    arrayData = arrayData.ensure(longIndex);
+                }
+                arrayData = arrayData.set(index, constantValue, false);
+                if (longIndex > oldLength) {
+                    arrayData = arrayData.delete(oldLength, longIndex - 1);
+                }
             }
         }
 
-        method._new(clazz).dup();
+        // create object and invoke constructor
+        method._new(JO.class).dup();
         codegen.loadConstant(propertyMap);
-
         method.invoke(constructorNoLookup(JO.class, PropertyMap.class));
 
+        // Set spill array with preset values
         method.dup();
         codegen.loadConstant(presetValues);
+        method.putField(Type.getInternalName(ScriptObject.class), "spill", Type.OBJECT_ARRAY.getDescriptor());
+
+        // Set array data if any
+        if (arrayData.length() > 0) {
+            method.dup();
+            codegen.loadConstant(arrayData);
+            method.invoke(virtualCallNoLookup(ScriptObject.class, "setArray",void.class, ArrayData.class));
+        }
 
         // Create properties with non-constant values
-        for (int i = 0; i < length; i++) {
+        for (int i : postsetValues) {
             final String key = keys.get(i);
             final Property property = propertyMap.findProperty(key);
 
-            if (property != null && presetValues[property.getSlot()] == LiteralNode.POSTSET_MARKER) {
+            if (property == null) {
+                final int index = ArrayIndex.getArrayIndex(key);
+                assert ArrayIndex.isValidArrayIndex(index);
                 method.dup();
+                method.load(ArrayIndex.toLongIndex(index));
+                codegen.load(values.get(i));
+                method.dynamicSetIndex(callSiteFlags);
+            } else {
+                method.dup();
+                method.getField(Type.getInternalName(ScriptObject.class), "spill", Type.OBJECT_ARRAY.getDescriptor());
                 method.load(property.getSlot());
                 codegen.load(values.get(i)).convert(OBJECT);
                 method.arraystore();
-                presetValues[property.getSlot()] = null;
-            }
-        }
-
-        method.putField(Type.typeFor(ScriptObject.class).getInternalName(), "spill", Type.OBJECT_ARRAY.getDescriptor());
-        final int callSiteFlags = codegen.getCallSiteFlags();
-
-        // Assign properties with valid array index keys
-        for (int i = 0; i < length; i++) {
-            final String key = keys.get(i);
-            final Property property = propertyMap.findProperty(key);
-            final Expression value = values.get(i);
-
-            if (property == null && value != null) {
-                method.dup();
-                method.load(keys.get(i));
-                codegen.load(value);
-                method.dynamicSetIndex(callSiteFlags);
             }
         }
     }
--- a/nashorn/src/jdk/nashorn/internal/objects/ArrayBufferView.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/objects/ArrayBufferView.java	Wed Jul 05 19:07:19 2017 +0200
@@ -116,6 +116,11 @@
         }
 
         @Override
+        public ArrayData copy() {
+            throw new UnsupportedOperationException();   // Not used for ArrayBuffers
+        }
+
+        @Override
         public Object[] asObjectArray() {
             final Object[] array = new Object[elementLength];
             for (int i = 0; i < elementLength; i++) {
--- a/nashorn/src/jdk/nashorn/internal/runtime/NashornLoader.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/NashornLoader.java	Wed Jul 05 19:07:19 2017 +0200
@@ -44,26 +44,29 @@
  *
  */
 abstract class NashornLoader extends SecureClassLoader {
-    private static final String OBJECTS_PKG = "jdk.nashorn.internal.objects";
-    private static final String RUNTIME_PKG = "jdk.nashorn.internal.runtime";
+    private static final String OBJECTS_PKG        = "jdk.nashorn.internal.objects";
+    private static final String RUNTIME_PKG        = "jdk.nashorn.internal.runtime";
+    private static final String RUNTIME_ARRAYS_PKG = "jdk.nashorn.internal.runtime.arrays";
     private static final String RUNTIME_LINKER_PKG = "jdk.nashorn.internal.runtime.linker";
-    private static final String SCRIPTS_PKG = "jdk.nashorn.internal.scripts";
+    private static final String SCRIPTS_PKG        = "jdk.nashorn.internal.scripts";
 
     private static final Permission[] SCRIPT_PERMISSIONS;
+
     static {
-        SCRIPT_PERMISSIONS = new Permission[4];
-
         /*
          * Generated classes get access to runtime, runtime.linker, objects, scripts packages.
          * Note that the actual scripts can not access these because Java.type, Packages
          * prevent these restricted packages. And Java reflection and JSR292 access is prevented
          * for scripts. In other words, nashorn generated portions of script classes can access
-         * clases in these implementation packages.
+         * classes in these implementation packages.
          */
-        SCRIPT_PERMISSIONS[0] = new RuntimePermission("accessClassInPackage." + RUNTIME_PKG);
-        SCRIPT_PERMISSIONS[1] = new RuntimePermission("accessClassInPackage." + RUNTIME_LINKER_PKG);
-        SCRIPT_PERMISSIONS[2] = new RuntimePermission("accessClassInPackage." + OBJECTS_PKG);
-        SCRIPT_PERMISSIONS[3] = new RuntimePermission("accessClassInPackage." + SCRIPTS_PKG);
+        SCRIPT_PERMISSIONS = new Permission[] {
+                new RuntimePermission("accessClassInPackage." + RUNTIME_PKG),
+                new RuntimePermission("accessClassInPackage." + RUNTIME_LINKER_PKG),
+                new RuntimePermission("accessClassInPackage." + OBJECTS_PKG),
+                new RuntimePermission("accessClassInPackage." + SCRIPTS_PKG),
+                new RuntimePermission("accessClassInPackage." + RUNTIME_ARRAYS_PKG)
+        };
     }
 
     private final Context context;
@@ -97,6 +100,7 @@
                 final String pkgName = name.substring(0, i);
                 switch (pkgName) {
                     case RUNTIME_PKG:
+                    case RUNTIME_ARRAYS_PKG:
                     case RUNTIME_LINKER_PKG:
                     case OBJECTS_PKG:
                     case SCRIPTS_PKG:
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java	Wed Jul 05 19:07:19 2017 +0200
@@ -56,7 +56,7 @@
      * Constructor
      * @param length Virtual length of the array.
      */
-    public ArrayData(final long length) {
+    protected ArrayData(final long length) {
         this.length = length;
     }
 
@@ -183,6 +183,14 @@
     }
 
     /**
+     * Return a copy of the array that can be modified without affecting this instance.
+     * It is safe to return themselves for immutable subclasses.
+     *
+     * @return a new array
+     */
+    public abstract ArrayData copy();
+
+    /**
      * Return a copy of the array data as an Object array.
      *
      * @return an Object array
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayIndex.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayIndex.java	Wed Jul 05 19:07:19 2017 +0200
@@ -177,15 +177,5 @@
         return index & JSType.MAX_UINT;
     }
 
-    /**
-     * Check whether a key string represents a valid array index in JavaScript and is small enough
-     * to fit into a positive int.
-     *
-     * @param key the key
-     * @return true if key works as a valid int array index
-     */
-    public static boolean isIntArrayIndex(final String key) {
-        return getArrayIndex(key) >= 0;
-    }
 }
 
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayIterator.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayIterator.java	Wed Jul 05 19:07:19 2017 +0200
@@ -30,7 +30,7 @@
 /**
  * Iterator over a NativeArray
  */
-public class ArrayIterator extends ArrayLikeIterator<Object> {
+class ArrayIterator extends ArrayLikeIterator<Object> {
 
     /** Array {@link ScriptObject} to iterate over */
     protected final ScriptObject array;
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/DeletedArrayFilter.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/DeletedArrayFilter.java	Wed Jul 05 19:07:19 2017 +0200
@@ -44,6 +44,13 @@
     }
 
     @Override
+    public ArrayData copy() {
+        DeletedArrayFilter copy = new DeletedArrayFilter(underlying.copy());
+        copy.getDeleted().copy(deleted);
+        return copy;
+    }
+
+    @Override
     public Object[] asObjectArray() {
         final Object[] value = super.asObjectArray();
 
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/DeletedRangeArrayFilter.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/DeletedRangeArrayFilter.java	Wed Jul 05 19:07:19 2017 +0200
@@ -50,6 +50,11 @@
     }
 
     @Override
+    public ArrayData copy() {
+        return new DeletedRangeArrayFilter(underlying.copy(), lo, hi);
+    }
+
+    @Override
     public Object[] asObjectArray() {
         final Object[] value = super.asObjectArray();
 
@@ -191,11 +196,7 @@
 
     private ArrayData getDeletedArrayFilter() {
         final ArrayData deleteFilter = new DeletedArrayFilter(getUnderlying());
-
-        for (long i = lo; i <= hi; i++) {
-            deleteFilter.delete((int) i);
-        }
-
+        deleteFilter.delete(lo, hi);
         return deleteFilter;
     }
 
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/FrozenArrayFilter.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/FrozenArrayFilter.java	Wed Jul 05 19:07:19 2017 +0200
@@ -39,6 +39,11 @@
     }
 
     @Override
+    public ArrayData copy() {
+        return this;
+    }
+
+    @Override
     public PropertyDescriptor getDescriptor(final GlobalObject global, final int index) {
         return global.newDataDescriptor(getObject(index), false, true, false);
     }
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/IntArrayData.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/IntArrayData.java	Wed Jul 05 19:07:19 2017 +0200
@@ -33,7 +33,7 @@
  * Implementation of {@link ArrayData} as soon as an int has been
  * written to the array. This is the default data for new arrays
  */
-public final class IntArrayData extends ArrayData {
+final class IntArrayData extends ArrayData {
     /**
      * The wrapped array
      */
@@ -55,10 +55,13 @@
      */
     IntArrayData(final int array[], final int length) {
         super(length);
+        assert array.length >= length;
         this.array = array;
-        if (array.length > length) {
-            Arrays.fill(array, length, array.length, 0);
-        }
+    }
+
+    @Override
+    public ArrayData copy() {
+        return new IntArrayData(array.clone(), (int) length());
     }
 
     @Override
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/LongArrayData.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/LongArrayData.java	Wed Jul 05 19:07:19 2017 +0200
@@ -46,10 +46,16 @@
      */
     LongArrayData(final long array[], final int length) {
         super(length);
+        assert array.length >= length;
         this.array  = array;
     }
 
     @Override
+    public ArrayData copy() {
+        return new LongArrayData(array.clone(), (int) length());
+    }
+
+    @Override
     public Object[] asObjectArray() {
         return toObjectArray(array, (int) length());
     }
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/NoTypeArrayData.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/NoTypeArrayData.java	Wed Jul 05 19:07:19 2017 +0200
@@ -47,6 +47,11 @@
     }
 
     @Override
+    public ArrayData copy() {
+        return new NoTypeArrayData();
+    }
+
+    @Override
     public Object asArrayOfType(final Class<?> componentType) {
         return Array.newInstance(componentType, 0);
     }
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java	Wed Jul 05 19:07:19 2017 +0200
@@ -46,10 +46,13 @@
      */
     NumberArrayData(final double array[], final int length) {
         super(length);
+        assert array.length >= length;
         this.array  = array;
-        if (array.length > length) {
-            Arrays.fill(array, length, array.length, 0.0);
-        }
+    }
+
+    @Override
+    public ArrayData copy() {
+        return new NumberArrayData(array.clone(), (int) length());
     }
 
     @Override
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ObjectArrayData.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ObjectArrayData.java	Wed Jul 05 19:07:19 2017 +0200
@@ -47,10 +47,13 @@
      */
     ObjectArrayData(final Object array[], final int length) {
         super(length);
+        assert array.length >= length;
         this.array  = array;
-        if (array.length > length) {
-            Arrays.fill(array, length, array.length, ScriptRuntime.UNDEFINED);
-        }
+    }
+
+    @Override
+    public ArrayData copy() {
+        return new ObjectArrayData(array.clone(), (int) length());
     }
 
     @Override
@@ -109,9 +112,6 @@
 
     @Override
     public ArrayData set(final int index, final Object value, final boolean strict) {
-        if (value == ScriptRuntime.UNDEFINED) {
-            return new UndefinedArrayFilter(this).set(index, value, strict);
-        }
         array[index] = value;
         setLength(Math.max(index + 1, length()));
         return this;
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ReverseArrayIterator.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ReverseArrayIterator.java	Wed Jul 05 19:07:19 2017 +0200
@@ -30,7 +30,7 @@
 /**
  * Reverse iterator over a NativeArray
  */
-public final class ReverseArrayIterator extends ArrayIterator {
+final class ReverseArrayIterator extends ArrayIterator {
 
     /**
      * Constructor
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/SealedArrayFilter.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/SealedArrayFilter.java	Wed Jul 05 19:07:19 2017 +0200
@@ -39,6 +39,11 @@
     }
 
     @Override
+    public ArrayData copy() {
+        return new SealedArrayFilter(underlying.copy());
+    }
+
+    @Override
     public ArrayData slice(final long from, final long to) {
         return getUnderlying().slice(from, to);
     }
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java	Wed Jul 05 19:07:19 2017 +0200
@@ -41,22 +41,26 @@
     private ArrayData underlying;
 
     /** Maximum length to be stored in the array. */
-
     private final long maxDenseLength;
 
     /** Sparse elements. */
-    private TreeMap<Long, Object> sparseMap = new TreeMap<>();
+    private TreeMap<Long, Object> sparseMap;
 
-    SparseArrayData(final ArrayData underlying) {
-        super(underlying.length());
+    SparseArrayData(final ArrayData underlying, final long length) {
+        this(underlying, length, new TreeMap<Long, Object>());
+    }
+
+    SparseArrayData(final ArrayData underlying, final long length, final TreeMap<Long, Object> sparseMap) {
+        super(length);
+        assert underlying.length() <= length;
         this.underlying = underlying;
         this.maxDenseLength = Math.max(MAX_DENSE_LENGTH, underlying.length());
+        this.sparseMap = sparseMap;
     }
 
-    SparseArrayData(final ArrayData array, final long length) {
-        this(array);
-        assert array.length() <= length;
-        super.setLength(length);
+    @Override
+    public ArrayData copy() {
+        return new SparseArrayData(underlying.copy(), length(), new TreeMap<Long, Object>(sparseMap));
     }
 
     @Override
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/UndefinedArrayFilter.java	Thu Aug 08 10:10:37 2013 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/UndefinedArrayFilter.java	Wed Jul 05 19:07:19 2017 +0200
@@ -44,6 +44,13 @@
     }
 
     @Override
+    public ArrayData copy() {
+        UndefinedArrayFilter copy = new UndefinedArrayFilter(underlying.copy());
+        copy.getUndefined().copy(undefined);
+        return copy;
+    }
+
+    @Override
     public Object[] asObjectArray() {
         final Object[] value = super.asObjectArray();
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8020132.js	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,23992 @@
+/*
+ * 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.
+ * 
+ * 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.
+ */
+
+/**
+ * JDK-8020132: Big object literal with numerical keys exceeds method size
+ *
+ * @test
+ * @run
+ */
+
+var last = 58565;
+
+function getObject() {
+    return {
+        33209: 20246,
+        33210: 20252,
+        33211: 20253,
+        33212: 20257,
+        33213: 20259,
+        33214: 20264,
+        33215: 20265,
+        33216: 20268,
+        33217: 20269,
+        33218: 20270,
+        33219: 20273,
+        33220: 20275,
+        33221: 20277,
+        33222: 20279,
+        33223: 20281,
+        33224: 20283,
+        33225: 20286,
+        33226: 20287,
+        33227: 20288,
+        33228: 20289,
+        33229: 20290,
+        33230: 20292,
+        33231: 20293,
+        33232: 20295,
+        33233: 20296,
+        33234: 20297,
+        33235: 20298,
+        33236: 20299,
+        33237: 20300,
+        33238: 20306,
+        33239: 20308,
+        33240: 20310,
+        33241: 20321,
+        33242: 20322,
+        33243: 20326,
+        33244: 20328,
+        33245: 20330,
+        33246: 20331,
+        33247: 20333,
+        33248: 20334,
+        33249: 20337,
+        33250: 20338,
+        33251: 20341,
+        33252: 20343,
+        33253: 20344,
+        33254: 20345,
+        33255: 20346,
+        33256: 20349,
+        33257: 20352,
+        33258: 20353,
+        33259: 20354,
+        33260: 20357,
+        33261: 20358,
+        33262: 20359,
+        33263: 20362,
+        33264: 20364,
+        33265: 20366,
+        33266: 20368,
+        33267: 20370,
+        33268: 20371,
+        33269: 20373,
+        33270: 20374,
+        33271: 20376,
+        33272: 20377,
+        33273: 20378,
+        33274: 20380,
+        33275: 20382,
+        33276: 20383,
+        33277: 20385,
+        33278: 20386,
+        33344: 20388,
+        33345: 20395,
+        33346: 20397,
+        33347: 20400,
+        33348: 20401,
+        33349: 20402,
+        33350: 20403,
+        33351: 20404,
+        33352: 20406,
+        33353: 20407,
+        33354: 20408,
+        33355: 20409,
+        33356: 20410,
+        33357: 20411,
+        33358: 20412,
+        33359: 20413,
+        33360: 20414,
+        33361: 20416,
+        33362: 20417,
+        33363: 20418,
+        33364: 20422,
+        33365: 20423,
+        33366: 20424,
+        33367: 20425,
+        33368: 20427,
+        33369: 20428,
+        33370: 20429,
+        33371: 20434,
+        33372: 20435,
+        33373: 20436,
+        33374: 20437,
+        33375: 20438,
+        33376: 20441,
+        33377: 20443,
+        33378: 20448,
+        33379: 20450,
+        33380: 20452,
+        33381: 20453,
+        33382: 20455,
+        33383: 20459,
+        33384: 20460,
+        33385: 20464,
+        33386: 20466,
+        33387: 20468,
+        33388: 20469,
+        33389: 20470,
+        33390: 20471,
+        33391: 20473,
+        33392: 20475,
+        33393: 20476,
+        33394: 20477,
+        33395: 20479,
+        33396: 20480,
+        33397: 20481,
+        33398: 20482,
+        33399: 20483,
+        33400: 20484,
+        33401: 20485,
+        33402: 20486,
+        33403: 20487,
+        33404: 20488,
+        33405: 20489,
+        33406: 20490,
+        33408: 20491,
+        33409: 20494,
+        33410: 20496,
+        33411: 20497,
+        33412: 20499,
+        33413: 20501,
+        33414: 20502,
+        33415: 20503,
+        33416: 20507,
+        33417: 20509,
+        33418: 20510,
+        33419: 20512,
+        33420: 20514,
+        33421: 20515,
+        33422: 20516,
+        33423: 20519,
+        33424: 20523,
+        33425: 20527,
+        33426: 20528,
+        33427: 20529,
+        33428: 20530,
+        33429: 20531,
+        33430: 20532,
+        33431: 20533,
+        33432: 20534,
+        33433: 20535,
+        33434: 20536,
+        33435: 20537,
+        33436: 20539,
+        33437: 20541,
+        33438: 20543,
+        33439: 20544,
+        33440: 20545,
+        33441: 20546,
+        33442: 20548,
+        33443: 20549,
+        33444: 20550,
+        33445: 20553,
+        33446: 20554,
+        33447: 20555,
+        33448: 20557,
+        33449: 20560,
+        33450: 20561,
+        33451: 20562,
+        33452: 20563,
+        33453: 20564,
+        33454: 20566,
+        33455: 20567,
+        33456: 20568,
+        33457: 20569,
+        33458: 20571,
+        33459: 20573,
+        33460: 20574,
+        33461: 20575,
+        33462: 20576,
+        33463: 20577,
+        33464: 20578,
+        33465: 20579,
+        33466: 20580,
+        33467: 20582,
+        33468: 20583,
+        33469: 20584,
+        33470: 20585,
+        33471: 20586,
+        33472: 20587,
+        33473: 20589,
+        33474: 20590,
+        33475: 20591,
+        33476: 20592,
+        33477: 20593,
+        33478: 20594,
+        33479: 20595,
+        33480: 20596,
+        33481: 20597,
+        33482: 20600,
+        33483: 20601,
+        33484: 20602,
+        33485: 20604,
+        33486: 20605,
+        33487: 20609,
+        33488: 20610,
+        33489: 20611,
+        33490: 20612,
+        33491: 20614,
+        33492: 20615,
+        33493: 20617,
+        33494: 20618,
+        33495: 20619,
+        33496: 20620,
+        33497: 20622,
+        33498: 20623,
+        33499: 20624,
+        33500: 20625,
+        33501: 20626,
+        33502: 20627,
+        33503: 20628,
+        33504: 20629,
+        33505: 20630,
+        33506: 20631,
+        33507: 20632,
+        33508: 20633,
+        33509: 20634,
+        33510: 20635,
+        33511: 20636,
+        33512: 20637,
+        33513: 20638,
+        33514: 20639,
+        33515: 20640,
+        33516: 20641,
+        33517: 20642,
+        33518: 20644,
+        33519: 20646,
+        33520: 20650,
+        33521: 20651,
+        33522: 20653,
+        33523: 20654,
+        33524: 20655,
+        33525: 20656,
+        33526: 20657,
+        33527: 20659,
+        33528: 20660,
+        33529: 20661,
+        33530: 20662,
+        33531: 20663,
+        33532: 20664,
+        33533: 20665,
+        33534: 20668,
+        33600: 20669,
+        33601: 20670,
+        33602: 20671,
+        33603: 20672,
+        33604: 20673,
+        33605: 20674,
+        33606: 20675,
+        33607: 20676,
+        33608: 20677,
+        33609: 20678,
+        33610: 20679,
+        33611: 20680,
+        33612: 20681,
+        33613: 20682,
+        33614: 20683,
+        33615: 20684,
+        33616: 20685,
+        33617: 20686,
+        33618: 20688,
+        33619: 20689,
+        33620: 20690,
+        33621: 20691,
+        33622: 20692,
+        33623: 20693,
+        33624: 20695,
+        33625: 20696,
+        33626: 20697,
+        33627: 20699,
+        33628: 20700,
+        33629: 20701,
+        33630: 20702,
+        33631: 20703,
+        33632: 20704,
+        33633: 20705,
+        33634: 20706,
+        33635: 20707,
+        33636: 20708,
+        33637: 20709,
+        33638: 20712,
+        33639: 20713,
+        33640: 20714,
+        33641: 20715,
+        33642: 20719,
+        33643: 20720,
+        33644: 20721,
+        33645: 20722,
+        33646: 20724,
+        33647: 20726,
+        33648: 20727,
+        33649: 20728,
+        33650: 20729,
+        33651: 20730,
+        33652: 20732,
+        33653: 20733,
+        33654: 20734,
+        33655: 20735,
+        33656: 20736,
+        33657: 20737,
+        33658: 20738,
+        33659: 20739,
+        33660: 20740,
+        33661: 20741,
+        33662: 20744,
+        33664: 20745,
+        33665: 20746,
+        33666: 20748,
+        33667: 20749,
+        33668: 20750,
+        33669: 20751,
+        33670: 20752,
+        33671: 20753,
+        33672: 20755,
+        33673: 20756,
+        33674: 20757,
+        33675: 20758,
+        33676: 20759,
+        33677: 20760,
+        33678: 20761,
+        33679: 20762,
+        33680: 20763,
+        33681: 20764,
+        33682: 20765,
+        33683: 20766,
+        33684: 20767,
+        33685: 20768,
+        33686: 20770,
+        33687: 20771,
+        33688: 20772,
+        33689: 20773,
+        33690: 20774,
+        33691: 20775,
+        33692: 20776,
+        33693: 20777,
+        33694: 20778,
+        33695: 20779,
+        33696: 20780,
+        33697: 20781,
+        33698: 20782,
+        33699: 20783,
+        33700: 20784,
+        33701: 20785,
+        33702: 20786,
+        33703: 20787,
+        33704: 20788,
+        33705: 20789,
+        33706: 20790,
+        33707: 20791,
+        33708: 20792,
+        33709: 20793,
+        33710: 20794,
+        33711: 20795,
+        33712: 20796,
+        33713: 20797,
+        33714: 20798,
+        33715: 20802,
+        33716: 20807,
+        33717: 20810,
+        33718: 20812,
+        33719: 20814,
+        33720: 20815,
+        33721: 20816,
+        33722: 20818,
+        33723: 20819,
+        33724: 20823,
+        33725: 20824,
+        33726: 20825,
+        33727: 20827,
+        33728: 20829,
+        33729: 20830,
+        33730: 20831,
+        33731: 20832,
+        33732: 20833,
+        33733: 20835,
+        33734: 20836,
+        33735: 20838,
+        33736: 20839,
+        33737: 20841,
+        33738: 20842,
+        33739: 20847,
+        33740: 20850,
+        33741: 20858,
+        33742: 20862,
+        33743: 20863,
+        33744: 20867,
+        33745: 20868,
+        33746: 20870,
+        33747: 20871,
+        33748: 20874,
+        33749: 20875,
+        33750: 20878,
+        33751: 20879,
+        33752: 20880,
+        33753: 20881,
+        33754: 20883,
+        33755: 20884,
+        33756: 20888,
+        33757: 20890,
+        33758: 20893,
+        33759: 20894,
+        33760: 20895,
+        33761: 20897,
+        33762: 20899,
+        33763: 20902,
+        33764: 20903,
+        33765: 20904,
+        33766: 20905,
+        33767: 20906,
+        33768: 20909,
+        33769: 20910,
+        33770: 20916,
+        33771: 20920,
+        33772: 20921,
+        33773: 20922,
+        33774: 20926,
+        33775: 20927,
+        33776: 20929,
+        33777: 20930,
+        33778: 20931,
+        33779: 20933,
+        33780: 20936,
+        33781: 20938,
+        33782: 20941,
+        33783: 20942,
+        33784: 20944,
+        33785: 20946,
+        33786: 20947,
+        33787: 20948,
+        33788: 20949,
+        33789: 20950,
+        33790: 20951,
+        33856: 20952,
+        33857: 20953,
+        33858: 20954,
+        33859: 20956,
+        33860: 20958,
+        33861: 20959,
+        33862: 20962,
+        33863: 20963,
+        33864: 20965,
+        33865: 20966,
+        33866: 20967,
+        33867: 20968,
+        33868: 20969,
+        33869: 20970,
+        33870: 20972,
+        33871: 20974,
+        33872: 20977,
+        33873: 20978,
+        33874: 20980,
+        33875: 20983,
+        33876: 20990,
+        33877: 20996,
+        33878: 20997,
+        33879: 21001,
+        33880: 21003,
+        33881: 21004,
+        33882: 21007,
+        33883: 21008,
+        33884: 21011,
+        33885: 21012,
+        33886: 21013,
+        33887: 21020,
+        33888: 21022,
+        33889: 21023,
+        33890: 21025,
+        33891: 21026,
+        33892: 21027,
+        33893: 21029,
+        33894: 21030,
+        33895: 21031,
+        33896: 21034,
+        33897: 21036,
+        33898: 21039,
+        33899: 21041,
+        33900: 21042,
+        33901: 21044,
+        33902: 21045,
+        33903: 21052,
+        33904: 21054,
+        33905: 21060,
+        33906: 21061,
+        33907: 21062,
+        33908: 21063,
+        33909: 21064,
+        33910: 21065,
+        33911: 21067,
+        33912: 21070,
+        33913: 21071,
+        33914: 21074,
+        33915: 21075,
+        33916: 21077,
+        33917: 21079,
+        33918: 21080,
+        33920: 21081,
+        33921: 21082,
+        33922: 21083,
+        33923: 21085,
+        33924: 21087,
+        33925: 21088,
+        33926: 21090,
+        33927: 21091,
+        33928: 21092,
+        33929: 21094,
+        33930: 21096,
+        33931: 21099,
+        33932: 21100,
+        33933: 21101,
+        33934: 21102,
+        33935: 21104,
+        33936: 21105,
+        33937: 21107,
+        33938: 21108,
+        33939: 21109,
+        33940: 21110,
+        33941: 21111,
+        33942: 21112,
+        33943: 21113,
+        33944: 21114,
+        33945: 21115,
+        33946: 21116,
+        33947: 21118,
+        33948: 21120,
+        33949: 21123,
+        33950: 21124,
+        33951: 21125,
+        33952: 21126,
+        33953: 21127,
+        33954: 21129,
+        33955: 21130,
+        33956: 21131,
+        33957: 21132,
+        33958: 21133,
+        33959: 21134,
+        33960: 21135,
+        33961: 21137,
+        33962: 21138,
+        33963: 21140,
+        33964: 21141,
+        33965: 21142,
+        33966: 21143,
+        33967: 21144,
+        33968: 21145,
+        33969: 21146,
+        33970: 21148,
+        33971: 21156,
+        33972: 21157,
+        33973: 21158,
+        33974: 21159,
+        33975: 21166,
+        33976: 21167,
+        33977: 21168,
+        33978: 21172,
+        33979: 21173,
+        33980: 21174,
+        33981: 21175,
+        33982: 21176,
+        33983: 21177,
+        33984: 21178,
+        33985: 21179,
+        33986: 21180,
+        33987: 21181,
+        33988: 21184,
+        33989: 21185,
+        33990: 21186,
+        33991: 21188,
+        33992: 21189,
+        33993: 21190,
+        33994: 21192,
+        33995: 21194,
+        33996: 21196,
+        33997: 21197,
+        33998: 21198,
+        33999: 21199,
+        34000: 21201,
+        34001: 21203,
+        34002: 21204,
+        34003: 21205,
+        34004: 21207,
+        34005: 21209,
+        34006: 21210,
+        34007: 21211,
+        34008: 21212,
+        34009: 21213,
+        34010: 21214,
+        34011: 21216,
+        34012: 21217,
+        34013: 21218,
+        34014: 21219,
+        34015: 21221,
+        34016: 21222,
+        34017: 21223,
+        34018: 21224,
+        34019: 21225,
+        34020: 21226,
+        34021: 21227,
+        34022: 21228,
+        34023: 21229,
+        34024: 21230,
+        34025: 21231,
+        34026: 21233,
+        34027: 21234,
+        34028: 21235,
+        34029: 21236,
+        34030: 21237,
+        34031: 21238,
+        34032: 21239,
+        34033: 21240,
+        34034: 21243,
+        34035: 21244,
+        34036: 21245,
+        34037: 21249,
+        34038: 21250,
+        34039: 21251,
+        34040: 21252,
+        34041: 21255,
+        34042: 21257,
+        34043: 21258,
+        34044: 21259,
+        34045: 21260,
+        34046: 21262,
+        34112: 21265,
+        34113: 21266,
+        34114: 21267,
+        34115: 21268,
+        34116: 21272,
+        34117: 21275,
+        34118: 21276,
+        34119: 21278,
+        34120: 21279,
+        34121: 21282,
+        34122: 21284,
+        34123: 21285,
+        34124: 21287,
+        34125: 21288,
+        34126: 21289,
+        34127: 21291,
+        34128: 21292,
+        34129: 21293,
+        34130: 21295,
+        34131: 21296,
+        34132: 21297,
+        34133: 21298,
+        34134: 21299,
+        34135: 21300,
+        34136: 21301,
+        34137: 21302,
+        34138: 21303,
+        34139: 21304,
+        34140: 21308,
+        34141: 21309,
+        34142: 21312,
+        34143: 21314,
+        34144: 21316,
+        34145: 21318,
+        34146: 21323,
+        34147: 21324,
+        34148: 21325,
+        34149: 21328,
+        34150: 21332,
+        34151: 21336,
+        34152: 21337,
+        34153: 21339,
+        34154: 21341,
+        34155: 21349,
+        34156: 21352,
+        34157: 21354,
+        34158: 21356,
+        34159: 21357,
+        34160: 21362,
+        34161: 21366,
+        34162: 21369,
+        34163: 21371,
+        34164: 21372,
+        34165: 21373,
+        34166: 21374,
+        34167: 21376,
+        34168: 21377,
+        34169: 21379,
+        34170: 21383,
+        34171: 21384,
+        34172: 21386,
+        34173: 21390,
+        34174: 21391,
+        34176: 21392,
+        34177: 21393,
+        34178: 21394,
+        34179: 21395,
+        34180: 21396,
+        34181: 21398,
+        34182: 21399,
+        34183: 21401,
+        34184: 21403,
+        34185: 21404,
+        34186: 21406,
+        34187: 21408,
+        34188: 21409,
+        34189: 21412,
+        34190: 21415,
+        34191: 21418,
+        34192: 21419,
+        34193: 21420,
+        34194: 21421,
+        34195: 21423,
+        34196: 21424,
+        34197: 21425,
+        34198: 21426,
+        34199: 21427,
+        34200: 21428,
+        34201: 21429,
+        34202: 21431,
+        34203: 21432,
+        34204: 21433,
+        34205: 21434,
+        34206: 21436,
+        34207: 21437,
+        34208: 21438,
+        34209: 21440,
+        34210: 21443,
+        34211: 21444,
+        34212: 21445,
+        34213: 21446,
+        34214: 21447,
+        34215: 21454,
+        34216: 21455,
+        34217: 21456,
+        34218: 21458,
+        34219: 21459,
+        34220: 21461,
+        34221: 21466,
+        34222: 21468,
+        34223: 21469,
+        34224: 21470,
+        34225: 21473,
+        34226: 21474,
+        34227: 21479,
+        34228: 21492,
+        34229: 21498,
+        34230: 21502,
+        34231: 21503,
+        34232: 21504,
+        34233: 21506,
+        34234: 21509,
+        34235: 21511,
+        34236: 21515,
+        34237: 21524,
+        34238: 21528,
+        34239: 21529,
+        33088: 19970,
+        33089: 19972,
+        33090: 19973,
+        33091: 19974,
+        33092: 19983,
+        33093: 19986,
+        33094: 19991,
+        33095: 19999,
+        33096: 20000,
+        33097: 20001,
+        33098: 20003,
+        33099: 20006,
+        33100: 20009,
+        33101: 20014,
+        33102: 20015,
+        33103: 20017,
+        33104: 20019,
+        33105: 20021,
+        33106: 20023,
+        33107: 20028,
+        33108: 20032,
+        33109: 20033,
+        33110: 20034,
+        33111: 20036,
+        33112: 20038,
+        33113: 20042,
+        33114: 20049,
+        33115: 20053,
+        33116: 20055,
+        33117: 20058,
+        33118: 20059,
+        33119: 20066,
+        33120: 20067,
+        33121: 20068,
+        33122: 20069,
+        33123: 20071,
+        33124: 20072,
+        33125: 20074,
+        33126: 20075,
+        33127: 20076,
+        33128: 20077,
+        33129: 20078,
+        33130: 20079,
+        33131: 20082,
+        33132: 20084,
+        33133: 20085,
+        33134: 20086,
+        33135: 20087,
+        33136: 20088,
+        33137: 20089,
+        33138: 20090,
+        33139: 20091,
+        33140: 20092,
+        33141: 20093,
+        33142: 20095,
+        33143: 20096,
+        33144: 20097,
+        33145: 20098,
+        33146: 20099,
+        33147: 20100,
+        33148: 20101,
+        33149: 20103,
+        33150: 20106,
+        33152: 20112,
+        33153: 20118,
+        33154: 20119,
+        33155: 20121,
+        33156: 20124,
+        33157: 20125,
+        33158: 20126,
+        33159: 20131,
+        33160: 20138,
+        33161: 20143,
+        33162: 20144,
+        33163: 20145,
+        33164: 20148,
+        33165: 20150,
+        33166: 20151,
+        33167: 20152,
+        33168: 20153,
+        33169: 20156,
+        33170: 20157,
+        33171: 20158,
+        33172: 20168,
+        33173: 20172,
+        33174: 20175,
+        33175: 20176,
+        33176: 20178,
+        33177: 20186,
+        33178: 20187,
+        33179: 20188,
+        33180: 20192,
+        33181: 20194,
+        33182: 20198,
+        33183: 20199,
+        33184: 20201,
+        33185: 20205,
+        33186: 20206,
+        33187: 20207,
+        33188: 20209,
+        33189: 20212,
+        33190: 20216,
+        33191: 20217,
+        33192: 20218,
+        33193: 20220,
+        33194: 20222,
+        33195: 20224,
+        33196: 20226,
+        33197: 20227,
+        33198: 20228,
+        33199: 20229,
+        33200: 20230,
+        33201: 20231,
+        33202: 20232,
+        33203: 20235,
+        33204: 20236,
+        33205: 20242,
+        33206: 20243,
+        33207: 20244,
+        33208: 20245,
+        34240: 21530,
+        34241: 21532,
+        34242: 21538,
+        34243: 21540,
+        34244: 21541,
+        34245: 21546,
+        34246: 21552,
+        34247: 21555,
+        34248: 21558,
+        34249: 21559,
+        34250: 21562,
+        34251: 21565,
+        34252: 21567,
+        34253: 21569,
+        34254: 21570,
+        34255: 21572,
+        34256: 21573,
+        34257: 21575,
+        34258: 21577,
+        34259: 21580,
+        34260: 21581,
+        34261: 21582,
+        34262: 21583,
+        34263: 21585,
+        34264: 21594,
+        34265: 21597,
+        34266: 21598,
+        34267: 21599,
+        34268: 21600,
+        34269: 21601,
+        34270: 21603,
+        34271: 21605,
+        34272: 21607,
+        34273: 21609,
+        34274: 21610,
+        34275: 21611,
+        34276: 21612,
+        34277: 21613,
+        34278: 21614,
+        34279: 21615,
+        34280: 21616,
+        34281: 21620,
+        34282: 21625,
+        34283: 21626,
+        34284: 21630,
+        34285: 21631,
+        34286: 21633,
+        34287: 21635,
+        34288: 21637,
+        34289: 21639,
+        34290: 21640,
+        34291: 21641,
+        34292: 21642,
+        34293: 21645,
+        34294: 21649,
+        34295: 21651,
+        34296: 21655,
+        34297: 21656,
+        34298: 21660,
+        34299: 21662,
+        34300: 21663,
+        34301: 21664,
+        34302: 21665,
+        34368: 21666,
+        34369: 21669,
+        34370: 21678,
+        34371: 21680,
+        34372: 21682,
+        34373: 21685,
+        34374: 21686,
+        34375: 21687,
+        34376: 21689,
+        34377: 21690,
+        34378: 21692,
+        34379: 21694,
+        34380: 21699,
+        34381: 21701,
+        34382: 21706,
+        34383: 21707,
+        34384: 21718,
+        34385: 21720,
+        34386: 21723,
+        34387: 21728,
+        34388: 21729,
+        34389: 21730,
+        34390: 21731,
+        34391: 21732,
+        34392: 21739,
+        34393: 21740,
+        34394: 21743,
+        34395: 21744,
+        34396: 21745,
+        34397: 21748,
+        34398: 21749,
+        34399: 21750,
+        34400: 21751,
+        34401: 21752,
+        34402: 21753,
+        34403: 21755,
+        34404: 21758,
+        34405: 21760,
+        34406: 21762,
+        34407: 21763,
+        34408: 21764,
+        34409: 21765,
+        34410: 21768,
+        34411: 21770,
+        34412: 21771,
+        34413: 21772,
+        34414: 21773,
+        34415: 21774,
+        34416: 21778,
+        34417: 21779,
+        34418: 21781,
+        34419: 21782,
+        34420: 21783,
+        34421: 21784,
+        34422: 21785,
+        34423: 21786,
+        34424: 21788,
+        34425: 21789,
+        34426: 21790,
+        34427: 21791,
+        34428: 21793,
+        34429: 21797,
+        34430: 21798,
+        34432: 21800,
+        34433: 21801,
+        34434: 21803,
+        34435: 21805,
+        34436: 21810,
+        34437: 21812,
+        34438: 21813,
+        34439: 21814,
+        34440: 21816,
+        34441: 21817,
+        34442: 21818,
+        34443: 21819,
+        34444: 21821,
+        34445: 21824,
+        34446: 21826,
+        34447: 21829,
+        34448: 21831,
+        34449: 21832,
+        34450: 21835,
+        34451: 21836,
+        34452: 21837,
+        34453: 21838,
+        34454: 21839,
+        34455: 21841,
+        34456: 21842,
+        34457: 21843,
+        34458: 21844,
+        34459: 21847,
+        34460: 21848,
+        34461: 21849,
+        34462: 21850,
+        34463: 21851,
+        34464: 21853,
+        34465: 21854,
+        34466: 21855,
+        34467: 21856,
+        34468: 21858,
+        34469: 21859,
+        34470: 21864,
+        34471: 21865,
+        34472: 21867,
+        34473: 21871,
+        34474: 21872,
+        34475: 21873,
+        34476: 21874,
+        34477: 21875,
+        34478: 21876,
+        34479: 21881,
+        34480: 21882,
+        34481: 21885,
+        34482: 21887,
+        34483: 21893,
+        34484: 21894,
+        34485: 21900,
+        34486: 21901,
+        34487: 21902,
+        34488: 21904,
+        34489: 21906,
+        34490: 21907,
+        34491: 21909,
+        34492: 21910,
+        34493: 21911,
+        34494: 21914,
+        34495: 21915,
+        34496: 21918,
+        34497: 21920,
+        34498: 21921,
+        34499: 21922,
+        34500: 21923,
+        34501: 21924,
+        34502: 21925,
+        34503: 21926,
+        34504: 21928,
+        34505: 21929,
+        34506: 21930,
+        34507: 21931,
+        34508: 21932,
+        34509: 21933,
+        34510: 21934,
+        34511: 21935,
+        34512: 21936,
+        34513: 21938,
+        34514: 21940,
+        34515: 21942,
+        34516: 21944,
+        34517: 21946,
+        34518: 21948,
+        34519: 21951,
+        34520: 21952,
+        34521: 21953,
+        34522: 21954,
+        34523: 21955,
+        34524: 21958,
+        34525: 21959,
+        34526: 21960,
+        34527: 21962,
+        34528: 21963,
+        34529: 21966,
+        34530: 21967,
+        34531: 21968,
+        34532: 21973,
+        34533: 21975,
+        34534: 21976,
+        34535: 21977,
+        34536: 21978,
+        34537: 21979,
+        34538: 21982,
+        34539: 21984,
+        34540: 21986,
+        34541: 21991,
+        34542: 21993,
+        34543: 21997,
+        34544: 21998,
+        34545: 22000,
+        34546: 22001,
+        34547: 22004,
+        34548: 22006,
+        34549: 22008,
+        34550: 22009,
+        34551: 22010,
+        34552: 22011,
+        34553: 22012,
+        34554: 22015,
+        34555: 22018,
+        34556: 22019,
+        34557: 22020,
+        34558: 22021,
+        34624: 22022,
+        34625: 22023,
+        34626: 22026,
+        34627: 22027,
+        34628: 22029,
+        34629: 22032,
+        34630: 22033,
+        34631: 22034,
+        34632: 22035,
+        34633: 22036,
+        34634: 22037,
+        34635: 22038,
+        34636: 22039,
+        34637: 22041,
+        34638: 22042,
+        34639: 22044,
+        34640: 22045,
+        34641: 22048,
+        34642: 22049,
+        34643: 22050,
+        34644: 22053,
+        34645: 22054,
+        34646: 22056,
+        34647: 22057,
+        34648: 22058,
+        34649: 22059,
+        34650: 22062,
+        34651: 22063,
+        34652: 22064,
+        34653: 22067,
+        34654: 22069,
+        34655: 22071,
+        34656: 22072,
+        34657: 22074,
+        34658: 22076,
+        34659: 22077,
+        34660: 22078,
+        34661: 22080,
+        34662: 22081,
+        34663: 22082,
+        34664: 22083,
+        34665: 22084,
+        34666: 22085,
+        34667: 22086,
+        34668: 22087,
+        34669: 22088,
+        34670: 22089,
+        34671: 22090,
+        34672: 22091,
+        34673: 22095,
+        34674: 22096,
+        34675: 22097,
+        34676: 22098,
+        34677: 22099,
+        34678: 22101,
+        34679: 22102,
+        34680: 22106,
+        34681: 22107,
+        34682: 22109,
+        34683: 22110,
+        34684: 22111,
+        34685: 22112,
+        34686: 22113,
+        34688: 22115,
+        34689: 22117,
+        34690: 22118,
+        34691: 22119,
+        34692: 22125,
+        34693: 22126,
+        34694: 22127,
+        34695: 22128,
+        34696: 22130,
+        34697: 22131,
+        34698: 22132,
+        34699: 22133,
+        34700: 22135,
+        34701: 22136,
+        34702: 22137,
+        34703: 22138,
+        34704: 22141,
+        34705: 22142,
+        34706: 22143,
+        34707: 22144,
+        34708: 22145,
+        34709: 22146,
+        34710: 22147,
+        34711: 22148,
+        34712: 22151,
+        34713: 22152,
+        34714: 22153,
+        34715: 22154,
+        34716: 22155,
+        34717: 22156,
+        34718: 22157,
+        34719: 22160,
+        34720: 22161,
+        34721: 22162,
+        34722: 22164,
+        34723: 22165,
+        34724: 22166,
+        34725: 22167,
+        34726: 22168,
+        34727: 22169,
+        34728: 22170,
+        34729: 22171,
+        34730: 22172,
+        34731: 22173,
+        34732: 22174,
+        34733: 22175,
+        34734: 22176,
+        34735: 22177,
+        34736: 22178,
+        34737: 22180,
+        34738: 22181,
+        34739: 22182,
+        34740: 22183,
+        34741: 22184,
+        34742: 22185,
+        34743: 22186,
+        34744: 22187,
+        34745: 22188,
+        34746: 22189,
+        34747: 22190,
+        34748: 22192,
+        34749: 22193,
+        34750: 22194,
+        34751: 22195,
+        34752: 22196,
+        34753: 22197,
+        34754: 22198,
+        34755: 22200,
+        34756: 22201,
+        34757: 22202,
+        34758: 22203,
+        34759: 22205,
+        34760: 22206,
+        34761: 22207,
+        34762: 22208,
+        34763: 22209,
+        34764: 22210,
+        34765: 22211,
+        34766: 22212,
+        34767: 22213,
+        34768: 22214,
+        34769: 22215,
+        34770: 22216,
+        34771: 22217,
+        34772: 22219,
+        34773: 22220,
+        34774: 22221,
+        34775: 22222,
+        34776: 22223,
+        34777: 22224,
+        34778: 22225,
+        34779: 22226,
+        34780: 22227,
+        34781: 22229,
+        34782: 22230,
+        34783: 22232,
+        34784: 22233,
+        34785: 22236,
+        34786: 22243,
+        34787: 22245,
+        34788: 22246,
+        34789: 22247,
+        34790: 22248,
+        34791: 22249,
+        34792: 22250,
+        34793: 22252,
+        34794: 22254,
+        34795: 22255,
+        34796: 22258,
+        34797: 22259,
+        34798: 22262,
+        34799: 22263,
+        34800: 22264,
+        34801: 22267,
+        34802: 22268,
+        34803: 22272,
+        34804: 22273,
+        34805: 22274,
+        34806: 22277,
+        34807: 22279,
+        34808: 22283,
+        34809: 22284,
+        34810: 22285,
+        34811: 22286,
+        34812: 22287,
+        34813: 22288,
+        34814: 22289,
+        34880: 22290,
+        34881: 22291,
+        34882: 22292,
+        34883: 22293,
+        34884: 22294,
+        34885: 22295,
+        34886: 22296,
+        34887: 22297,
+        34888: 22298,
+        34889: 22299,
+        34890: 22301,
+        34891: 22302,
+        34892: 22304,
+        34893: 22305,
+        34894: 22306,
+        34895: 22308,
+        34896: 22309,
+        34897: 22310,
+        34898: 22311,
+        34899: 22315,
+        34900: 22321,
+        34901: 22322,
+        34902: 22324,
+        34903: 22325,
+        34904: 22326,
+        34905: 22327,
+        34906: 22328,
+        34907: 22332,
+        34908: 22333,
+        34909: 22335,
+        34910: 22337,
+        34911: 22339,
+        34912: 22340,
+        34913: 22341,
+        34914: 22342,
+        34915: 22344,
+        34916: 22345,
+        34917: 22347,
+        34918: 22354,
+        34919: 22355,
+        34920: 22356,
+        34921: 22357,
+        34922: 22358,
+        34923: 22360,
+        34924: 22361,
+        34925: 22370,
+        34926: 22371,
+        34927: 22373,
+        34928: 22375,
+        34929: 22380,
+        34930: 22382,
+        34931: 22384,
+        34932: 22385,
+        34933: 22386,
+        34934: 22388,
+        34935: 22389,
+        34936: 22392,
+        34937: 22393,
+        34938: 22394,
+        34939: 22397,
+        34940: 22398,
+        34941: 22399,
+        34942: 22400,
+        34944: 22401,
+        34945: 22407,
+        34946: 22408,
+        34947: 22409,
+        34948: 22410,
+        34949: 22413,
+        34950: 22414,
+        34951: 22415,
+        34952: 22416,
+        34953: 22417,
+        34954: 22420,
+        34955: 22421,
+        34956: 22422,
+        34957: 22423,
+        34958: 22424,
+        34959: 22425,
+        34960: 22426,
+        34961: 22428,
+        34962: 22429,
+        34963: 22430,
+        34964: 22431,
+        34965: 22437,
+        34966: 22440,
+        34967: 22442,
+        34968: 22444,
+        34969: 22447,
+        34970: 22448,
+        34971: 22449,
+        34972: 22451,
+        34973: 22453,
+        34974: 22454,
+        34975: 22455,
+        34976: 22457,
+        34977: 22458,
+        34978: 22459,
+        34979: 22460,
+        34980: 22461,
+        34981: 22462,
+        34982: 22463,
+        34983: 22464,
+        34984: 22465,
+        34985: 22468,
+        34986: 22469,
+        34987: 22470,
+        34988: 22471,
+        34989: 22472,
+        34990: 22473,
+        34991: 22474,
+        34992: 22476,
+        34993: 22477,
+        34994: 22480,
+        34995: 22481,
+        34996: 22483,
+        34997: 22486,
+        34998: 22487,
+        34999: 22491,
+        35000: 22492,
+        35001: 22494,
+        35002: 22497,
+        35003: 22498,
+        35004: 22499,
+        35005: 22501,
+        35006: 22502,
+        35007: 22503,
+        35008: 22504,
+        35009: 22505,
+        35010: 22506,
+        35011: 22507,
+        35012: 22508,
+        35013: 22510,
+        35014: 22512,
+        35015: 22513,
+        35016: 22514,
+        35017: 22515,
+        35018: 22517,
+        35019: 22518,
+        35020: 22519,
+        35021: 22523,
+        35022: 22524,
+        35023: 22526,
+        35024: 22527,
+        35025: 22529,
+        35026: 22531,
+        35027: 22532,
+        35028: 22533,
+        35029: 22536,
+        35030: 22537,
+        35031: 22538,
+        35032: 22540,
+        35033: 22542,
+        35034: 22543,
+        35035: 22544,
+        35036: 22546,
+        35037: 22547,
+        35038: 22548,
+        35039: 22550,
+        35040: 22551,
+        35041: 22552,
+        35042: 22554,
+        35043: 22555,
+        35044: 22556,
+        35045: 22557,
+        35046: 22559,
+        35047: 22562,
+        35048: 22563,
+        35049: 22565,
+        35050: 22566,
+        35051: 22567,
+        35052: 22568,
+        35053: 22569,
+        35054: 22571,
+        35055: 22572,
+        35056: 22573,
+        35057: 22574,
+        35058: 22575,
+        35059: 22577,
+        35060: 22578,
+        35061: 22579,
+        35062: 22580,
+        35063: 22582,
+        35064: 22583,
+        35065: 22584,
+        35066: 22585,
+        35067: 22586,
+        35068: 22587,
+        35069: 22588,
+        35070: 22589,
+        35136: 22590,
+        35137: 22591,
+        35138: 22592,
+        35139: 22593,
+        35140: 22594,
+        35141: 22595,
+        35142: 22597,
+        35143: 22598,
+        35144: 22599,
+        35145: 22600,
+        35146: 22601,
+        35147: 22602,
+        35148: 22603,
+        35149: 22606,
+        35150: 22607,
+        35151: 22608,
+        35152: 22610,
+        35153: 22611,
+        35154: 22613,
+        35155: 22614,
+        35156: 22615,
+        35157: 22617,
+        35158: 22618,
+        35159: 22619,
+        35160: 22620,
+        35161: 22621,
+        35162: 22623,
+        35163: 22624,
+        35164: 22625,
+        35165: 22626,
+        35166: 22627,
+        35167: 22628,
+        35168: 22630,
+        35169: 22631,
+        35170: 22632,
+        35171: 22633,
+        35172: 22634,
+        35173: 22637,
+        35174: 22638,
+        35175: 22639,
+        35176: 22640,
+        35177: 22641,
+        35178: 22642,
+        35179: 22643,
+        35180: 22644,
+        35181: 22645,
+        35182: 22646,
+        35183: 22647,
+        35184: 22648,
+        35185: 22649,
+        35186: 22650,
+        35187: 22651,
+        35188: 22652,
+        35189: 22653,
+        35190: 22655,
+        35191: 22658,
+        35192: 22660,
+        35193: 22662,
+        35194: 22663,
+        35195: 22664,
+        35196: 22666,
+        35197: 22667,
+        35198: 22668,
+        35200: 22669,
+        35201: 22670,
+        35202: 22671,
+        35203: 22672,
+        35204: 22673,
+        35205: 22676,
+        35206: 22677,
+        35207: 22678,
+        35208: 22679,
+        35209: 22680,
+        35210: 22683,
+        35211: 22684,
+        35212: 22685,
+        35213: 22688,
+        35214: 22689,
+        35215: 22690,
+        35216: 22691,
+        35217: 22692,
+        35218: 22693,
+        35219: 22694,
+        35220: 22695,
+        35221: 22698,
+        35222: 22699,
+        35223: 22700,
+        35224: 22701,
+        35225: 22702,
+        35226: 22703,
+        35227: 22704,
+        35228: 22705,
+        35229: 22706,
+        35230: 22707,
+        35231: 22708,
+        35232: 22709,
+        35233: 22710,
+        35234: 22711,
+        35235: 22712,
+        35236: 22713,
+        35237: 22714,
+        35238: 22715,
+        35239: 22717,
+        35240: 22718,
+        35241: 22719,
+        35242: 22720,
+        35243: 22722,
+        35244: 22723,
+        35245: 22724,
+        35246: 22726,
+        35247: 22727,
+        35248: 22728,
+        35249: 22729,
+        35250: 22730,
+        35251: 22731,
+        35252: 22732,
+        35253: 22733,
+        35254: 22734,
+        35255: 22735,
+        35256: 22736,
+        35257: 22738,
+        35258: 22739,
+        35259: 22740,
+        35260: 22742,
+        35261: 22743,
+        35262: 22744,
+        35263: 22745,
+        35264: 22746,
+        35265: 22747,
+        35266: 22748,
+        35267: 22749,
+        35268: 22750,
+        35269: 22751,
+        35270: 22752,
+        35271: 22753,
+        35272: 22754,
+        35273: 22755,
+        35274: 22757,
+        35275: 22758,
+        35276: 22759,
+        35277: 22760,
+        35278: 22761,
+        35279: 22762,
+        35280: 22765,
+        35281: 22767,
+        35282: 22769,
+        35283: 22770,
+        35284: 22772,
+        35285: 22773,
+        35286: 22775,
+        35287: 22776,
+        35288: 22778,
+        35289: 22779,
+        35290: 22780,
+        35291: 22781,
+        35292: 22782,
+        35293: 22783,
+        35294: 22784,
+        35295: 22785,
+        35296: 22787,
+        35297: 22789,
+        35298: 22790,
+        35299: 22792,
+        35300: 22793,
+        35301: 22794,
+        35302: 22795,
+        35303: 22796,
+        35304: 22798,
+        35305: 22800,
+        35306: 22801,
+        35307: 22802,
+        35308: 22803,
+        35309: 22807,
+        35310: 22808,
+        35311: 22811,
+        35312: 22813,
+        35313: 22814,
+        35314: 22816,
+        35315: 22817,
+        35316: 22818,
+        35317: 22819,
+        35318: 22822,
+        35319: 22824,
+        35320: 22828,
+        35321: 22832,
+        35322: 22834,
+        35323: 22835,
+        35324: 22837,
+        35325: 22838,
+        35326: 22843,
+        35392: 22845,
+        35393: 22846,
+        35394: 22847,
+        35395: 22848,
+        35396: 22851,
+        35397: 22853,
+        35398: 22854,
+        35399: 22858,
+        35400: 22860,
+        35401: 22861,
+        35402: 22864,
+        35403: 22866,
+        35404: 22867,
+        35405: 22873,
+        35406: 22875,
+        35407: 22876,
+        35408: 22877,
+        35409: 22878,
+        35410: 22879,
+        35411: 22881,
+        35412: 22883,
+        35413: 22884,
+        35414: 22886,
+        35415: 22887,
+        35416: 22888,
+        35417: 22889,
+        35418: 22890,
+        35419: 22891,
+        35420: 22892,
+        35421: 22893,
+        35422: 22894,
+        35423: 22895,
+        35424: 22896,
+        35425: 22897,
+        35426: 22898,
+        35427: 22901,
+        35428: 22903,
+        35429: 22906,
+        35430: 22907,
+        35431: 22908,
+        35432: 22910,
+        35433: 22911,
+        35434: 22912,
+        35435: 22917,
+        35436: 22921,
+        35437: 22923,
+        35438: 22924,
+        35439: 22926,
+        35440: 22927,
+        35441: 22928,
+        35442: 22929,
+        35443: 22932,
+        35444: 22933,
+        35445: 22936,
+        35446: 22938,
+        35447: 22939,
+        35448: 22940,
+        35449: 22941,
+        35450: 22943,
+        35451: 22944,
+        35452: 22945,
+        35453: 22946,
+        35454: 22950,
+        35456: 22951,
+        35457: 22956,
+        35458: 22957,
+        35459: 22960,
+        35460: 22961,
+        35461: 22963,
+        35462: 22964,
+        35463: 22965,
+        35464: 22966,
+        35465: 22967,
+        35466: 22968,
+        35467: 22970,
+        35468: 22972,
+        35469: 22973,
+        35470: 22975,
+        35471: 22976,
+        35472: 22977,
+        35473: 22978,
+        35474: 22979,
+        35475: 22980,
+        35476: 22981,
+        35477: 22983,
+        35478: 22984,
+        35479: 22985,
+        35480: 22988,
+        35481: 22989,
+        35482: 22990,
+        35483: 22991,
+        35484: 22997,
+        35485: 22998,
+        35486: 23001,
+        35487: 23003,
+        35488: 23006,
+        35489: 23007,
+        35490: 23008,
+        35491: 23009,
+        35492: 23010,
+        35493: 23012,
+        35494: 23014,
+        35495: 23015,
+        35496: 23017,
+        35497: 23018,
+        35498: 23019,
+        35499: 23021,
+        35500: 23022,
+        35501: 23023,
+        35502: 23024,
+        35503: 23025,
+        35504: 23026,
+        35505: 23027,
+        35506: 23028,
+        35507: 23029,
+        35508: 23030,
+        35509: 23031,
+        35510: 23032,
+        35511: 23034,
+        35512: 23036,
+        35513: 23037,
+        35514: 23038,
+        35515: 23040,
+        35516: 23042,
+        35517: 23050,
+        35518: 23051,
+        35519: 23053,
+        35520: 23054,
+        35521: 23055,
+        35522: 23056,
+        35523: 23058,
+        35524: 23060,
+        35525: 23061,
+        35526: 23062,
+        35527: 23063,
+        35528: 23065,
+        35529: 23066,
+        35530: 23067,
+        35531: 23069,
+        35532: 23070,
+        35533: 23073,
+        35534: 23074,
+        35535: 23076,
+        35536: 23078,
+        35537: 23079,
+        35538: 23080,
+        35539: 23082,
+        35540: 23083,
+        35541: 23084,
+        35542: 23085,
+        35543: 23086,
+        35544: 23087,
+        35545: 23088,
+        35546: 23091,
+        35547: 23093,
+        35548: 23095,
+        35549: 23096,
+        35550: 23097,
+        35551: 23098,
+        35552: 23099,
+        35553: 23101,
+        35554: 23102,
+        35555: 23103,
+        35556: 23105,
+        35557: 23106,
+        35558: 23107,
+        35559: 23108,
+        35560: 23109,
+        35561: 23111,
+        35562: 23112,
+        35563: 23115,
+        35564: 23116,
+        35565: 23117,
+        35566: 23118,
+        35567: 23119,
+        35568: 23120,
+        35569: 23121,
+        35570: 23122,
+        35571: 23123,
+        35572: 23124,
+        35573: 23126,
+        35574: 23127,
+        35575: 23128,
+        35576: 23129,
+        35577: 23131,
+        35578: 23132,
+        35579: 23133,
+        35580: 23134,
+        35581: 23135,
+        35582: 23136,
+        35648: 23137,
+        35649: 23139,
+        35650: 23140,
+        35651: 23141,
+        35652: 23142,
+        35653: 23144,
+        35654: 23145,
+        35655: 23147,
+        35656: 23148,
+        35657: 23149,
+        35658: 23150,
+        35659: 23151,
+        35660: 23152,
+        35661: 23153,
+        35662: 23154,
+        35663: 23155,
+        35664: 23160,
+        35665: 23161,
+        35666: 23163,
+        35667: 23164,
+        35668: 23165,
+        35669: 23166,
+        35670: 23168,
+        35671: 23169,
+        35672: 23170,
+        35673: 23171,
+        35674: 23172,
+        35675: 23173,
+        35676: 23174,
+        35677: 23175,
+        35678: 23176,
+        35679: 23177,
+        35680: 23178,
+        35681: 23179,
+        35682: 23180,
+        35683: 23181,
+        35684: 23182,
+        35685: 23183,
+        35686: 23184,
+        35687: 23185,
+        35688: 23187,
+        35689: 23188,
+        35690: 23189,
+        35691: 23190,
+        35692: 23191,
+        35693: 23192,
+        35694: 23193,
+        35695: 23196,
+        35696: 23197,
+        35697: 23198,
+        35698: 23199,
+        35699: 23200,
+        35700: 23201,
+        35701: 23202,
+        35702: 23203,
+        35703: 23204,
+        35704: 23205,
+        35705: 23206,
+        35706: 23207,
+        35707: 23208,
+        35708: 23209,
+        35709: 23211,
+        35710: 23212,
+        35712: 23213,
+        35713: 23214,
+        35714: 23215,
+        35715: 23216,
+        35716: 23217,
+        35717: 23220,
+        35718: 23222,
+        35719: 23223,
+        35720: 23225,
+        35721: 23226,
+        35722: 23227,
+        35723: 23228,
+        35724: 23229,
+        35725: 23231,
+        35726: 23232,
+        35727: 23235,
+        35728: 23236,
+        35729: 23237,
+        35730: 23238,
+        35731: 23239,
+        35732: 23240,
+        35733: 23242,
+        35734: 23243,
+        35735: 23245,
+        35736: 23246,
+        35737: 23247,
+        35738: 23248,
+        35739: 23249,
+        35740: 23251,
+        35741: 23253,
+        35742: 23255,
+        35743: 23257,
+        35744: 23258,
+        35745: 23259,
+        35746: 23261,
+        35747: 23262,
+        35748: 23263,
+        35749: 23266,
+        35750: 23268,
+        35751: 23269,
+        35752: 23271,
+        35753: 23272,
+        35754: 23274,
+        35755: 23276,
+        35756: 23277,
+        35757: 23278,
+        35758: 23279,
+        35759: 23280,
+        35760: 23282,
+        35761: 23283,
+        35762: 23284,
+        35763: 23285,
+        35764: 23286,
+        35765: 23287,
+        35766: 23288,
+        35767: 23289,
+        35768: 23290,
+        35769: 23291,
+        35770: 23292,
+        35771: 23293,
+        35772: 23294,
+        35773: 23295,
+        35774: 23296,
+        35775: 23297,
+        35776: 23298,
+        35777: 23299,
+        35778: 23300,
+        35779: 23301,
+        35780: 23302,
+        35781: 23303,
+        35782: 23304,
+        35783: 23306,
+        35784: 23307,
+        35785: 23308,
+        35786: 23309,
+        35787: 23310,
+        35788: 23311,
+        35789: 23312,
+        35790: 23313,
+        35791: 23314,
+        35792: 23315,
+        35793: 23316,
+        35794: 23317,
+        35795: 23320,
+        35796: 23321,
+        35797: 23322,
+        35798: 23323,
+        35799: 23324,
+        35800: 23325,
+        35801: 23326,
+        35802: 23327,
+        35803: 23328,
+        35804: 23329,
+        35805: 23330,
+        35806: 23331,
+        35807: 23332,
+        35808: 23333,
+        35809: 23334,
+        35810: 23335,
+        35811: 23336,
+        35812: 23337,
+        35813: 23338,
+        35814: 23339,
+        35815: 23340,
+        35816: 23341,
+        35817: 23342,
+        35818: 23343,
+        35819: 23344,
+        35820: 23345,
+        35821: 23347,
+        35822: 23349,
+        35823: 23350,
+        35824: 23352,
+        35825: 23353,
+        35826: 23354,
+        35827: 23355,
+        35828: 23356,
+        35829: 23357,
+        35830: 23358,
+        35831: 23359,
+        35832: 23361,
+        35833: 23362,
+        35834: 23363,
+        35835: 23364,
+        35836: 23365,
+        35837: 23366,
+        35838: 23367,
+        35904: 23368,
+        35905: 23369,
+        35906: 23370,
+        35907: 23371,
+        35908: 23372,
+        35909: 23373,
+        35910: 23374,
+        35911: 23375,
+        35912: 23378,
+        35913: 23382,
+        35914: 23390,
+        35915: 23392,
+        35916: 23393,
+        35917: 23399,
+        35918: 23400,
+        35919: 23403,
+        35920: 23405,
+        35921: 23406,
+        35922: 23407,
+        35923: 23410,
+        35924: 23412,
+        35925: 23414,
+        35926: 23415,
+        35927: 23416,
+        35928: 23417,
+        35929: 23419,
+        35930: 23420,
+        35931: 23422,
+        35932: 23423,
+        35933: 23426,
+        35934: 23430,
+        35935: 23434,
+        35936: 23437,
+        35937: 23438,
+        35938: 23440,
+        35939: 23441,
+        35940: 23442,
+        35941: 23444,
+        35942: 23446,
+        35943: 23455,
+        35944: 23463,
+        35945: 23464,
+        35946: 23465,
+        35947: 23468,
+        35948: 23469,
+        35949: 23470,
+        35950: 23471,
+        35951: 23473,
+        35952: 23474,
+        35953: 23479,
+        35954: 23482,
+        35955: 23483,
+        35956: 23484,
+        35957: 23488,
+        35958: 23489,
+        35959: 23491,
+        35960: 23496,
+        35961: 23497,
+        35962: 23498,
+        35963: 23499,
+        35964: 23501,
+        35965: 23502,
+        35966: 23503,
+        35968: 23505,
+        35969: 23508,
+        35970: 23509,
+        35971: 23510,
+        35972: 23511,
+        35973: 23512,
+        35974: 23513,
+        35975: 23514,
+        35976: 23515,
+        35977: 23516,
+        35978: 23520,
+        35979: 23522,
+        35980: 23523,
+        35981: 23526,
+        35982: 23527,
+        35983: 23529,
+        35984: 23530,
+        35985: 23531,
+        35986: 23532,
+        35987: 23533,
+        35988: 23535,
+        35989: 23537,
+        35990: 23538,
+        35991: 23539,
+        35992: 23540,
+        35993: 23541,
+        35994: 23542,
+        35995: 23543,
+        35996: 23549,
+        35997: 23550,
+        35998: 23552,
+        35999: 23554,
+        36000: 23555,
+        36001: 23557,
+        36002: 23559,
+        36003: 23560,
+        36004: 23563,
+        36005: 23564,
+        36006: 23565,
+        36007: 23566,
+        36008: 23568,
+        36009: 23570,
+        36010: 23571,
+        36011: 23575,
+        36012: 23577,
+        36013: 23579,
+        36014: 23582,
+        36015: 23583,
+        36016: 23584,
+        36017: 23585,
+        36018: 23587,
+        36019: 23590,
+        36020: 23592,
+        36021: 23593,
+        36022: 23594,
+        36023: 23595,
+        36024: 23597,
+        36025: 23598,
+        36026: 23599,
+        36027: 23600,
+        36028: 23602,
+        36029: 23603,
+        36030: 23605,
+        36031: 23606,
+        36032: 23607,
+        36033: 23619,
+        36034: 23620,
+        36035: 23622,
+        36036: 23623,
+        36037: 23628,
+        36038: 23629,
+        36039: 23634,
+        36040: 23635,
+        36041: 23636,
+        36042: 23638,
+        36043: 23639,
+        36044: 23640,
+        36045: 23642,
+        36046: 23643,
+        36047: 23644,
+        36048: 23645,
+        36049: 23647,
+        36050: 23650,
+        36051: 23652,
+        36052: 23655,
+        36053: 23656,
+        36054: 23657,
+        36055: 23658,
+        36056: 23659,
+        36057: 23660,
+        36058: 23661,
+        36059: 23664,
+        36060: 23666,
+        36061: 23667,
+        36062: 23668,
+        36063: 23669,
+        36064: 23670,
+        36065: 23671,
+        36066: 23672,
+        36067: 23675,
+        36068: 23676,
+        36069: 23677,
+        36070: 23678,
+        36071: 23680,
+        36072: 23683,
+        36073: 23684,
+        36074: 23685,
+        36075: 23686,
+        36076: 23687,
+        36077: 23689,
+        36078: 23690,
+        36079: 23691,
+        36080: 23694,
+        36081: 23695,
+        36082: 23698,
+        36083: 23699,
+        36084: 23701,
+        36085: 23709,
+        36086: 23710,
+        36087: 23711,
+        36088: 23712,
+        36089: 23713,
+        36090: 23716,
+        36091: 23717,
+        36092: 23718,
+        36093: 23719,
+        36094: 23720,
+        36160: 23722,
+        36161: 23726,
+        36162: 23727,
+        36163: 23728,
+        36164: 23730,
+        36165: 23732,
+        36166: 23734,
+        36167: 23737,
+        36168: 23738,
+        36169: 23739,
+        36170: 23740,
+        36171: 23742,
+        36172: 23744,
+        36173: 23746,
+        36174: 23747,
+        36175: 23749,
+        36176: 23750,
+        36177: 23751,
+        36178: 23752,
+        36179: 23753,
+        36180: 23754,
+        36181: 23756,
+        36182: 23757,
+        36183: 23758,
+        36184: 23759,
+        36185: 23760,
+        36186: 23761,
+        36187: 23763,
+        36188: 23764,
+        36189: 23765,
+        36190: 23766,
+        36191: 23767,
+        36192: 23768,
+        36193: 23770,
+        36194: 23771,
+        36195: 23772,
+        36196: 23773,
+        36197: 23774,
+        36198: 23775,
+        36199: 23776,
+        36200: 23778,
+        36201: 23779,
+        36202: 23783,
+        36203: 23785,
+        36204: 23787,
+        36205: 23788,
+        36206: 23790,
+        36207: 23791,
+        36208: 23793,
+        36209: 23794,
+        36210: 23795,
+        36211: 23796,
+        36212: 23797,
+        36213: 23798,
+        36214: 23799,
+        36215: 23800,
+        36216: 23801,
+        36217: 23802,
+        36218: 23804,
+        36219: 23805,
+        36220: 23806,
+        36221: 23807,
+        36222: 23808,
+        36224: 23809,
+        36225: 23812,
+        36226: 23813,
+        36227: 23816,
+        36228: 23817,
+        36229: 23818,
+        36230: 23819,
+        36231: 23820,
+        36232: 23821,
+        36233: 23823,
+        36234: 23824,
+        36235: 23825,
+        36236: 23826,
+        36237: 23827,
+        36238: 23829,
+        36239: 23831,
+        36240: 23832,
+        36241: 23833,
+        36242: 23834,
+        36243: 23836,
+        36244: 23837,
+        36245: 23839,
+        36246: 23840,
+        36247: 23841,
+        36248: 23842,
+        36249: 23843,
+        36250: 23845,
+        36251: 23848,
+        36252: 23850,
+        36253: 23851,
+        36254: 23852,
+        36255: 23855,
+        36256: 23856,
+        36257: 23857,
+        36258: 23858,
+        36259: 23859,
+        36260: 23861,
+        36261: 23862,
+        36262: 23863,
+        36263: 23864,
+        36264: 23865,
+        36265: 23866,
+        36266: 23867,
+        36267: 23868,
+        36268: 23871,
+        36269: 23872,
+        36270: 23873,
+        36271: 23874,
+        36272: 23875,
+        36273: 23876,
+        36274: 23877,
+        36275: 23878,
+        36276: 23880,
+        36277: 23881,
+        36278: 23885,
+        36279: 23886,
+        36280: 23887,
+        36281: 23888,
+        36282: 23889,
+        36283: 23890,
+        36284: 23891,
+        36285: 23892,
+        36286: 23893,
+        36287: 23894,
+        36288: 23895,
+        36289: 23897,
+        36290: 23898,
+        36291: 23900,
+        36292: 23902,
+        36293: 23903,
+        36294: 23904,
+        36295: 23905,
+        36296: 23906,
+        36297: 23907,
+        36298: 23908,
+        36299: 23909,
+        36300: 23910,
+        36301: 23911,
+        36302: 23912,
+        36303: 23914,
+        36304: 23917,
+        36305: 23918,
+        36306: 23920,
+        36307: 23921,
+        36308: 23922,
+        36309: 23923,
+        36310: 23925,
+        36311: 23926,
+        36312: 23927,
+        36313: 23928,
+        36314: 23929,
+        36315: 23930,
+        36316: 23931,
+        36317: 23932,
+        36318: 23933,
+        36319: 23934,
+        36320: 23935,
+        36321: 23936,
+        36322: 23937,
+        36323: 23939,
+        36324: 23940,
+        36325: 23941,
+        36326: 23942,
+        36327: 23943,
+        36328: 23944,
+        36329: 23945,
+        36330: 23946,
+        36331: 23947,
+        36332: 23948,
+        36333: 23949,
+        36334: 23950,
+        36335: 23951,
+        36336: 23952,
+        36337: 23953,
+        36338: 23954,
+        36339: 23955,
+        36340: 23956,
+        36341: 23957,
+        36342: 23958,
+        36343: 23959,
+        36344: 23960,
+        36345: 23962,
+        36346: 23963,
+        36347: 23964,
+        36348: 23966,
+        36349: 23967,
+        36350: 23968,
+        36416: 23969,
+        36417: 23970,
+        36418: 23971,
+        36419: 23972,
+        36420: 23973,
+        36421: 23974,
+        36422: 23975,
+        36423: 23976,
+        36424: 23977,
+        36425: 23978,
+        36426: 23979,
+        36427: 23980,
+        36428: 23981,
+        36429: 23982,
+        36430: 23983,
+        36431: 23984,
+        36432: 23985,
+        36433: 23986,
+        36434: 23987,
+        36435: 23988,
+        36436: 23989,
+        36437: 23990,
+        36438: 23992,
+        36439: 23993,
+        36440: 23994,
+        36441: 23995,
+        36442: 23996,
+        36443: 23997,
+        36444: 23998,
+        36445: 23999,
+        36446: 24000,
+        36447: 24001,
+        36448: 24002,
+        36449: 24003,
+        36450: 24004,
+        36451: 24006,
+        36452: 24007,
+        36453: 24008,
+        36454: 24009,
+        36455: 24010,
+        36456: 24011,
+        36457: 24012,
+        36458: 24014,
+        36459: 24015,
+        36460: 24016,
+        36461: 24017,
+        36462: 24018,
+        36463: 24019,
+        36464: 24020,
+        36465: 24021,
+        36466: 24022,
+        36467: 24023,
+        36468: 24024,
+        36469: 24025,
+        36470: 24026,
+        36471: 24028,
+        36472: 24031,
+        36473: 24032,
+        36474: 24035,
+        36475: 24036,
+        36476: 24042,
+        36477: 24044,
+        36478: 24045,
+        36480: 24048,
+        36481: 24053,
+        36482: 24054,
+        36483: 24056,
+        36484: 24057,
+        36485: 24058,
+        36486: 24059,
+        36487: 24060,
+        36488: 24063,
+        36489: 24064,
+        36490: 24068,
+        36491: 24071,
+        36492: 24073,
+        36493: 24074,
+        36494: 24075,
+        36495: 24077,
+        36496: 24078,
+        36497: 24082,
+        36498: 24083,
+        36499: 24087,
+        36500: 24094,
+        36501: 24095,
+        36502: 24096,
+        36503: 24097,
+        36504: 24098,
+        36505: 24099,
+        36506: 24100,
+        36507: 24101,
+        36508: 24104,
+        36509: 24105,
+        36510: 24106,
+        36511: 24107,
+        36512: 24108,
+        36513: 24111,
+        36514: 24112,
+        36515: 24114,
+        36516: 24115,
+        36517: 24116,
+        36518: 24117,
+        36519: 24118,
+        36520: 24121,
+        36521: 24122,
+        36522: 24126,
+        36523: 24127,
+        36524: 24128,
+        36525: 24129,
+        36526: 24131,
+        36527: 24134,
+        36528: 24135,
+        36529: 24136,
+        36530: 24137,
+        36531: 24138,
+        36532: 24139,
+        36533: 24141,
+        36534: 24142,
+        36535: 24143,
+        36536: 24144,
+        36537: 24145,
+        36538: 24146,
+        36539: 24147,
+        36540: 24150,
+        36541: 24151,
+        36542: 24152,
+        36543: 24153,
+        36544: 24154,
+        36545: 24156,
+        36546: 24157,
+        36547: 24159,
+        36548: 24160,
+        36549: 24163,
+        36550: 24164,
+        36551: 24165,
+        36552: 24166,
+        36553: 24167,
+        36554: 24168,
+        36555: 24169,
+        36556: 24170,
+        36557: 24171,
+        36558: 24172,
+        36559: 24173,
+        36560: 24174,
+        36561: 24175,
+        36562: 24176,
+        36563: 24177,
+        36564: 24181,
+        36565: 24183,
+        36566: 24185,
+        36567: 24190,
+        36568: 24193,
+        36569: 24194,
+        36570: 24195,
+        36571: 24197,
+        36572: 24200,
+        36573: 24201,
+        36574: 24204,
+        36575: 24205,
+        36576: 24206,
+        36577: 24210,
+        36578: 24216,
+        36579: 24219,
+        36580: 24221,
+        36581: 24225,
+        36582: 24226,
+        36583: 24227,
+        36584: 24228,
+        36585: 24232,
+        36586: 24233,
+        36587: 24234,
+        36588: 24235,
+        36589: 24236,
+        36590: 24238,
+        36591: 24239,
+        36592: 24240,
+        36593: 24241,
+        36594: 24242,
+        36595: 24244,
+        36596: 24250,
+        36597: 24251,
+        36598: 24252,
+        36599: 24253,
+        36600: 24255,
+        36601: 24256,
+        36602: 24257,
+        36603: 24258,
+        36604: 24259,
+        36605: 24260,
+        36606: 24261,
+        36672: 24262,
+        36673: 24263,
+        36674: 24264,
+        36675: 24267,
+        36676: 24268,
+        36677: 24269,
+        36678: 24270,
+        36679: 24271,
+        36680: 24272,
+        36681: 24276,
+        36682: 24277,
+        36683: 24279,
+        36684: 24280,
+        36685: 24281,
+        36686: 24282,
+        36687: 24284,
+        36688: 24285,
+        36689: 24286,
+        36690: 24287,
+        36691: 24288,
+        36692: 24289,
+        36693: 24290,
+        36694: 24291,
+        36695: 24292,
+        36696: 24293,
+        36697: 24294,
+        36698: 24295,
+        36699: 24297,
+        36700: 24299,
+        36701: 24300,
+        36702: 24301,
+        36703: 24302,
+        36704: 24303,
+        36705: 24304,
+        36706: 24305,
+        36707: 24306,
+        36708: 24307,
+        36709: 24309,
+        36710: 24312,
+        36711: 24313,
+        36712: 24315,
+        36713: 24316,
+        36714: 24317,
+        36715: 24325,
+        36716: 24326,
+        36717: 24327,
+        36718: 24329,
+        36719: 24332,
+        36720: 24333,
+        36721: 24334,
+        36722: 24336,
+        36723: 24338,
+        36724: 24340,
+        36725: 24342,
+        36726: 24345,
+        36727: 24346,
+        36728: 24348,
+        36729: 24349,
+        36730: 24350,
+        36731: 24353,
+        36732: 24354,
+        36733: 24355,
+        36734: 24356,
+        36736: 24360,
+        36737: 24363,
+        36738: 24364,
+        36739: 24366,
+        36740: 24368,
+        36741: 24370,
+        36742: 24371,
+        36743: 24372,
+        36744: 24373,
+        36745: 24374,
+        36746: 24375,
+        36747: 24376,
+        36748: 24379,
+        36749: 24381,
+        36750: 24382,
+        36751: 24383,
+        36752: 24385,
+        36753: 24386,
+        36754: 24387,
+        36755: 24388,
+        36756: 24389,
+        36757: 24390,
+        36758: 24391,
+        36759: 24392,
+        36760: 24393,
+        36761: 24394,
+        36762: 24395,
+        36763: 24396,
+        36764: 24397,
+        36765: 24398,
+        36766: 24399,
+        36767: 24401,
+        36768: 24404,
+        36769: 24409,
+        36770: 24410,
+        36771: 24411,
+        36772: 24412,
+        36773: 24414,
+        36774: 24415,
+        36775: 24416,
+        36776: 24419,
+        36777: 24421,
+        36778: 24423,
+        36779: 24424,
+        36780: 24427,
+        36781: 24430,
+        36782: 24431,
+        36783: 24434,
+        36784: 24436,
+        36785: 24437,
+        36786: 24438,
+        36787: 24440,
+        36788: 24442,
+        36789: 24445,
+        36790: 24446,
+        36791: 24447,
+        36792: 24451,
+        36793: 24454,
+        36794: 24461,
+        36795: 24462,
+        36796: 24463,
+        36797: 24465,
+        36798: 24467,
+        36799: 24468,
+        36800: 24470,
+        36801: 24474,
+        36802: 24475,
+        36803: 24477,
+        36804: 24478,
+        36805: 24479,
+        36806: 24480,
+        36807: 24482,
+        36808: 24483,
+        36809: 24484,
+        36810: 24485,
+        36811: 24486,
+        36812: 24487,
+        36813: 24489,
+        36814: 24491,
+        36815: 24492,
+        36816: 24495,
+        36817: 24496,
+        36818: 24497,
+        36819: 24498,
+        36820: 24499,
+        36821: 24500,
+        36822: 24502,
+        36823: 24504,
+        36824: 24505,
+        36825: 24506,
+        36826: 24507,
+        36827: 24510,
+        36828: 24511,
+        36829: 24512,
+        36830: 24513,
+        36831: 24514,
+        36832: 24519,
+        36833: 24520,
+        36834: 24522,
+        36835: 24523,
+        36836: 24526,
+        36837: 24531,
+        36838: 24532,
+        36839: 24533,
+        36840: 24538,
+        36841: 24539,
+        36842: 24540,
+        36843: 24542,
+        36844: 24543,
+        36845: 24546,
+        36846: 24547,
+        36847: 24549,
+        36848: 24550,
+        36849: 24552,
+        36850: 24553,
+        36851: 24556,
+        36852: 24559,
+        36853: 24560,
+        36854: 24562,
+        36855: 24563,
+        36856: 24564,
+        36857: 24566,
+        36858: 24567,
+        36859: 24569,
+        36860: 24570,
+        36861: 24572,
+        36862: 24583,
+        36928: 24584,
+        36929: 24585,
+        36930: 24587,
+        36931: 24588,
+        36932: 24592,
+        36933: 24593,
+        36934: 24595,
+        36935: 24599,
+        36936: 24600,
+        36937: 24602,
+        36938: 24606,
+        36939: 24607,
+        36940: 24610,
+        36941: 24611,
+        36942: 24612,
+        36943: 24620,
+        36944: 24621,
+        36945: 24622,
+        36946: 24624,
+        36947: 24625,
+        36948: 24626,
+        36949: 24627,
+        36950: 24628,
+        36951: 24630,
+        36952: 24631,
+        36953: 24632,
+        36954: 24633,
+        36955: 24634,
+        36956: 24637,
+        36957: 24638,
+        36958: 24640,
+        36959: 24644,
+        36960: 24645,
+        36961: 24646,
+        36962: 24647,
+        36963: 24648,
+        36964: 24649,
+        36965: 24650,
+        36966: 24652,
+        36967: 24654,
+        36968: 24655,
+        36969: 24657,
+        36970: 24659,
+        36971: 24660,
+        36972: 24662,
+        36973: 24663,
+        36974: 24664,
+        36975: 24667,
+        36976: 24668,
+        36977: 24670,
+        36978: 24671,
+        36979: 24672,
+        36980: 24673,
+        36981: 24677,
+        36982: 24678,
+        36983: 24686,
+        36984: 24689,
+        36985: 24690,
+        36986: 24692,
+        36987: 24693,
+        36988: 24695,
+        36989: 24702,
+        36990: 24704,
+        36992: 24705,
+        36993: 24706,
+        36994: 24709,
+        36995: 24710,
+        36996: 24711,
+        36997: 24712,
+        36998: 24714,
+        36999: 24715,
+        37000: 24718,
+        37001: 24719,
+        37002: 24720,
+        37003: 24721,
+        37004: 24723,
+        37005: 24725,
+        37006: 24727,
+        37007: 24728,
+        37008: 24729,
+        37009: 24732,
+        37010: 24734,
+        37011: 24737,
+        37012: 24738,
+        37013: 24740,
+        37014: 24741,
+        37015: 24743,
+        37016: 24745,
+        37017: 24746,
+        37018: 24750,
+        37019: 24752,
+        37020: 24755,
+        37021: 24757,
+        37022: 24758,
+        37023: 24759,
+        37024: 24761,
+        37025: 24762,
+        37026: 24765,
+        37027: 24766,
+        37028: 24767,
+        37029: 24768,
+        37030: 24769,
+        37031: 24770,
+        37032: 24771,
+        37033: 24772,
+        37034: 24775,
+        37035: 24776,
+        37036: 24777,
+        37037: 24780,
+        37038: 24781,
+        37039: 24782,
+        37040: 24783,
+        37041: 24784,
+        37042: 24786,
+        37043: 24787,
+        37044: 24788,
+        37045: 24790,
+        37046: 24791,
+        37047: 24793,
+        37048: 24795,
+        37049: 24798,
+        37050: 24801,
+        37051: 24802,
+        37052: 24803,
+        37053: 24804,
+        37054: 24805,
+        37055: 24810,
+        37056: 24817,
+        37057: 24818,
+        37058: 24821,
+        37059: 24823,
+        37060: 24824,
+        37061: 24827,
+        37062: 24828,
+        37063: 24829,
+        37064: 24830,
+        37065: 24831,
+        37066: 24834,
+        37067: 24835,
+        37068: 24836,
+        37069: 24837,
+        37070: 24839,
+        37071: 24842,
+        37072: 24843,
+        37073: 24844,
+        37074: 24848,
+        37075: 24849,
+        37076: 24850,
+        37077: 24851,
+        37078: 24852,
+        37079: 24854,
+        37080: 24855,
+        37081: 24856,
+        37082: 24857,
+        37083: 24859,
+        37084: 24860,
+        37085: 24861,
+        37086: 24862,
+        37087: 24865,
+        37088: 24866,
+        37089: 24869,
+        37090: 24872,
+        37091: 24873,
+        37092: 24874,
+        37093: 24876,
+        37094: 24877,
+        37095: 24878,
+        37096: 24879,
+        37097: 24880,
+        37098: 24881,
+        37099: 24882,
+        37100: 24883,
+        37101: 24884,
+        37102: 24885,
+        37103: 24886,
+        37104: 24887,
+        37105: 24888,
+        37106: 24889,
+        37107: 24890,
+        37108: 24891,
+        37109: 24892,
+        37110: 24893,
+        37111: 24894,
+        37112: 24896,
+        37113: 24897,
+        37114: 24898,
+        37115: 24899,
+        37116: 24900,
+        37117: 24901,
+        37118: 24902,
+        37184: 24903,
+        37185: 24905,
+        37186: 24907,
+        37187: 24909,
+        37188: 24911,
+        37189: 24912,
+        37190: 24914,
+        37191: 24915,
+        37192: 24916,
+        37193: 24918,
+        37194: 24919,
+        37195: 24920,
+        37196: 24921,
+        37197: 24922,
+        37198: 24923,
+        37199: 24924,
+        37200: 24926,
+        37201: 24927,
+        37202: 24928,
+        37203: 24929,
+        37204: 24931,
+        37205: 24932,
+        37206: 24933,
+        37207: 24934,
+        37208: 24937,
+        37209: 24938,
+        37210: 24939,
+        37211: 24940,
+        37212: 24941,
+        37213: 24942,
+        37214: 24943,
+        37215: 24945,
+        37216: 24946,
+        37217: 24947,
+        37218: 24948,
+        37219: 24950,
+        37220: 24952,
+        37221: 24953,
+        37222: 24954,
+        37223: 24955,
+        37224: 24956,
+        37225: 24957,
+        37226: 24958,
+        37227: 24959,
+        37228: 24960,
+        37229: 24961,
+        37230: 24962,
+        37231: 24963,
+        37232: 24964,
+        37233: 24965,
+        37234: 24966,
+        37235: 24967,
+        37236: 24968,
+        37237: 24969,
+        37238: 24970,
+        37239: 24972,
+        37240: 24973,
+        37241: 24975,
+        37242: 24976,
+        37243: 24977,
+        37244: 24978,
+        37245: 24979,
+        37246: 24981,
+        37248: 24982,
+        37249: 24983,
+        37250: 24984,
+        37251: 24985,
+        37252: 24986,
+        37253: 24987,
+        37254: 24988,
+        37255: 24990,
+        37256: 24991,
+        37257: 24992,
+        37258: 24993,
+        37259: 24994,
+        37260: 24995,
+        37261: 24996,
+        37262: 24997,
+        37263: 24998,
+        37264: 25002,
+        37265: 25003,
+        37266: 25005,
+        37267: 25006,
+        37268: 25007,
+        37269: 25008,
+        37270: 25009,
+        37271: 25010,
+        37272: 25011,
+        37273: 25012,
+        37274: 25013,
+        37275: 25014,
+        37276: 25016,
+        37277: 25017,
+        37278: 25018,
+        37279: 25019,
+        37280: 25020,
+        37281: 25021,
+        37282: 25023,
+        37283: 25024,
+        37284: 25025,
+        37285: 25027,
+        37286: 25028,
+        37287: 25029,
+        37288: 25030,
+        37289: 25031,
+        37290: 25033,
+        37291: 25036,
+        37292: 25037,
+        37293: 25038,
+        37294: 25039,
+        37295: 25040,
+        37296: 25043,
+        37297: 25045,
+        37298: 25046,
+        37299: 25047,
+        37300: 25048,
+        37301: 25049,
+        37302: 25050,
+        37303: 25051,
+        37304: 25052,
+        37305: 25053,
+        37306: 25054,
+        37307: 25055,
+        37308: 25056,
+        37309: 25057,
+        37310: 25058,
+        37311: 25059,
+        37312: 25060,
+        37313: 25061,
+        37314: 25063,
+        37315: 25064,
+        37316: 25065,
+        37317: 25066,
+        37318: 25067,
+        37319: 25068,
+        37320: 25069,
+        37321: 25070,
+        37322: 25071,
+        37323: 25072,
+        37324: 25073,
+        37325: 25074,
+        37326: 25075,
+        37327: 25076,
+        37328: 25078,
+        37329: 25079,
+        37330: 25080,
+        37331: 25081,
+        37332: 25082,
+        37333: 25083,
+        37334: 25084,
+        37335: 25085,
+        37336: 25086,
+        37337: 25088,
+        37338: 25089,
+        37339: 25090,
+        37340: 25091,
+        37341: 25092,
+        37342: 25093,
+        37343: 25095,
+        37344: 25097,
+        37345: 25107,
+        37346: 25108,
+        37347: 25113,
+        37348: 25116,
+        37349: 25117,
+        37350: 25118,
+        37351: 25120,
+        37352: 25123,
+        37353: 25126,
+        37354: 25127,
+        37355: 25128,
+        37356: 25129,
+        37357: 25131,
+        37358: 25133,
+        37359: 25135,
+        37360: 25136,
+        37361: 25137,
+        37362: 25138,
+        37363: 25141,
+        37364: 25142,
+        37365: 25144,
+        37366: 25145,
+        37367: 25146,
+        37368: 25147,
+        37369: 25148,
+        37370: 25154,
+        37371: 25156,
+        37372: 25157,
+        37373: 25158,
+        37374: 25162,
+        37440: 25167,
+        37441: 25168,
+        37442: 25173,
+        37443: 25174,
+        37444: 25175,
+        37445: 25177,
+        37446: 25178,
+        37447: 25180,
+        37448: 25181,
+        37449: 25182,
+        37450: 25183,
+        37451: 25184,
+        37452: 25185,
+        37453: 25186,
+        37454: 25188,
+        37455: 25189,
+        37456: 25192,
+        37457: 25201,
+        37458: 25202,
+        37459: 25204,
+        37460: 25205,
+        37461: 25207,
+        37462: 25208,
+        37463: 25210,
+        37464: 25211,
+        37465: 25213,
+        37466: 25217,
+        37467: 25218,
+        37468: 25219,
+        37469: 25221,
+        37470: 25222,
+        37471: 25223,
+        37472: 25224,
+        37473: 25227,
+        37474: 25228,
+        37475: 25229,
+        37476: 25230,
+        37477: 25231,
+        37478: 25232,
+        37479: 25236,
+        37480: 25241,
+        37481: 25244,
+        37482: 25245,
+        37483: 25246,
+        37484: 25251,
+        37485: 25254,
+        37486: 25255,
+        37487: 25257,
+        37488: 25258,
+        37489: 25261,
+        37490: 25262,
+        37491: 25263,
+        37492: 25264,
+        37493: 25266,
+        37494: 25267,
+        37495: 25268,
+        37496: 25270,
+        37497: 25271,
+        37498: 25272,
+        37499: 25274,
+        37500: 25278,
+        37501: 25280,
+        37502: 25281,
+        37504: 25283,
+        37505: 25291,
+        37506: 25295,
+        37507: 25297,
+        37508: 25301,
+        37509: 25309,
+        37510: 25310,
+        37511: 25312,
+        37512: 25313,
+        37513: 25316,
+        37514: 25322,
+        37515: 25323,
+        37516: 25328,
+        37517: 25330,
+        37518: 25333,
+        37519: 25336,
+        37520: 25337,
+        37521: 25338,
+        37522: 25339,
+        37523: 25344,
+        37524: 25347,
+        37525: 25348,
+        37526: 25349,
+        37527: 25350,
+        37528: 25354,
+        37529: 25355,
+        37530: 25356,
+        37531: 25357,
+        37532: 25359,
+        37533: 25360,
+        37534: 25362,
+        37535: 25363,
+        37536: 25364,
+        37537: 25365,
+        37538: 25367,
+        37539: 25368,
+        37540: 25369,
+        37541: 25372,
+        37542: 25382,
+        37543: 25383,
+        37544: 25385,
+        37545: 25388,
+        37546: 25389,
+        37547: 25390,
+        37548: 25392,
+        37549: 25393,
+        37550: 25395,
+        37551: 25396,
+        37552: 25397,
+        37553: 25398,
+        37554: 25399,
+        37555: 25400,
+        37556: 25403,
+        37557: 25404,
+        37558: 25406,
+        37559: 25407,
+        37560: 25408,
+        37561: 25409,
+        37562: 25412,
+        37563: 25415,
+        37564: 25416,
+        37565: 25418,
+        37566: 25425,
+        37567: 25426,
+        37568: 25427,
+        37569: 25428,
+        37570: 25430,
+        37571: 25431,
+        37572: 25432,
+        37573: 25433,
+        37574: 25434,
+        37575: 25435,
+        37576: 25436,
+        37577: 25437,
+        37578: 25440,
+        37579: 25444,
+        37580: 25445,
+        37581: 25446,
+        37582: 25448,
+        37583: 25450,
+        37584: 25451,
+        37585: 25452,
+        37586: 25455,
+        37587: 25456,
+        37588: 25458,
+        37589: 25459,
+        37590: 25460,
+        37591: 25461,
+        37592: 25464,
+        37593: 25465,
+        37594: 25468,
+        37595: 25469,
+        37596: 25470,
+        37597: 25471,
+        37598: 25473,
+        37599: 25475,
+        37600: 25476,
+        37601: 25477,
+        37602: 25478,
+        37603: 25483,
+        37604: 25485,
+        37605: 25489,
+        37606: 25491,
+        37607: 25492,
+        37608: 25493,
+        37609: 25495,
+        37610: 25497,
+        37611: 25498,
+        37612: 25499,
+        37613: 25500,
+        37614: 25501,
+        37615: 25502,
+        37616: 25503,
+        37617: 25505,
+        37618: 25508,
+        37619: 25510,
+        37620: 25515,
+        37621: 25519,
+        37622: 25521,
+        37623: 25522,
+        37624: 25525,
+        37625: 25526,
+        37626: 25529,
+        37627: 25531,
+        37628: 25533,
+        37629: 25535,
+        37630: 25536,
+        37696: 25537,
+        37697: 25538,
+        37698: 25539,
+        37699: 25541,
+        37700: 25543,
+        37701: 25544,
+        37702: 25546,
+        37703: 25547,
+        37704: 25548,
+        37705: 25553,
+        37706: 25555,
+        37707: 25556,
+        37708: 25557,
+        37709: 25559,
+        37710: 25560,
+        37711: 25561,
+        37712: 25562,
+        37713: 25563,
+        37714: 25564,
+        37715: 25565,
+        37716: 25567,
+        37717: 25570,
+        37718: 25572,
+        37719: 25573,
+        37720: 25574,
+        37721: 25575,
+        37722: 25576,
+        37723: 25579,
+        37724: 25580,
+        37725: 25582,
+        37726: 25583,
+        37727: 25584,
+        37728: 25585,
+        37729: 25587,
+        37730: 25589,
+        37731: 25591,
+        37732: 25593,
+        37733: 25594,
+        37734: 25595,
+        37735: 25596,
+        37736: 25598,
+        37737: 25603,
+        37738: 25604,
+        37739: 25606,
+        37740: 25607,
+        37741: 25608,
+        37742: 25609,
+        37743: 25610,
+        37744: 25613,
+        37745: 25614,
+        37746: 25617,
+        37747: 25618,
+        37748: 25621,
+        37749: 25622,
+        37750: 25623,
+        37751: 25624,
+        37752: 25625,
+        37753: 25626,
+        37754: 25629,
+        37755: 25631,
+        37756: 25634,
+        37757: 25635,
+        37758: 25636,
+        37760: 25637,
+        37761: 25639,
+        37762: 25640,
+        37763: 25641,
+        37764: 25643,
+        37765: 25646,
+        37766: 25647,
+        37767: 25648,
+        37768: 25649,
+        37769: 25650,
+        37770: 25651,
+        37771: 25653,
+        37772: 25654,
+        37773: 25655,
+        37774: 25656,
+        37775: 25657,
+        37776: 25659,
+        37777: 25660,
+        37778: 25662,
+        37779: 25664,
+        37780: 25666,
+        37781: 25667,
+        37782: 25673,
+        37783: 25675,
+        37784: 25676,
+        37785: 25677,
+        37786: 25678,
+        37787: 25679,
+        37788: 25680,
+        37789: 25681,
+        37790: 25683,
+        37791: 25685,
+        37792: 25686,
+        37793: 25687,
+        37794: 25689,
+        37795: 25690,
+        37796: 25691,
+        37797: 25692,
+        37798: 25693,
+        37799: 25695,
+        37800: 25696,
+        37801: 25697,
+        37802: 25698,
+        37803: 25699,
+        37804: 25700,
+        37805: 25701,
+        37806: 25702,
+        37807: 25704,
+        37808: 25706,
+        37809: 25707,
+        37810: 25708,
+        37811: 25710,
+        37812: 25711,
+        37813: 25712,
+        37814: 25713,
+        37815: 25714,
+        37816: 25715,
+        37817: 25716,
+        37818: 25717,
+        37819: 25718,
+        37820: 25719,
+        37821: 25723,
+        37822: 25724,
+        37823: 25725,
+        37824: 25726,
+        37825: 25727,
+        37826: 25728,
+        37827: 25729,
+        37828: 25731,
+        37829: 25734,
+        37830: 25736,
+        37831: 25737,
+        37832: 25738,
+        37833: 25739,
+        37834: 25740,
+        37835: 25741,
+        37836: 25742,
+        37837: 25743,
+        37838: 25744,
+        37839: 25747,
+        37840: 25748,
+        37841: 25751,
+        37842: 25752,
+        37843: 25754,
+        37844: 25755,
+        37845: 25756,
+        37846: 25757,
+        37847: 25759,
+        37848: 25760,
+        37849: 25761,
+        37850: 25762,
+        37851: 25763,
+        37852: 25765,
+        37853: 25766,
+        37854: 25767,
+        37855: 25768,
+        37856: 25770,
+        37857: 25771,
+        37858: 25775,
+        37859: 25777,
+        37860: 25778,
+        37861: 25779,
+        37862: 25780,
+        37863: 25782,
+        37864: 25785,
+        37865: 25787,
+        37866: 25789,
+        37867: 25790,
+        37868: 25791,
+        37869: 25793,
+        37870: 25795,
+        37871: 25796,
+        37872: 25798,
+        37873: 25799,
+        37874: 25800,
+        37875: 25801,
+        37876: 25802,
+        37877: 25803,
+        37878: 25804,
+        37879: 25807,
+        37880: 25809,
+        37881: 25811,
+        37882: 25812,
+        37883: 25813,
+        37884: 25814,
+        37885: 25817,
+        37886: 25818,
+        37952: 25819,
+        37953: 25820,
+        37954: 25821,
+        37955: 25823,
+        37956: 25824,
+        37957: 25825,
+        37958: 25827,
+        37959: 25829,
+        37960: 25831,
+        37961: 25832,
+        37962: 25833,
+        37963: 25834,
+        37964: 25835,
+        37965: 25836,
+        37966: 25837,
+        37967: 25838,
+        37968: 25839,
+        37969: 25840,
+        37970: 25841,
+        37971: 25842,
+        37972: 25843,
+        37973: 25844,
+        37974: 25845,
+        37975: 25846,
+        37976: 25847,
+        37977: 25848,
+        37978: 25849,
+        37979: 25850,
+        37980: 25851,
+        37981: 25852,
+        37982: 25853,
+        37983: 25854,
+        37984: 25855,
+        37985: 25857,
+        37986: 25858,
+        37987: 25859,
+        37988: 25860,
+        37989: 25861,
+        37990: 25862,
+        37991: 25863,
+        37992: 25864,
+        37993: 25866,
+        37994: 25867,
+        37995: 25868,
+        37996: 25869,
+        37997: 25870,
+        37998: 25871,
+        37999: 25872,
+        38000: 25873,
+        38001: 25875,
+        38002: 25876,
+        38003: 25877,
+        38004: 25878,
+        38005: 25879,
+        38006: 25881,
+        38007: 25882,
+        38008: 25883,
+        38009: 25884,
+        38010: 25885,
+        38011: 25886,
+        38012: 25887,
+        38013: 25888,
+        38014: 25889,
+        38016: 25890,
+        38017: 25891,
+        38018: 25892,
+        38019: 25894,
+        38020: 25895,
+        38021: 25896,
+        38022: 25897,
+        38023: 25898,
+        38024: 25900,
+        38025: 25901,
+        38026: 25904,
+        38027: 25905,
+        38028: 25906,
+        38029: 25907,
+        38030: 25911,
+        38031: 25914,
+        38032: 25916,
+        38033: 25917,
+        38034: 25920,
+        38035: 25921,
+        38036: 25922,
+        38037: 25923,
+        38038: 25924,
+        38039: 25926,
+        38040: 25927,
+        38041: 25930,
+        38042: 25931,
+        38043: 25933,
+        38044: 25934,
+        38045: 25936,
+        38046: 25938,
+        38047: 25939,
+        38048: 25940,
+        38049: 25943,
+        38050: 25944,
+        38051: 25946,
+        38052: 25948,
+        38053: 25951,
+        38054: 25952,
+        38055: 25953,
+        38056: 25956,
+        38057: 25957,
+        38058: 25959,
+        38059: 25960,
+        38060: 25961,
+        38061: 25962,
+        38062: 25965,
+        38063: 25966,
+        38064: 25967,
+        38065: 25969,
+        38066: 25971,
+        38067: 25973,
+        38068: 25974,
+        38069: 25976,
+        38070: 25977,
+        38071: 25978,
+        38072: 25979,
+        38073: 25980,
+        38074: 25981,
+        38075: 25982,
+        38076: 25983,
+        38077: 25984,
+        38078: 25985,
+        38079: 25986,
+        38080: 25987,
+        38081: 25988,
+        38082: 25989,
+        38083: 25990,
+        38084: 25992,
+        38085: 25993,
+        38086: 25994,
+        38087: 25997,
+        38088: 25998,
+        38089: 25999,
+        38090: 26002,
+        38091: 26004,
+        38092: 26005,
+        38093: 26006,
+        38094: 26008,
+        38095: 26010,
+        38096: 26013,
+        38097: 26014,
+        38098: 26016,
+        38099: 26018,
+        38100: 26019,
+        38101: 26022,
+        38102: 26024,
+        38103: 26026,
+        38104: 26028,
+        38105: 26030,
+        38106: 26033,
+        38107: 26034,
+        38108: 26035,
+        38109: 26036,
+        38110: 26037,
+        38111: 26038,
+        38112: 26039,
+        38113: 26040,
+        38114: 26042,
+        38115: 26043,
+        38116: 26046,
+        38117: 26047,
+        38118: 26048,
+        38119: 26050,
+        38120: 26055,
+        38121: 26056,
+        38122: 26057,
+        38123: 26058,
+        38124: 26061,
+        38125: 26064,
+        38126: 26065,
+        38127: 26067,
+        38128: 26068,
+        38129: 26069,
+        38130: 26072,
+        38131: 26073,
+        38132: 26074,
+        38133: 26075,
+        38134: 26076,
+        38135: 26077,
+        38136: 26078,
+        38137: 26079,
+        38138: 26081,
+        38139: 26083,
+        38140: 26084,
+        38141: 26090,
+        38142: 26091,
+        38208: 26098,
+        38209: 26099,
+        38210: 26100,
+        38211: 26101,
+        38212: 26104,
+        38213: 26105,
+        38214: 26107,
+        38215: 26108,
+        38216: 26109,
+        38217: 26110,
+        38218: 26111,
+        38219: 26113,
+        38220: 26116,
+        38221: 26117,
+        38222: 26119,
+        38223: 26120,
+        38224: 26121,
+        38225: 26123,
+        38226: 26125,
+        38227: 26128,
+        38228: 26129,
+        38229: 26130,
+        38230: 26134,
+        38231: 26135,
+        38232: 26136,
+        38233: 26138,
+        38234: 26139,
+        38235: 26140,
+        38236: 26142,
+        38237: 26145,
+        38238: 26146,
+        38239: 26147,
+        38240: 26148,
+        38241: 26150,
+        38242: 26153,
+        38243: 26154,
+        38244: 26155,
+        38245: 26156,
+        38246: 26158,
+        38247: 26160,
+        38248: 26162,
+        38249: 26163,
+        38250: 26167,
+        38251: 26168,
+        38252: 26169,
+        38253: 26170,
+        38254: 26171,
+        38255: 26173,
+        38256: 26175,
+        38257: 26176,
+        38258: 26178,
+        38259: 26180,
+        38260: 26181,
+        38261: 26182,
+        38262: 26183,
+        38263: 26184,
+        38264: 26185,
+        38265: 26186,
+        38266: 26189,
+        38267: 26190,
+        38268: 26192,
+        38269: 26193,
+        38270: 26200,
+        38272: 26201,
+        38273: 26203,
+        38274: 26204,
+        38275: 26205,
+        38276: 26206,
+        38277: 26208,
+        38278: 26210,
+        38279: 26211,
+        38280: 26213,
+        38281: 26215,
+        38282: 26217,
+        38283: 26218,
+        38284: 26219,
+        38285: 26220,
+        38286: 26221,
+        38287: 26225,
+        38288: 26226,
+        38289: 26227,
+        38290: 26229,
+        38291: 26232,
+        38292: 26233,
+        38293: 26235,
+        38294: 26236,
+        38295: 26237,
+        38296: 26239,
+        38297: 26240,
+        38298: 26241,
+        38299: 26243,
+        38300: 26245,
+        38301: 26246,
+        38302: 26248,
+        38303: 26249,
+        38304: 26250,
+        38305: 26251,
+        38306: 26253,
+        38307: 26254,
+        38308: 26255,
+        38309: 26256,
+        38310: 26258,
+        38311: 26259,
+        38312: 26260,
+        38313: 26261,
+        38314: 26264,
+        38315: 26265,
+        38316: 26266,
+        38317: 26267,
+        38318: 26268,
+        38319: 26270,
+        38320: 26271,
+        38321: 26272,
+        38322: 26273,
+        38323: 26274,
+        38324: 26275,
+        38325: 26276,
+        38326: 26277,
+        38327: 26278,
+        38328: 26281,
+        38329: 26282,
+        38330: 26283,
+        38331: 26284,
+        38332: 26285,
+        38333: 26287,
+        38334: 26288,
+        38335: 26289,
+        38336: 26290,
+        38337: 26291,
+        38338: 26293,
+        38339: 26294,
+        38340: 26295,
+        38341: 26296,
+        38342: 26298,
+        38343: 26299,
+        38344: 26300,
+        38345: 26301,
+        38346: 26303,
+        38347: 26304,
+        38348: 26305,
+        38349: 26306,
+        38350: 26307,
+        38351: 26308,
+        38352: 26309,
+        38353: 26310,
+        38354: 26311,
+        38355: 26312,
+        38356: 26313,
+        38357: 26314,
+        38358: 26315,
+        38359: 26316,
+        38360: 26317,
+        38361: 26318,
+        38362: 26319,
+        38363: 26320,
+        38364: 26321,
+        38365: 26322,
+        38366: 26323,
+        38367: 26324,
+        38368: 26325,
+        38369: 26326,
+        38370: 26327,
+        38371: 26328,
+        38372: 26330,
+        38373: 26334,
+        38374: 26335,
+        38375: 26336,
+        38376: 26337,
+        38377: 26338,
+        38378: 26339,
+        38379: 26340,
+        38380: 26341,
+        38381: 26343,
+        38382: 26344,
+        38383: 26346,
+        38384: 26347,
+        38385: 26348,
+        38386: 26349,
+        38387: 26350,
+        38388: 26351,
+        38389: 26353,
+        38390: 26357,
+        38391: 26358,
+        38392: 26360,
+        38393: 26362,
+        38394: 26363,
+        38395: 26365,
+        38396: 26369,
+        38397: 26370,
+        38398: 26371,
+        38464: 26372,
+        38465: 26373,
+        38466: 26374,
+        38467: 26375,
+        38468: 26380,
+        38469: 26382,
+        38470: 26383,
+        38471: 26385,
+        38472: 26386,
+        38473: 26387,
+        38474: 26390,
+        38475: 26392,
+        38476: 26393,
+        38477: 26394,
+        38478: 26396,
+        38479: 26398,
+        38480: 26400,
+        38481: 26401,
+        38482: 26402,
+        38483: 26403,
+        38484: 26404,
+        38485: 26405,
+        38486: 26407,
+        38487: 26409,
+        38488: 26414,
+        38489: 26416,
+        38490: 26418,
+        38491: 26419,
+        38492: 26422,
+        38493: 26423,
+        38494: 26424,
+        38495: 26425,
+        38496: 26427,
+        38497: 26428,
+        38498: 26430,
+        38499: 26431,
+        38500: 26433,
+        38501: 26436,
+        38502: 26437,
+        38503: 26439,
+        38504: 26442,
+        38505: 26443,
+        38506: 26445,
+        38507: 26450,
+        38508: 26452,
+        38509: 26453,
+        38510: 26455,
+        38511: 26456,
+        38512: 26457,
+        38513: 26458,
+        38514: 26459,
+        38515: 26461,
+        38516: 26466,
+        38517: 26467,
+        38518: 26468,
+        38519: 26470,
+        38520: 26471,
+        38521: 26475,
+        38522: 26476,
+        38523: 26478,
+        38524: 26481,
+        38525: 26484,
+        38526: 26486,
+        38528: 26488,
+        38529: 26489,
+        38530: 26490,
+        38531: 26491,
+        38532: 26493,
+        38533: 26496,
+        38534: 26498,
+        38535: 26499,
+        38536: 26501,
+        38537: 26502,
+        38538: 26504,
+        38539: 26506,
+        38540: 26508,
+        38541: 26509,
+        38542: 26510,
+        38543: 26511,
+        38544: 26513,
+        38545: 26514,
+        38546: 26515,
+        38547: 26516,
+        38548: 26518,
+        38549: 26521,
+        38550: 26523,
+        38551: 26527,
+        38552: 26528,
+        38553: 26529,
+        38554: 26532,
+        38555: 26534,
+        38556: 26537,
+        38557: 26540,
+        38558: 26542,
+        38559: 26545,
+        38560: 26546,
+        38561: 26548,
+        38562: 26553,
+        38563: 26554,
+        38564: 26555,
+        38565: 26556,
+        38566: 26557,
+        38567: 26558,
+        38568: 26559,
+        38569: 26560,
+        38570: 26562,
+        38571: 26565,
+        38572: 26566,
+        38573: 26567,
+        38574: 26568,
+        38575: 26569,
+        38576: 26570,
+        38577: 26571,
+        38578: 26572,
+        38579: 26573,
+        38580: 26574,
+        38581: 26581,
+        38582: 26582,
+        38583: 26583,
+        38584: 26587,
+        38585: 26591,
+        38586: 26593,
+        38587: 26595,
+        38588: 26596,
+        38589: 26598,
+        38590: 26599,
+        38591: 26600,
+        38592: 26602,
+        38593: 26603,
+        38594: 26605,
+        38595: 26606,
+        38596: 26610,
+        38597: 26613,
+        38598: 26614,
+        38599: 26615,
+        38600: 26616,
+        38601: 26617,
+        38602: 26618,
+        38603: 26619,
+        38604: 26620,
+        38605: 26622,
+        38606: 26625,
+        38607: 26626,
+        38608: 26627,
+        38609: 26628,
+        38610: 26630,
+        38611: 26637,
+        38612: 26640,
+        38613: 26642,
+        38614: 26644,
+        38615: 26645,
+        38616: 26648,
+        38617: 26649,
+        38618: 26650,
+        38619: 26651,
+        38620: 26652,
+        38621: 26654,
+        38622: 26655,
+        38623: 26656,
+        38624: 26658,
+        38625: 26659,
+        38626: 26660,
+        38627: 26661,
+        38628: 26662,
+        38629: 26663,
+        38630: 26664,
+        38631: 26667,
+        38632: 26668,
+        38633: 26669,
+        38634: 26670,
+        38635: 26671,
+        38636: 26672,
+        38637: 26673,
+        38638: 26676,
+        38639: 26677,
+        38640: 26678,
+        38641: 26682,
+        38642: 26683,
+        38643: 26687,
+        38644: 26695,
+        38645: 26699,
+        38646: 26701,
+        38647: 26703,
+        38648: 26706,
+        38649: 26710,
+        38650: 26711,
+        38651: 26712,
+        38652: 26713,
+        38653: 26714,
+        38654: 26715,
+        38720: 26716,
+        38721: 26717,
+        38722: 26718,
+        38723: 26719,
+        38724: 26730,
+        38725: 26732,
+        38726: 26733,
+        38727: 26734,
+        38728: 26735,
+        38729: 26736,
+        38730: 26737,
+        38731: 26738,
+        38732: 26739,
+        38733: 26741,
+        38734: 26744,
+        38735: 26745,
+        38736: 26746,
+        38737: 26747,
+        38738: 26748,
+        38739: 26749,
+        38740: 26750,
+        38741: 26751,
+        38742: 26752,
+        38743: 26754,
+        38744: 26756,
+        38745: 26759,
+        38746: 26760,
+        38747: 26761,
+        38748: 26762,
+        38749: 26763,
+        38750: 26764,
+        38751: 26765,
+        38752: 26766,
+        38753: 26768,
+        38754: 26769,
+        38755: 26770,
+        38756: 26772,
+        38757: 26773,
+        38758: 26774,
+        38759: 26776,
+        38760: 26777,
+        38761: 26778,
+        38762: 26779,
+        38763: 26780,
+        38764: 26781,
+        38765: 26782,
+        38766: 26783,
+        38767: 26784,
+        38768: 26785,
+        38769: 26787,
+        38770: 26788,
+        38771: 26789,
+        38772: 26793,
+        38773: 26794,
+        38774: 26795,
+        38775: 26796,
+        38776: 26798,
+        38777: 26801,
+        38778: 26802,
+        38779: 26804,
+        38780: 26806,
+        38781: 26807,
+        38782: 26808,
+        38784: 26809,
+        38785: 26810,
+        38786: 26811,
+        38787: 26812,
+        38788: 26813,
+        38789: 26814,
+        38790: 26815,
+        38791: 26817,
+        38792: 26819,
+        38793: 26820,
+        38794: 26821,
+        38795: 26822,
+        38796: 26823,
+        38797: 26824,
+        38798: 26826,
+        38799: 26828,
+        38800: 26830,
+        38801: 26831,
+        38802: 26832,
+        38803: 26833,
+        38804: 26835,
+        38805: 26836,
+        38806: 26838,
+        38807: 26839,
+        38808: 26841,
+        38809: 26843,
+        38810: 26844,
+        38811: 26845,
+        38812: 26846,
+        38813: 26847,
+        38814: 26849,
+        38815: 26850,
+        38816: 26852,
+        38817: 26853,
+        38818: 26854,
+        38819: 26855,
+        38820: 26856,
+        38821: 26857,
+        38822: 26858,
+        38823: 26859,
+        38824: 26860,
+        38825: 26861,
+        38826: 26863,
+        38827: 26866,
+        38828: 26867,
+        38829: 26868,
+        38830: 26870,
+        38831: 26871,
+        38832: 26872,
+        38833: 26875,
+        38834: 26877,
+        38835: 26878,
+        38836: 26879,
+        38837: 26880,
+        38838: 26882,
+        38839: 26883,
+        38840: 26884,
+        38841: 26886,
+        38842: 26887,
+        38843: 26888,
+        38844: 26889,
+        38845: 26890,
+        38846: 26892,
+        38847: 26895,
+        38848: 26897,
+        38849: 26899,
+        38850: 26900,
+        38851: 26901,
+        38852: 26902,
+        38853: 26903,
+        38854: 26904,
+        38855: 26905,
+        38856: 26906,
+        38857: 26907,
+        38858: 26908,
+        38859: 26909,
+        38860: 26910,
+        38861: 26913,
+        38862: 26914,
+        38863: 26915,
+        38864: 26917,
+        38865: 26918,
+        38866: 26919,
+        38867: 26920,
+        38868: 26921,
+        38869: 26922,
+        38870: 26923,
+        38871: 26924,
+        38872: 26926,
+        38873: 26927,
+        38874: 26929,
+        38875: 26930,
+        38876: 26931,
+        38877: 26933,
+        38878: 26934,
+        38879: 26935,
+        38880: 26936,
+        38881: 26938,
+        38882: 26939,
+        38883: 26940,
+        38884: 26942,
+        38885: 26944,
+        38886: 26945,
+        38887: 26947,
+        38888: 26948,
+        38889: 26949,
+        38890: 26950,
+        38891: 26951,
+        38892: 26952,
+        38893: 26953,
+        38894: 26954,
+        38895: 26955,
+        38896: 26956,
+        38897: 26957,
+        38898: 26958,
+        38899: 26959,
+        38900: 26960,
+        38901: 26961,
+        38902: 26962,
+        38903: 26963,
+        38904: 26965,
+        38905: 26966,
+        38906: 26968,
+        38907: 26969,
+        38908: 26971,
+        38909: 26972,
+        38910: 26975,
+        38976: 26977,
+        38977: 26978,
+        38978: 26980,
+        38979: 26981,
+        38980: 26983,
+        38981: 26984,
+        38982: 26985,
+        38983: 26986,
+        38984: 26988,
+        38985: 26989,
+        38986: 26991,
+        38987: 26992,
+        38988: 26994,
+        38989: 26995,
+        38990: 26996,
+        38991: 26997,
+        38992: 26998,
+        38993: 27002,
+        38994: 27003,
+        38995: 27005,
+        38996: 27006,
+        38997: 27007,
+        38998: 27009,
+        38999: 27011,
+        39000: 27013,
+        39001: 27018,
+        39002: 27019,
+        39003: 27020,
+        39004: 27022,
+        39005: 27023,
+        39006: 27024,
+        39007: 27025,
+        39008: 27026,
+        39009: 27027,
+        39010: 27030,
+        39011: 27031,
+        39012: 27033,
+        39013: 27034,
+        39014: 27037,
+        39015: 27038,
+        39016: 27039,
+        39017: 27040,
+        39018: 27041,
+        39019: 27042,
+        39020: 27043,
+        39021: 27044,
+        39022: 27045,
+        39023: 27046,
+        39024: 27049,
+        39025: 27050,
+        39026: 27052,
+        39027: 27054,
+        39028: 27055,
+        39029: 27056,
+        39030: 27058,
+        39031: 27059,
+        39032: 27061,
+        39033: 27062,
+        39034: 27064,
+        39035: 27065,
+        39036: 27066,
+        39037: 27068,
+        39038: 27069,
+        39040: 27070,
+        39041: 27071,
+        39042: 27072,
+        39043: 27074,
+        39044: 27075,
+        39045: 27076,
+        39046: 27077,
+        39047: 27078,
+        39048: 27079,
+        39049: 27080,
+        39050: 27081,
+        39051: 27083,
+        39052: 27085,
+        39053: 27087,
+        39054: 27089,
+        39055: 27090,
+        39056: 27091,
+        39057: 27093,
+        39058: 27094,
+        39059: 27095,
+        39060: 27096,
+        39061: 27097,
+        39062: 27098,
+        39063: 27100,
+        39064: 27101,
+        39065: 27102,
+        39066: 27105,
+        39067: 27106,
+        39068: 27107,
+        39069: 27108,
+        39070: 27109,
+        39071: 27110,
+        39072: 27111,
+        39073: 27112,
+        39074: 27113,
+        39075: 27114,
+        39076: 27115,
+        39077: 27116,
+        39078: 27118,
+        39079: 27119,
+        39080: 27120,
+        39081: 27121,
+        39082: 27123,
+        39083: 27124,
+        39084: 27125,
+        39085: 27126,
+        39086: 27127,
+        39087: 27128,
+        39088: 27129,
+        39089: 27130,
+        39090: 27131,
+        39091: 27132,
+        39092: 27134,
+        39093: 27136,
+        39094: 27137,
+        39095: 27138,
+        39096: 27139,
+        39097: 27140,
+        39098: 27141,
+        39099: 27142,
+        39100: 27143,
+        39101: 27144,
+        39102: 27145,
+        39103: 27147,
+        39104: 27148,
+        39105: 27149,
+        39106: 27150,
+        39107: 27151,
+        39108: 27152,
+        39109: 27153,
+        39110: 27154,
+        39111: 27155,
+        39112: 27156,
+        39113: 27157,
+        39114: 27158,
+        39115: 27161,
+        39116: 27162,
+        39117: 27163,
+        39118: 27164,
+        39119: 27165,
+        39120: 27166,
+        39121: 27168,
+        39122: 27170,
+        39123: 27171,
+        39124: 27172,
+        39125: 27173,
+        39126: 27174,
+        39127: 27175,
+        39128: 27177,
+        39129: 27179,
+        39130: 27180,
+        39131: 27181,
+        39132: 27182,
+        39133: 27184,
+        39134: 27186,
+        39135: 27187,
+        39136: 27188,
+        39137: 27190,
+        39138: 27191,
+        39139: 27192,
+        39140: 27193,
+        39141: 27194,
+        39142: 27195,
+        39143: 27196,
+        39144: 27199,
+        39145: 27200,
+        39146: 27201,
+        39147: 27202,
+        39148: 27203,
+        39149: 27205,
+        39150: 27206,
+        39151: 27208,
+        39152: 27209,
+        39153: 27210,
+        39154: 27211,
+        39155: 27212,
+        39156: 27213,
+        39157: 27214,
+        39158: 27215,
+        39159: 27217,
+        39160: 27218,
+        39161: 27219,
+        39162: 27220,
+        39163: 27221,
+        39164: 27222,
+        39165: 27223,
+        39166: 27226,
+        39232: 27228,
+        39233: 27229,
+        39234: 27230,
+        39235: 27231,
+        39236: 27232,
+        39237: 27234,
+        39238: 27235,
+        39239: 27236,
+        39240: 27238,
+        39241: 27239,
+        39242: 27240,
+        39243: 27241,
+        39244: 27242,
+        39245: 27243,
+        39246: 27244,
+        39247: 27245,
+        39248: 27246,
+        39249: 27247,
+        39250: 27248,
+        39251: 27250,
+        39252: 27251,
+        39253: 27252,
+        39254: 27253,
+        39255: 27254,
+        39256: 27255,
+        39257: 27256,
+        39258: 27258,
+        39259: 27259,
+        39260: 27261,
+        39261: 27262,
+        39262: 27263,
+        39263: 27265,
+        39264: 27266,
+        39265: 27267,
+        39266: 27269,
+        39267: 27270,
+        39268: 27271,
+        39269: 27272,
+        39270: 27273,
+        39271: 27274,
+        39272: 27275,
+        39273: 27276,
+        39274: 27277,
+        39275: 27279,
+        39276: 27282,
+        39277: 27283,
+        39278: 27284,
+        39279: 27285,
+        39280: 27286,
+        39281: 27288,
+        39282: 27289,
+        39283: 27290,
+        39284: 27291,
+        39285: 27292,
+        39286: 27293,
+        39287: 27294,
+        39288: 27295,
+        39289: 27297,
+        39290: 27298,
+        39291: 27299,
+        39292: 27300,
+        39293: 27301,
+        39294: 27302,
+        39296: 27303,
+        39297: 27304,
+        39298: 27306,
+        39299: 27309,
+        39300: 27310,
+        39301: 27311,
+        39302: 27312,
+        39303: 27313,
+        39304: 27314,
+        39305: 27315,
+        39306: 27316,
+        39307: 27317,
+        39308: 27318,
+        39309: 27319,
+        39310: 27320,
+        39311: 27321,
+        39312: 27322,
+        39313: 27323,
+        39314: 27324,
+        39315: 27325,
+        39316: 27326,
+        39317: 27327,
+        39318: 27328,
+        39319: 27329,
+        39320: 27330,
+        39321: 27331,
+        39322: 27332,
+        39323: 27333,
+        39324: 27334,
+        39325: 27335,
+        39326: 27336,
+        39327: 27337,
+        39328: 27338,
+        39329: 27339,
+        39330: 27340,
+        39331: 27341,
+        39332: 27342,
+        39333: 27343,
+        39334: 27344,
+        39335: 27345,
+        39336: 27346,
+        39337: 27347,
+        39338: 27348,
+        39339: 27349,
+        39340: 27350,
+        39341: 27351,
+        39342: 27352,
+        39343: 27353,
+        39344: 27354,
+        39345: 27355,
+        39346: 27356,
+        39347: 27357,
+        39348: 27358,
+        39349: 27359,
+        39350: 27360,
+        39351: 27361,
+        39352: 27362,
+        39353: 27363,
+        39354: 27364,
+        39355: 27365,
+        39356: 27366,
+        39357: 27367,
+        39358: 27368,
+        39359: 27369,
+        39360: 27370,
+        39361: 27371,
+        39362: 27372,
+        39363: 27373,
+        39364: 27374,
+        39365: 27375,
+        39366: 27376,
+        39367: 27377,
+        39368: 27378,
+        39369: 27379,
+        39370: 27380,
+        39371: 27381,
+        39372: 27382,
+        39373: 27383,
+        39374: 27384,
+        39375: 27385,
+        39376: 27386,
+        39377: 27387,
+        39378: 27388,
+        39379: 27389,
+        39380: 27390,
+        39381: 27391,
+        39382: 27392,
+        39383: 27393,
+        39384: 27394,
+        39385: 27395,
+        39386: 27396,
+        39387: 27397,
+        39388: 27398,
+        39389: 27399,
+        39390: 27400,
+        39391: 27401,
+        39392: 27402,
+        39393: 27403,
+        39394: 27404,
+        39395: 27405,
+        39396: 27406,
+        39397: 27407,
+        39398: 27408,
+        39399: 27409,
+        39400: 27410,
+        39401: 27411,
+        39402: 27412,
+        39403: 27413,
+        39404: 27414,
+        39405: 27415,
+        39406: 27416,
+        39407: 27417,
+        39408: 27418,
+        39409: 27419,
+        39410: 27420,
+        39411: 27421,
+        39412: 27422,
+        39413: 27423,
+        39414: 27429,
+        39415: 27430,
+        39416: 27432,
+        39417: 27433,
+        39418: 27434,
+        39419: 27435,
+        39420: 27436,
+        39421: 27437,
+        39422: 27438,
+        39488: 27439,
+        39489: 27440,
+        39490: 27441,
+        39491: 27443,
+        39492: 27444,
+        39493: 27445,
+        39494: 27446,
+        39495: 27448,
+        39496: 27451,
+        39497: 27452,
+        39498: 27453,
+        39499: 27455,
+        39500: 27456,
+        39501: 27457,
+        39502: 27458,
+        39503: 27460,
+        39504: 27461,
+        39505: 27464,
+        39506: 27466,
+        39507: 27467,
+        39508: 27469,
+        39509: 27470,
+        39510: 27471,
+        39511: 27472,
+        39512: 27473,
+        39513: 27474,
+        39514: 27475,
+        39515: 27476,
+        39516: 27477,
+        39517: 27478,
+        39518: 27479,
+        39519: 27480,
+        39520: 27482,
+        39521: 27483,
+        39522: 27484,
+        39523: 27485,
+        39524: 27486,
+        39525: 27487,
+        39526: 27488,
+        39527: 27489,
+        39528: 27496,
+        39529: 27497,
+        39530: 27499,
+        39531: 27500,
+        39532: 27501,
+        39533: 27502,
+        39534: 27503,
+        39535: 27504,
+        39536: 27505,
+        39537: 27506,
+        39538: 27507,
+        39539: 27508,
+        39540: 27509,
+        39541: 27510,
+        39542: 27511,
+        39543: 27512,
+        39544: 27514,
+        39545: 27517,
+        39546: 27518,
+        39547: 27519,
+        39548: 27520,
+        39549: 27525,
+        39550: 27528,
+        39552: 27532,
+        39553: 27534,
+        39554: 27535,
+        39555: 27536,
+        39556: 27537,
+        39557: 27540,
+        39558: 27541,
+        39559: 27543,
+        39560: 27544,
+        39561: 27545,
+        39562: 27548,
+        39563: 27549,
+        39564: 27550,
+        39565: 27551,
+        39566: 27552,
+        39567: 27554,
+        39568: 27555,
+        39569: 27556,
+        39570: 27557,
+        39571: 27558,
+        39572: 27559,
+        39573: 27560,
+        39574: 27561,
+        39575: 27563,
+        39576: 27564,
+        39577: 27565,
+        39578: 27566,
+        39579: 27567,
+        39580: 27568,
+        39581: 27569,
+        39582: 27570,
+        39583: 27574,
+        39584: 27576,
+        39585: 27577,
+        39586: 27578,
+        39587: 27579,
+        39588: 27580,
+        39589: 27581,
+        39590: 27582,
+        39591: 27584,
+        39592: 27587,
+        39593: 27588,
+        39594: 27590,
+        39595: 27591,
+        39596: 27592,
+        39597: 27593,
+        39598: 27594,
+        39599: 27596,
+        39600: 27598,
+        39601: 27600,
+        39602: 27601,
+        39603: 27608,
+        39604: 27610,
+        39605: 27612,
+        39606: 27613,
+        39607: 27614,
+        39608: 27615,
+        39609: 27616,
+        39610: 27618,
+        39611: 27619,
+        39612: 27620,
+        39613: 27621,
+        39614: 27622,
+        39615: 27623,
+        39616: 27624,
+        39617: 27625,
+        39618: 27628,
+        39619: 27629,
+        39620: 27630,
+        39621: 27632,
+        39622: 27633,
+        39623: 27634,
+        39624: 27636,
+        39625: 27638,
+        39626: 27639,
+        39627: 27640,
+        39628: 27642,
+        39629: 27643,
+        39630: 27644,
+        39631: 27646,
+        39632: 27647,
+        39633: 27648,
+        39634: 27649,
+        39635: 27650,
+        39636: 27651,
+        39637: 27652,
+        39638: 27656,
+        39639: 27657,
+        39640: 27658,
+        39641: 27659,
+        39642: 27660,
+        39643: 27662,
+        39644: 27666,
+        39645: 27671,
+        39646: 27676,
+        39647: 27677,
+        39648: 27678,
+        39649: 27680,
+        39650: 27683,
+        39651: 27685,
+        39652: 27691,
+        39653: 27692,
+        39654: 27693,
+        39655: 27697,
+        39656: 27699,
+        39657: 27702,
+        39658: 27703,
+        39659: 27705,
+        39660: 27706,
+        39661: 27707,
+        39662: 27708,
+        39663: 27710,
+        39664: 27711,
+        39665: 27715,
+        39666: 27716,
+        39667: 27717,
+        39668: 27720,
+        39669: 27723,
+        39670: 27724,
+        39671: 27725,
+        39672: 27726,
+        39673: 27727,
+        39674: 27729,
+        39675: 27730,
+        39676: 27731,
+        39677: 27734,
+        39678: 27736,
+        39744: 27737,
+        39745: 27738,
+        39746: 27746,
+        39747: 27747,
+        39748: 27749,
+        39749: 27750,
+        39750: 27751,
+        39751: 27755,
+        39752: 27756,
+        39753: 27757,
+        39754: 27758,
+        39755: 27759,
+        39756: 27761,
+        39757: 27763,
+        39758: 27765,
+        39759: 27767,
+        39760: 27768,
+        39761: 27770,
+        39762: 27771,
+        39763: 27772,
+        39764: 27775,
+        39765: 27776,
+        39766: 27780,
+        39767: 27783,
+        39768: 27786,
+        39769: 27787,
+        39770: 27789,
+        39771: 27790,
+        39772: 27793,
+        39773: 27794,
+        39774: 27797,
+        39775: 27798,
+        39776: 27799,
+        39777: 27800,
+        39778: 27802,
+        39779: 27804,
+        39780: 27805,
+        39781: 27806,
+        39782: 27808,
+        39783: 27810,
+        39784: 27816,
+        39785: 27820,
+        39786: 27823,
+        39787: 27824,
+        39788: 27828,
+        39789: 27829,
+        39790: 27830,
+        39791: 27831,
+        39792: 27834,
+        39793: 27840,
+        39794: 27841,
+        39795: 27842,
+        39796: 27843,
+        39797: 27846,
+        39798: 27847,
+        39799: 27848,
+        39800: 27851,
+        39801: 27853,
+        39802: 27854,
+        39803: 27855,
+        39804: 27857,
+        39805: 27858,
+        39806: 27864,
+        39808: 27865,
+        39809: 27866,
+        39810: 27868,
+        39811: 27869,
+        39812: 27871,
+        39813: 27876,
+        39814: 27878,
+        39815: 27879,
+        39816: 27881,
+        39817: 27884,
+        39818: 27885,
+        39819: 27890,
+        39820: 27892,
+        39821: 27897,
+        39822: 27903,
+        39823: 27904,
+        39824: 27906,
+        39825: 27907,
+        39826: 27909,
+        39827: 27910,
+        39828: 27912,
+        39829: 27913,
+        39830: 27914,
+        39831: 27917,
+        39832: 27919,
+        39833: 27920,
+        39834: 27921,
+        39835: 27923,
+        39836: 27924,
+        39837: 27925,
+        39838: 27926,
+        39839: 27928,
+        39840: 27932,
+        39841: 27933,
+        39842: 27935,
+        39843: 27936,
+        39844: 27937,
+        39845: 27938,
+        39846: 27939,
+        39847: 27940,
+        39848: 27942,
+        39849: 27944,
+        39850: 27945,
+        39851: 27948,
+        39852: 27949,
+        39853: 27951,
+        39854: 27952,
+        39855: 27956,
+        39856: 27958,
+        39857: 27959,
+        39858: 27960,
+        39859: 27962,
+        39860: 27967,
+        39861: 27968,
+        39862: 27970,
+        39863: 27972,
+        39864: 27977,
+        39865: 27980,
+        39866: 27984,
+        39867: 27989,
+        39868: 27990,
+        39869: 27991,
+        39870: 27992,
+        39871: 27995,
+        39872: 27997,
+        39873: 27999,
+        39874: 28001,
+        39875: 28002,
+        39876: 28004,
+        39877: 28005,
+        39878: 28007,
+        39879: 28008,
+        39880: 28011,
+        39881: 28012,
+        39882: 28013,
+        39883: 28016,
+        39884: 28017,
+        39885: 28018,
+        39886: 28019,
+        39887: 28021,
+        39888: 28022,
+        39889: 28025,
+        39890: 28026,
+        39891: 28027,
+        39892: 28029,
+        39893: 28030,
+        39894: 28031,
+        39895: 28032,
+        39896: 28033,
+        39897: 28035,
+        39898: 28036,
+        39899: 28038,
+        39900: 28039,
+        39901: 28042,
+        39902: 28043,
+        39903: 28045,
+        39904: 28047,
+        39905: 28048,
+        39906: 28050,
+        39907: 28054,
+        39908: 28055,
+        39909: 28056,
+        39910: 28057,
+        39911: 28058,
+        39912: 28060,
+        39913: 28066,
+        39914: 28069,
+        39915: 28076,
+        39916: 28077,
+        39917: 28080,
+        39918: 28081,
+        39919: 28083,
+        39920: 28084,
+        39921: 28086,
+        39922: 28087,
+        39923: 28089,
+        39924: 28090,
+        39925: 28091,
+        39926: 28092,
+        39927: 28093,
+        39928: 28094,
+        39929: 28097,
+        39930: 28098,
+        39931: 28099,
+        39932: 28104,
+        39933: 28105,
+        39934: 28106,
+        40000: 28109,
+        40001: 28110,
+        40002: 28111,
+        40003: 28112,
+        40004: 28114,
+        40005: 28115,
+        40006: 28116,
+        40007: 28117,
+        40008: 28119,
+        40009: 28122,
+        40010: 28123,
+        40011: 28124,
+        40012: 28127,
+        40013: 28130,
+        40014: 28131,
+        40015: 28133,
+        40016: 28135,
+        40017: 28136,
+        40018: 28137,
+        40019: 28138,
+        40020: 28141,
+        40021: 28143,
+        40022: 28144,
+        40023: 28146,
+        40024: 28148,
+        40025: 28149,
+        40026: 28150,
+        40027: 28152,
+        40028: 28154,
+        40029: 28157,
+        40030: 28158,
+        40031: 28159,
+        40032: 28160,
+        40033: 28161,
+        40034: 28162,
+        40035: 28163,
+        40036: 28164,
+        40037: 28166,
+        40038: 28167,
+        40039: 28168,
+        40040: 28169,
+        40041: 28171,
+        40042: 28175,
+        40043: 28178,
+        40044: 28179,
+        40045: 28181,
+        40046: 28184,
+        40047: 28185,
+        40048: 28187,
+        40049: 28188,
+        40050: 28190,
+        40051: 28191,
+        40052: 28194,
+        40053: 28198,
+        40054: 28199,
+        40055: 28200,
+        40056: 28202,
+        40057: 28204,
+        40058: 28206,
+        40059: 28208,
+        40060: 28209,
+        40061: 28211,
+        40062: 28213,
+        40064: 28214,
+        40065: 28215,
+        40066: 28217,
+        40067: 28219,
+        40068: 28220,
+        40069: 28221,
+        40070: 28222,
+        40071: 28223,
+        40072: 28224,
+        40073: 28225,
+        40074: 28226,
+        40075: 28229,
+        40076: 28230,
+        40077: 28231,
+        40078: 28232,
+        40079: 28233,
+        40080: 28234,
+        40081: 28235,
+        40082: 28236,
+        40083: 28239,
+        40084: 28240,
+        40085: 28241,
+        40086: 28242,
+        40087: 28245,
+        40088: 28247,
+        40089: 28249,
+        40090: 28250,
+        40091: 28252,
+        40092: 28253,
+        40093: 28254,
+        40094: 28256,
+        40095: 28257,
+        40096: 28258,
+        40097: 28259,
+        40098: 28260,
+        40099: 28261,
+        40100: 28262,
+        40101: 28263,
+        40102: 28264,
+        40103: 28265,
+        40104: 28266,
+        40105: 28268,
+        40106: 28269,
+        40107: 28271,
+        40108: 28272,
+        40109: 28273,
+        40110: 28274,
+        40111: 28275,
+        40112: 28276,
+        40113: 28277,
+        40114: 28278,
+        40115: 28279,
+        40116: 28280,
+        40117: 28281,
+        40118: 28282,
+        40119: 28283,
+        40120: 28284,
+        40121: 28285,
+        40122: 28288,
+        40123: 28289,
+        40124: 28290,
+        40125: 28292,
+        40126: 28295,
+        40127: 28296,
+        40128: 28298,
+        40129: 28299,
+        40130: 28300,
+        40131: 28301,
+        40132: 28302,
+        40133: 28305,
+        40134: 28306,
+        40135: 28307,
+        40136: 28308,
+        40137: 28309,
+        40138: 28310,
+        40139: 28311,
+        40140: 28313,
+        40141: 28314,
+        40142: 28315,
+        40143: 28317,
+        40144: 28318,
+        40145: 28320,
+        40146: 28321,
+        40147: 28323,
+        40148: 28324,
+        40149: 28326,
+        40150: 28328,
+        40151: 28329,
+        40152: 28331,
+        40153: 28332,
+        40154: 28333,
+        40155: 28334,
+        40156: 28336,
+        40157: 28339,
+        40158: 28341,
+        40159: 28344,
+        40160: 28345,
+        40161: 28348,
+        40162: 28350,
+        40163: 28351,
+        40164: 28352,
+        40165: 28355,
+        40166: 28356,
+        40167: 28357,
+        40168: 28358,
+        40169: 28360,
+        40170: 28361,
+        40171: 28362,
+        40172: 28364,
+        40173: 28365,
+        40174: 28366,
+        40175: 28368,
+        40176: 28370,
+        40177: 28374,
+        40178: 28376,
+        40179: 28377,
+        40180: 28379,
+        40181: 28380,
+        40182: 28381,
+        40183: 28387,
+        40184: 28391,
+        40185: 28394,
+        40186: 28395,
+        40187: 28396,
+        40188: 28397,
+        40189: 28398,
+        40190: 28399,
+        40256: 28400,
+        40257: 28401,
+        40258: 28402,
+        40259: 28403,
+        40260: 28405,
+        40261: 28406,
+        40262: 28407,
+        40263: 28408,
+        40264: 28410,
+        40265: 28411,
+        40266: 28412,
+        40267: 28413,
+        40268: 28414,
+        40269: 28415,
+        40270: 28416,
+        40271: 28417,
+        40272: 28419,
+        40273: 28420,
+        40274: 28421,
+        40275: 28423,
+        40276: 28424,
+        40277: 28426,
+        40278: 28427,
+        40279: 28428,
+        40280: 28429,
+        40281: 28430,
+        40282: 28432,
+        40283: 28433,
+        40284: 28434,
+        40285: 28438,
+        40286: 28439,
+        40287: 28440,
+        40288: 28441,
+        40289: 28442,
+        40290: 28443,
+        40291: 28444,
+        40292: 28445,
+        40293: 28446,
+        40294: 28447,
+        40295: 28449,
+        40296: 28450,
+        40297: 28451,
+        40298: 28453,
+        40299: 28454,
+        40300: 28455,
+        40301: 28456,
+        40302: 28460,
+        40303: 28462,
+        40304: 28464,
+        40305: 28466,
+        40306: 28468,
+        40307: 28469,
+        40308: 28471,
+        40309: 28472,
+        40310: 28473,
+        40311: 28474,
+        40312: 28475,
+        40313: 28476,
+        40314: 28477,
+        40315: 28479,
+        40316: 28480,
+        40317: 28481,
+        40318: 28482,
+        40320: 28483,
+        40321: 28484,
+        40322: 28485,
+        40323: 28488,
+        40324: 28489,
+        40325: 28490,
+        40326: 28492,
+        40327: 28494,
+        40328: 28495,
+        40329: 28496,
+        40330: 28497,
+        40331: 28498,
+        40332: 28499,
+        40333: 28500,
+        40334: 28501,
+        40335: 28502,
+        40336: 28503,
+        40337: 28505,
+        40338: 28506,
+        40339: 28507,
+        40340: 28509,
+        40341: 28511,
+        40342: 28512,
+        40343: 28513,
+        40344: 28515,
+        40345: 28516,
+        40346: 28517,
+        40347: 28519,
+        40348: 28520,
+        40349: 28521,
+        40350: 28522,
+        40351: 28523,
+        40352: 28524,
+        40353: 28527,
+        40354: 28528,
+        40355: 28529,
+        40356: 28531,
+        40357: 28533,
+        40358: 28534,
+        40359: 28535,
+        40360: 28537,
+        40361: 28539,
+        40362: 28541,
+        40363: 28542,
+        40364: 28543,
+        40365: 28544,
+        40366: 28545,
+        40367: 28546,
+        40368: 28547,
+        40369: 28549,
+        40370: 28550,
+        40371: 28551,
+        40372: 28554,
+        40373: 28555,
+        40374: 28559,
+        40375: 28560,
+        40376: 28561,
+        40377: 28562,
+        40378: 28563,
+        40379: 28564,
+        40380: 28565,
+        40381: 28566,
+        40382: 28567,
+        40383: 28568,
+        40384: 28569,
+        40385: 28570,
+        40386: 28571,
+        40387: 28573,
+        40388: 28574,
+        40389: 28575,
+        40390: 28576,
+        40391: 28578,
+        40392: 28579,
+        40393: 28580,
+        40394: 28581,
+        40395: 28582,
+        40396: 28584,
+        40397: 28585,
+        40398: 28586,
+        40399: 28587,
+        40400: 28588,
+        40401: 28589,
+        40402: 28590,
+        40403: 28591,
+        40404: 28592,
+        40405: 28593,
+        40406: 28594,
+        40407: 28596,
+        40408: 28597,
+        40409: 28599,
+        40410: 28600,
+        40411: 28602,
+        40412: 28603,
+        40413: 28604,
+        40414: 28605,
+        40415: 28606,
+        40416: 28607,
+        40417: 28609,
+        40418: 28611,
+        40419: 28612,
+        40420: 28613,
+        40421: 28614,
+        40422: 28615,
+        40423: 28616,
+        40424: 28618,
+        40425: 28619,
+        40426: 28620,
+        40427: 28621,
+        40428: 28622,
+        40429: 28623,
+        40430: 28624,
+        40431: 28627,
+        40432: 28628,
+        40433: 28629,
+        40434: 28630,
+        40435: 28631,
+        40436: 28632,
+        40437: 28633,
+        40438: 28634,
+        40439: 28635,
+        40440: 28636,
+        40441: 28637,
+        40442: 28639,
+        40443: 28642,
+        40444: 28643,
+        40445: 28644,
+        40446: 28645,
+        40512: 28646,
+        40513: 28647,
+        40514: 28648,
+        40515: 28649,
+        40516: 28650,
+        40517: 28651,
+        40518: 28652,
+        40519: 28653,
+        40520: 28656,
+        40521: 28657,
+        40522: 28658,
+        40523: 28659,
+        40524: 28660,
+        40525: 28661,
+        40526: 28662,
+        40527: 28663,
+        40528: 28664,
+        40529: 28665,
+        40530: 28666,
+        40531: 28667,
+        40532: 28668,
+        40533: 28669,
+        40534: 28670,
+        40535: 28671,
+        40536: 28672,
+        40537: 28673,
+        40538: 28674,
+        40539: 28675,
+        40540: 28676,
+        40541: 28677,
+        40542: 28678,
+        40543: 28679,
+        40544: 28680,
+        40545: 28681,
+        40546: 28682,
+        40547: 28683,
+        40548: 28684,
+        40549: 28685,
+        40550: 28686,
+        40551: 28687,
+        40552: 28688,
+        40553: 28690,
+        40554: 28691,
+        40555: 28692,
+        40556: 28693,
+        40557: 28694,
+        40558: 28695,
+        40559: 28696,
+        40560: 28697,
+        40561: 28700,
+        40562: 28701,
+        40563: 28702,
+        40564: 28703,
+        40565: 28704,
+        40566: 28705,
+        40567: 28706,
+        40568: 28708,
+        40569: 28709,
+        40570: 28710,
+        40571: 28711,
+        40572: 28712,
+        40573: 28713,
+        40574: 28714,
+        40576: 28715,
+        40577: 28716,
+        40578: 28717,
+        40579: 28718,
+        40580: 28719,
+        40581: 28720,
+        40582: 28721,
+        40583: 28722,
+        40584: 28723,
+        40585: 28724,
+        40586: 28726,
+        40587: 28727,
+        40588: 28728,
+        40589: 28730,
+        40590: 28731,
+        40591: 28732,
+        40592: 28733,
+        40593: 28734,
+        40594: 28735,
+        40595: 28736,
+        40596: 28737,
+        40597: 28738,
+        40598: 28739,
+        40599: 28740,
+        40600: 28741,
+        40601: 28742,
+        40602: 28743,
+        40603: 28744,
+        40604: 28745,
+        40605: 28746,
+        40606: 28747,
+        40607: 28749,
+        40608: 28750,
+        40609: 28752,
+        40610: 28753,
+        40611: 28754,
+        40612: 28755,
+        40613: 28756,
+        40614: 28757,
+        40615: 28758,
+        40616: 28759,
+        40617: 28760,
+        40618: 28761,
+        40619: 28762,
+        40620: 28763,
+        40621: 28764,
+        40622: 28765,
+        40623: 28767,
+        40624: 28768,
+        40625: 28769,
+        40626: 28770,
+        40627: 28771,
+        40628: 28772,
+        40629: 28773,
+        40630: 28774,
+        40631: 28775,
+        40632: 28776,
+        40633: 28777,
+        40634: 28778,
+        40635: 28782,
+        40636: 28785,
+        40637: 28786,
+        40638: 28787,
+        40639: 28788,
+        40640: 28791,
+        40641: 28793,
+        40642: 28794,
+        40643: 28795,
+        40644: 28797,
+        40645: 28801,
+        40646: 28802,
+        40647: 28803,
+        40648: 28804,
+        40649: 28806,
+        40650: 28807,
+        40651: 28808,
+        40652: 28811,
+        40653: 28812,
+        40654: 28813,
+        40655: 28815,
+        40656: 28816,
+        40657: 28817,
+        40658: 28819,
+        40659: 28823,
+        40660: 28824,
+        40661: 28826,
+        40662: 28827,
+        40663: 28830,
+        40664: 28831,
+        40665: 28832,
+        40666: 28833,
+        40667: 28834,
+        40668: 28835,
+        40669: 28836,
+        40670: 28837,
+        40671: 28838,
+        40672: 28839,
+        40673: 28840,
+        40674: 28841,
+        40675: 28842,
+        40676: 28848,
+        40677: 28850,
+        40678: 28852,
+        40679: 28853,
+        40680: 28854,
+        40681: 28858,
+        40682: 28862,
+        40683: 28863,
+        40684: 28868,
+        40685: 28869,
+        40686: 28870,
+        40687: 28871,
+        40688: 28873,
+        40689: 28875,
+        40690: 28876,
+        40691: 28877,
+        40692: 28878,
+        40693: 28879,
+        40694: 28880,
+        40695: 28881,
+        40696: 28882,
+        40697: 28883,
+        40698: 28884,
+        40699: 28885,
+        40700: 28886,
+        40701: 28887,
+        40702: 28890,
+        40768: 28892,
+        40769: 28893,
+        40770: 28894,
+        40771: 28896,
+        40772: 28897,
+        40773: 28898,
+        40774: 28899,
+        40775: 28901,
+        40776: 28906,
+        40777: 28910,
+        40778: 28912,
+        40779: 28913,
+        40780: 28914,
+        40781: 28915,
+        40782: 28916,
+        40783: 28917,
+        40784: 28918,
+        40785: 28920,
+        40786: 28922,
+        40787: 28923,
+        40788: 28924,
+        40789: 28926,
+        40790: 28927,
+        40791: 28928,
+        40792: 28929,
+        40793: 28930,
+        40794: 28931,
+        40795: 28932,
+        40796: 28933,
+        40797: 28934,
+        40798: 28935,
+        40799: 28936,
+        40800: 28939,
+        40801: 28940,
+        40802: 28941,
+        40803: 28942,
+        40804: 28943,
+        40805: 28945,
+        40806: 28946,
+        40807: 28948,
+        40808: 28951,
+        40809: 28955,
+        40810: 28956,
+        40811: 28957,
+        40812: 28958,
+        40813: 28959,
+        40814: 28960,
+        40815: 28961,
+        40816: 28962,
+        40817: 28963,
+        40818: 28964,
+        40819: 28965,
+        40820: 28967,
+        40821: 28968,
+        40822: 28969,
+        40823: 28970,
+        40824: 28971,
+        40825: 28972,
+        40826: 28973,
+        40827: 28974,
+        40828: 28978,
+        40829: 28979,
+        40830: 28980,
+        40832: 28981,
+        40833: 28983,
+        40834: 28984,
+        40835: 28985,
+        40836: 28986,
+        40837: 28987,
+        40838: 28988,
+        40839: 28989,
+        40840: 28990,
+        40841: 28991,
+        40842: 28992,
+        40843: 28993,
+        40844: 28994,
+        40845: 28995,
+        40846: 28996,
+        40847: 28998,
+        40848: 28999,
+        40849: 29000,
+        40850: 29001,
+        40851: 29003,
+        40852: 29005,
+        40853: 29007,
+        40854: 29008,
+        40855: 29009,
+        40856: 29010,
+        40857: 29011,
+        40858: 29012,
+        40859: 29013,
+        40860: 29014,
+        40861: 29015,
+        40862: 29016,
+        40863: 29017,
+        40864: 29018,
+        40865: 29019,
+        40866: 29021,
+        40867: 29023,
+        40868: 29024,
+        40869: 29025,
+        40870: 29026,
+        40871: 29027,
+        40872: 29029,
+        40873: 29033,
+        40874: 29034,
+        40875: 29035,
+        40876: 29036,
+        40877: 29037,
+        40878: 29039,
+        40879: 29040,
+        40880: 29041,
+        40881: 29044,
+        40882: 29045,
+        40883: 29046,
+        40884: 29047,
+        40885: 29049,
+        40886: 29051,
+        40887: 29052,
+        40888: 29054,
+        40889: 29055,
+        40890: 29056,
+        40891: 29057,
+        40892: 29058,
+        40893: 29059,
+        40894: 29061,
+        40895: 29062,
+        40896: 29063,
+        40897: 29064,
+        40898: 29065,
+        40899: 29067,
+        40900: 29068,
+        40901: 29069,
+        40902: 29070,
+        40903: 29072,
+        40904: 29073,
+        40905: 29074,
+        40906: 29075,
+        40907: 29077,
+        40908: 29078,
+        40909: 29079,
+        40910: 29082,
+        40911: 29083,
+        40912: 29084,
+        40913: 29085,
+        40914: 29086,
+        40915: 29089,
+        40916: 29090,
+        40917: 29091,
+        40918: 29092,
+        40919: 29093,
+        40920: 29094,
+        40921: 29095,
+        40922: 29097,
+        40923: 29098,
+        40924: 29099,
+        40925: 29101,
+        40926: 29102,
+        40927: 29103,
+        40928: 29104,
+        40929: 29105,
+        40930: 29106,
+        40931: 29108,
+        40932: 29110,
+        40933: 29111,
+        40934: 29112,
+        40935: 29114,
+        40936: 29115,
+        40937: 29116,
+        40938: 29117,
+        40939: 29118,
+        40940: 29119,
+        40941: 29120,
+        40942: 29121,
+        40943: 29122,
+        40944: 29124,
+        40945: 29125,
+        40946: 29126,
+        40947: 29127,
+        40948: 29128,
+        40949: 29129,
+        40950: 29130,
+        40951: 29131,
+        40952: 29132,
+        40953: 29133,
+        40954: 29135,
+        40955: 29136,
+        40956: 29137,
+        40957: 29138,
+        40958: 29139,
+        41024: 29142,
+        41025: 29143,
+        41026: 29144,
+        41027: 29145,
+        41028: 29146,
+        41029: 29147,
+        41030: 29148,
+        41031: 29149,
+        41032: 29150,
+        41033: 29151,
+        41034: 29153,
+        41035: 29154,
+        41036: 29155,
+        41037: 29156,
+        41038: 29158,
+        41039: 29160,
+        41040: 29161,
+        41041: 29162,
+        41042: 29163,
+        41043: 29164,
+        41044: 29165,
+        41045: 29167,
+        41046: 29168,
+        41047: 29169,
+        41048: 29170,
+        41049: 29171,
+        41050: 29172,
+        41051: 29173,
+        41052: 29174,
+        41053: 29175,
+        41054: 29176,
+        41055: 29178,
+        41056: 29179,
+        41057: 29180,
+        41058: 29181,
+        41059: 29182,
+        41060: 29183,
+        41061: 29184,
+        41062: 29185,
+        41063: 29186,
+        41064: 29187,
+        41065: 29188,
+        41066: 29189,
+        41067: 29191,
+        41068: 29192,
+        41069: 29193,
+        41070: 29194,
+        41071: 29195,
+        41072: 29196,
+        41073: 29197,
+        41074: 29198,
+        41075: 29199,
+        41076: 29200,
+        41077: 29201,
+        41078: 29202,
+        41079: 29203,
+        41080: 29204,
+        41081: 29205,
+        41082: 29206,
+        41083: 29207,
+        41084: 29208,
+        41085: 29209,
+        41086: 29210,
+        41088: 29211,
+        41089: 29212,
+        41090: 29214,
+        41091: 29215,
+        41092: 29216,
+        41093: 29217,
+        41094: 29218,
+        41095: 29219,
+        41096: 29220,
+        41097: 29221,
+        41098: 29222,
+        41099: 29223,
+        41100: 29225,
+        41101: 29227,
+        41102: 29229,
+        41103: 29230,
+        41104: 29231,
+        41105: 29234,
+        41106: 29235,
+        41107: 29236,
+        41108: 29242,
+        41109: 29244,
+        41110: 29246,
+        41111: 29248,
+        41112: 29249,
+        41113: 29250,
+        41114: 29251,
+        41115: 29252,
+        41116: 29253,
+        41117: 29254,
+        41118: 29257,
+        41119: 29258,
+        41120: 29259,
+        41121: 29262,
+        41122: 29263,
+        41123: 29264,
+        41124: 29265,
+        41125: 29267,
+        41126: 29268,
+        41127: 29269,
+        41128: 29271,
+        41129: 29272,
+        41130: 29274,
+        41131: 29276,
+        41132: 29278,
+        41133: 29280,
+        41134: 29283,
+        41135: 29284,
+        41136: 29285,
+        41137: 29288,
+        41138: 29290,
+        41139: 29291,
+        41140: 29292,
+        41141: 29293,
+        41142: 29296,
+        41143: 29297,
+        41144: 29299,
+        41145: 29300,
+        41146: 29302,
+        41147: 29303,
+        41148: 29304,
+        41149: 29307,
+        41150: 29308,
+        41151: 29309,
+        41152: 29314,
+        41153: 29315,
+        41154: 29317,
+        41155: 29318,
+        41156: 29319,
+        41157: 29320,
+        41158: 29321,
+        41159: 29324,
+        41160: 29326,
+        41161: 29328,
+        41162: 29329,
+        41163: 29331,
+        41164: 29332,
+        41165: 29333,
+        41166: 29334,
+        41167: 29335,
+        41168: 29336,
+        41169: 29337,
+        41170: 29338,
+        41171: 29339,
+        41172: 29340,
+        41173: 29341,
+        41174: 29342,
+        41175: 29344,
+        41176: 29345,
+        41177: 29346,
+        41178: 29347,
+        41179: 29348,
+        41180: 29349,
+        41181: 29350,
+        41182: 29351,
+        41183: 29352,
+        41184: 29353,
+        41185: 29354,
+        41186: 29355,
+        41187: 29358,
+        41188: 29361,
+        41189: 29362,
+        41190: 29363,
+        41191: 29365,
+        41192: 29370,
+        41193: 29371,
+        41194: 29372,
+        41195: 29373,
+        41196: 29374,
+        41197: 29375,
+        41198: 29376,
+        41199: 29381,
+        41200: 29382,
+        41201: 29383,
+        41202: 29385,
+        41203: 29386,
+        41204: 29387,
+        41205: 29388,
+        41206: 29391,
+        41207: 29393,
+        41208: 29395,
+        41209: 29396,
+        41210: 29397,
+        41211: 29398,
+        41212: 29400,
+        41213: 29402,
+        41214: 29403,
+        41280: 58566,
+        41281: 58567,
+        41282: 58568,
+        41283: 58569,
+        41284: 58570,
+        41285: 58571,
+        41286: 58572,
+        41287: 58573,
+        41288: 58574,
+        41289: 58575,
+        41290: 58576,
+        41291: 58577,
+        41292: 58578,
+        41293: 58579,
+        41294: 58580,
+        41295: 58581,
+        41296: 58582,
+        41297: 58583,
+        41298: 58584,
+        41299: 58585,
+        41300: 58586,
+        41301: 58587,
+        41302: 58588,
+        41303: 58589,
+        41304: 58590,
+        41305: 58591,
+        41306: 58592,
+        41307: 58593,
+        41308: 58594,
+        41309: 58595,
+        41310: 58596,
+        41311: 58597,
+        41312: 58598,
+        41313: 58599,
+        41314: 58600,
+        41315: 58601,
+        41316: 58602,
+        41317: 58603,
+        41318: 58604,
+        41319: 58605,
+        41320: 58606,
+        41321: 58607,
+        41322: 58608,
+        41323: 58609,
+        41324: 58610,
+        41325: 58611,
+        41326: 58612,
+        41327: 58613,
+        41328: 58614,
+        41329: 58615,
+        41330: 58616,
+        41331: 58617,
+        41332: 58618,
+        41333: 58619,
+        41334: 58620,
+        41335: 58621,
+        41336: 58622,
+        41337: 58623,
+        41338: 58624,
+        41339: 58625,
+        41340: 58626,
+        41341: 58627,
+        41342: 58628,
+        41344: 58629,
+        41345: 58630,
+        41346: 58631,
+        41347: 58632,
+        41348: 58633,
+        41349: 58634,
+        41350: 58635,
+        41351: 58636,
+        41352: 58637,
+        41353: 58638,
+        41354: 58639,
+        41355: 58640,
+        41356: 58641,
+        41357: 58642,
+        41358: 58643,
+        41359: 58644,
+        41360: 58645,
+        41361: 58646,
+        41362: 58647,
+        41363: 58648,
+        41364: 58649,
+        41365: 58650,
+        41366: 58651,
+        41367: 58652,
+        41368: 58653,
+        41369: 58654,
+        41370: 58655,
+        41371: 58656,
+        41372: 58657,
+        41373: 58658,
+        41374: 58659,
+        41375: 58660,
+        41376: 58661,
+        41377: 12288,
+        41378: 12289,
+        41379: 12290,
+        41380: 183,
+        41381: 713,
+        41382: 711,
+        41383: 168,
+        41384: 12291,
+        41385: 12293,
+        41386: 8212,
+        41387: 65374,
+        41388: 8214,
+        41389: 8230,
+        41390: 8216,
+        41391: 8217,
+        41392: 8220,
+        41393: 8221,
+        41394: 12308,
+        41395: 12309,
+        41396: 12296,
+        41397: 12297,
+        41398: 12298,
+        41399: 12299,
+        41400: 12300,
+        41401: 12301,
+        41402: 12302,
+        41403: 12303,
+        41404: 12310,
+        41405: 12311,
+        41406: 12304,
+        41407: 12305,
+        41408: 177,
+        41409: 215,
+        41410: 247,
+        41411: 8758,
+        41412: 8743,
+        41413: 8744,
+        41414: 8721,
+        41415: 8719,
+        41416: 8746,
+        41417: 8745,
+        41418: 8712,
+        41419: 8759,
+        41420: 8730,
+        41421: 8869,
+        41422: 8741,
+        41423: 8736,
+        41424: 8978,
+        41425: 8857,
+        41426: 8747,
+        41427: 8750,
+        41428: 8801,
+        41429: 8780,
+        41430: 8776,
+        41431: 8765,
+        41432: 8733,
+        41433: 8800,
+        41434: 8814,
+        41435: 8815,
+        41436: 8804,
+        41437: 8805,
+        41438: 8734,
+        41439: 8757,
+        41440: 8756,
+        41441: 9794,
+        41442: 9792,
+        41443: 176,
+        41444: 8242,
+        41445: 8243,
+        41446: 8451,
+        41447: 65284,
+        41448: 164,
+        41449: 65504,
+        41450: 65505,
+        41451: 8240,
+        41452: 167,
+        41453: 8470,
+        41454: 9734,
+        41455: 9733,
+        41456: 9675,
+        41457: 9679,
+        41458: 9678,
+        41459: 9671,
+        41460: 9670,
+        41461: 9633,
+        41462: 9632,
+        41463: 9651,
+        41464: 9650,
+        41465: 8251,
+        41466: 8594,
+        41467: 8592,
+        41468: 8593,
+        41469: 8595,
+        41470: 12307,
+        41536: 58662,
+        41537: 58663,
+        41538: 58664,
+        41539: 58665,
+        41540: 58666,
+        41541: 58667,
+        41542: 58668,
+        41543: 58669,
+        41544: 58670,
+        41545: 58671,
+        41546: 58672,
+        41547: 58673,
+        41548: 58674,
+        41549: 58675,
+        41550: 58676,
+        41551: 58677,
+        41552: 58678,
+        41553: 58679,
+        41554: 58680,
+        41555: 58681,
+        41556: 58682,
+        41557: 58683,
+        41558: 58684,
+        41559: 58685,
+        41560: 58686,
+        41561: 58687,
+        41562: 58688,
+        41563: 58689,
+        41564: 58690,
+        41565: 58691,
+        41566: 58692,
+        41567: 58693,
+        41568: 58694,
+        41569: 58695,
+        41570: 58696,
+        41571: 58697,
+        41572: 58698,
+        41573: 58699,
+        41574: 58700,
+        41575: 58701,
+        41576: 58702,
+        41577: 58703,
+        41578: 58704,
+        41579: 58705,
+        41580: 58706,
+        41581: 58707,
+        41582: 58708,
+        41583: 58709,
+        41584: 58710,
+        41585: 58711,
+        41586: 58712,
+        41587: 58713,
+        41588: 58714,
+        41589: 58715,
+        41590: 58716,
+        41591: 58717,
+        41592: 58718,
+        41593: 58719,
+        41594: 58720,
+        41595: 58721,
+        41596: 58722,
+        41597: 58723,
+        41598: 58724,
+        41600: 58725,
+        41601: 58726,
+        41602: 58727,
+        41603: 58728,
+        41604: 58729,
+        41605: 58730,
+        41606: 58731,
+        41607: 58732,
+        41608: 58733,
+        41609: 58734,
+        41610: 58735,
+        41611: 58736,
+        41612: 58737,
+        41613: 58738,
+        41614: 58739,
+        41615: 58740,
+        41616: 58741,
+        41617: 58742,
+        41618: 58743,
+        41619: 58744,
+        41620: 58745,
+        41621: 58746,
+        41622: 58747,
+        41623: 58748,
+        41624: 58749,
+        41625: 58750,
+        41626: 58751,
+        41627: 58752,
+        41628: 58753,
+        41629: 58754,
+        41630: 58755,
+        41631: 58756,
+        41632: 58757,
+        41633: 8560,
+        41634: 8561,
+        41635: 8562,
+        41636: 8563,
+        41637: 8564,
+        41638: 8565,
+        41639: 8566,
+        41640: 8567,
+        41641: 8568,
+        41642: 8569,
+        41643: 59238,
+        41644: 59239,
+        41645: 59240,
+        41646: 59241,
+        41647: 59242,
+        41648: 59243,
+        41649: 9352,
+        41650: 9353,
+        41651: 9354,
+        41652: 9355,
+        41653: 9356,
+        41654: 9357,
+        41655: 9358,
+        41656: 9359,
+        41657: 9360,
+        41658: 9361,
+        41659: 9362,
+        41660: 9363,
+        41661: 9364,
+        41662: 9365,
+        41663: 9366,
+        41664: 9367,
+        41665: 9368,
+        41666: 9369,
+        41667: 9370,
+        41668: 9371,
+        41669: 9332,
+        41670: 9333,
+        41671: 9334,
+        41672: 9335,
+        41673: 9336,
+        41674: 9337,
+        41675: 9338,
+        41676: 9339,
+        41677: 9340,
+        41678: 9341,
+        41679: 9342,
+        41680: 9343,
+        41681: 9344,
+        41682: 9345,
+        41683: 9346,
+        41684: 9347,
+        41685: 9348,
+        41686: 9349,
+        41687: 9350,
+        41688: 9351,
+        41689: 9312,
+        41690: 9313,
+        41691: 9314,
+        41692: 9315,
+        41693: 9316,
+        41694: 9317,
+        41695: 9318,
+        41696: 9319,
+        41697: 9320,
+        41698: 9321,
+        41699: 8364,
+        41700: 59245,
+        41701: 12832,
+        41702: 12833,
+        41703: 12834,
+        41704: 12835,
+        41705: 12836,
+        41706: 12837,
+        41707: 12838,
+        41708: 12839,
+        41709: 12840,
+        41710: 12841,
+        41711: 59246,
+        41712: 59247,
+        41713: 8544,
+        41714: 8545,
+        41715: 8546,
+        41716: 8547,
+        41717: 8548,
+        41718: 8549,
+        41719: 8550,
+        41720: 8551,
+        41721: 8552,
+        41722: 8553,
+        41723: 8554,
+        41724: 8555,
+        41725: 59248,
+        41726: 59249,
+        41792: 58758,
+        41793: 58759,
+        41794: 58760,
+        41795: 58761,
+        41796: 58762,
+        41797: 58763,
+        41798: 58764,
+        41799: 58765,
+        41800: 58766,
+        41801: 58767,
+        41802: 58768,
+        41803: 58769,
+        41804: 58770,
+        41805: 58771,
+        41806: 58772,
+        41807: 58773,
+        41808: 58774,
+        41809: 58775,
+        41810: 58776,
+        41811: 58777,
+        41812: 58778,
+        41813: 58779,
+        41814: 58780,
+        41815: 58781,
+        41816: 58782,
+        41817: 58783,
+        41818: 58784,
+        41819: 58785,
+        41820: 58786,
+        41821: 58787,
+        41822: 58788,
+        41823: 58789,
+        41824: 58790,
+        41825: 58791,
+        41826: 58792,
+        41827: 58793,
+        41828: 58794,
+        41829: 58795,
+        41830: 58796,
+        41831: 58797,
+        41832: 58798,
+        41833: 58799,
+        41834: 58800,
+        41835: 58801,
+        41836: 58802,
+        41837: 58803,
+        41838: 58804,
+        41839: 58805,
+        41840: 58806,
+        41841: 58807,
+        41842: 58808,
+        41843: 58809,
+        41844: 58810,
+        41845: 58811,
+        41846: 58812,
+        41847: 58813,
+        41848: 58814,
+        41849: 58815,
+        41850: 58816,
+        41851: 58817,
+        41852: 58818,
+        41853: 58819,
+        41854: 58820,
+        41856: 58821,
+        41857: 58822,
+        41858: 58823,
+        41859: 58824,
+        41860: 58825,
+        41861: 58826,
+        41862: 58827,
+        41863: 58828,
+        41864: 58829,
+        41865: 58830,
+        41866: 58831,
+        41867: 58832,
+        41868: 58833,
+        41869: 58834,
+        41870: 58835,
+        41871: 58836,
+        41872: 58837,
+        41873: 58838,
+        41874: 58839,
+        41875: 58840,
+        41876: 58841,
+        41877: 58842,
+        41878: 58843,
+        41879: 58844,
+        41880: 58845,
+        41881: 58846,
+        41882: 58847,
+        41883: 58848,
+        41884: 58849,
+        41885: 58850,
+        41886: 58851,
+        41887: 58852,
+        41888: 58853,
+        41889: 65281,
+        41890: 65282,
+        41891: 65283,
+        41892: 65509,
+        41893: 65285,
+        41894: 65286,
+        41895: 65287,
+        41896: 65288,
+        41897: 65289,
+        41898: 65290,
+        41899: 65291,
+        41900: 65292,
+        41901: 65293,
+        41902: 65294,
+        41903: 65295,
+        41904: 65296,
+        41905: 65297,
+        41906: 65298,
+        41907: 65299,
+        41908: 65300,
+        41909: 65301,
+        41910: 65302,
+        41911: 65303,
+        41912: 65304,
+        41913: 65305,
+        41914: 65306,
+        41915: 65307,
+        41916: 65308,
+        41917: 65309,
+        41918: 65310,
+        41919: 65311,
+        41920: 65312,
+        41921: 65313,
+        41922: 65314,
+        41923: 65315,
+        41924: 65316,
+        41925: 65317,
+        41926: 65318,
+        41927: 65319,
+        41928: 65320,
+        41929: 65321,
+        41930: 65322,
+        41931: 65323,
+        41932: 65324,
+        41933: 65325,
+        41934: 65326,
+        41935: 65327,
+        41936: 65328,
+        41937: 65329,
+        41938: 65330,
+        41939: 65331,
+        41940: 65332,
+        41941: 65333,
+        41942: 65334,
+        41943: 65335,
+        41944: 65336,
+        41945: 65337,
+        41946: 65338,
+        41947: 65339,
+        41948: 65340,
+        41949: 65341,
+        41950: 65342,
+        41951: 65343,
+        41952: 65344,
+        41953: 65345,
+        41954: 65346,
+        41955: 65347,
+        41956: 65348,
+        41957: 65349,
+        41958: 65350,
+        41959: 65351,
+        41960: 65352,
+        41961: 65353,
+        41962: 65354,
+        41963: 65355,
+        41964: 65356,
+        41965: 65357,
+        41966: 65358,
+        41967: 65359,
+        41968: 65360,
+        41969: 65361,
+        41970: 65362,
+        41971: 65363,
+        41972: 65364,
+        41973: 65365,
+        41974: 65366,
+        41975: 65367,
+        41976: 65368,
+        41977: 65369,
+        41978: 65370,
+        41979: 65371,
+        41980: 65372,
+        41981: 65373,
+        41982: 65507,
+        42048: 58854,
+        42049: 58855,
+        42050: 58856,
+        42051: 58857,
+        42052: 58858,
+        42053: 58859,
+        42054: 58860,
+        42055: 58861,
+        42056: 58862,
+        42057: 58863,
+        42058: 58864,
+        42059: 58865,
+        42060: 58866,
+        42061: 58867,
+        42062: 58868,
+        42063: 58869,
+        42064: 58870,
+        42065: 58871,
+        42066: 58872,
+        42067: 58873,
+        42068: 58874,
+        42069: 58875,
+        42070: 58876,
+        42071: 58877,
+        42072: 58878,
+        42073: 58879,
+        42074: 58880,
+        42075: 58881,
+        42076: 58882,
+        42077: 58883,
+        42078: 58884,
+        42079: 58885,
+        42080: 58886,
+        42081: 58887,
+        42082: 58888,
+        42083: 58889,
+        42084: 58890,
+        42085: 58891,
+        42086: 58892,
+        42087: 58893,
+        42088: 58894,
+        42089: 58895,
+        42090: 58896,
+        42091: 58897,
+        42092: 58898,
+        42093: 58899,
+        42094: 58900,
+        42095: 58901,
+        42096: 58902,
+        42097: 58903,
+        42098: 58904,
+        42099: 58905,
+        42100: 58906,
+        42101: 58907,
+        42102: 58908,
+        42103: 58909,
+        42104: 58910,
+        42105: 58911,
+        42106: 58912,
+        42107: 58913,
+        42108: 58914,
+        42109: 58915,
+        42110: 58916,
+        42112: 58917,
+        42113: 58918,
+        42114: 58919,
+        42115: 58920,
+        42116: 58921,
+        42117: 58922,
+        42118: 58923,
+        42119: 58924,
+        42120: 58925,
+        42121: 58926,
+        42122: 58927,
+        42123: 58928,
+        42124: 58929,
+        42125: 58930,
+        42126: 58931,
+        42127: 58932,
+        42128: 58933,
+        42129: 58934,
+        42130: 58935,
+        42131: 58936,
+        42132: 58937,
+        42133: 58938,
+        42134: 58939,
+        42135: 58940,
+        42136: 58941,
+        42137: 58942,
+        42138: 58943,
+        42139: 58944,
+        42140: 58945,
+        42141: 58946,
+        42142: 58947,
+        42143: 58948,
+        42144: 58949,
+        42145: 12353,
+        42146: 12354,
+        42147: 12355,
+        42148: 12356,
+        42149: 12357,
+        42150: 12358,
+        42151: 12359,
+        42152: 12360,
+        42153: 12361,
+        42154: 12362,
+        42155: 12363,
+        42156: 12364,
+        42157: 12365,
+        42158: 12366,
+        42159: 12367,
+        42160: 12368,
+        42161: 12369,
+        42162: 12370,
+        42163: 12371,
+        42164: 12372,
+        42165: 12373,
+        42166: 12374,
+        42167: 12375,
+        42168: 12376,
+        42169: 12377,
+        42170: 12378,
+        42171: 12379,
+        42172: 12380,
+        42173: 12381,
+        42174: 12382,
+        42175: 12383,
+        42176: 12384,
+        42177: 12385,
+        42178: 12386,
+        42179: 12387,
+        42180: 12388,
+        42181: 12389,
+        42182: 12390,
+        42183: 12391,
+        42184: 12392,
+        42185: 12393,
+        42186: 12394,
+        42187: 12395,
+        42188: 12396,
+        42189: 12397,
+        42190: 12398,
+        42191: 12399,
+        42192: 12400,
+        42193: 12401,
+        42194: 12402,
+        42195: 12403,
+        42196: 12404,
+        42197: 12405,
+        42198: 12406,
+        42199: 12407,
+        42200: 12408,
+        42201: 12409,
+        42202: 12410,
+        42203: 12411,
+        42204: 12412,
+        42205: 12413,
+        42206: 12414,
+        42207: 12415,
+        42208: 12416,
+        42209: 12417,
+        42210: 12418,
+        42211: 12419,
+        42212: 12420,
+        42213: 12421,
+        42214: 12422,
+        42215: 12423,
+        42216: 12424,
+        42217: 12425,
+        42218: 12426,
+        42219: 12427,
+        42220: 12428,
+        42221: 12429,
+        42222: 12430,
+        42223: 12431,
+        42224: 12432,
+        42225: 12433,
+        42226: 12434,
+        42227: 12435,
+        42228: 59250,
+        42229: 59251,
+        42230: 59252,
+        42231: 59253,
+        42232: 59254,
+        42233: 59255,
+        42234: 59256,
+        42235: 59257,
+        42236: 59258,
+        42237: 59259,
+        42238: 59260,
+        42304: 58950,
+        42305: 58951,
+        42306: 58952,
+        42307: 58953,
+        42308: 58954,
+        42309: 58955,
+        42310: 58956,
+        42311: 58957,
+        42312: 58958,
+        42313: 58959,
+        42314: 58960,
+        42315: 58961,
+        42316: 58962,
+        42317: 58963,
+        42318: 58964,
+        42319: 58965,
+        42320: 58966,
+        42321: 58967,
+        42322: 58968,
+        42323: 58969,
+        42324: 58970,
+        42325: 58971,
+        42326: 58972,
+        42327: 58973,
+        42328: 58974,
+        42329: 58975,
+        42330: 58976,
+        42331: 58977,
+        42332: 58978,
+        42333: 58979,
+        42334: 58980,
+        42335: 58981,
+        42336: 58982,
+        42337: 58983,
+        42338: 58984,
+        42339: 58985,
+        42340: 58986,
+        42341: 58987,
+        42342: 58988,
+        42343: 58989,
+        42344: 58990,
+        42345: 58991,
+        42346: 58992,
+        42347: 58993,
+        42348: 58994,
+        42349: 58995,
+        42350: 58996,
+        42351: 58997,
+        42352: 58998,
+        42353: 58999,
+        42354: 59000,
+        42355: 59001,
+        42356: 59002,
+        42357: 59003,
+        42358: 59004,
+        42359: 59005,
+        42360: 59006,
+        42361: 59007,
+        42362: 59008,
+        42363: 59009,
+        42364: 59010,
+        42365: 59011,
+        42366: 59012,
+        42368: 59013,
+        42369: 59014,
+        42370: 59015,
+        42371: 59016,
+        42372: 59017,
+        42373: 59018,
+        42374: 59019,
+        42375: 59020,
+        42376: 59021,
+        42377: 59022,
+        42378: 59023,
+        42379: 59024,
+        42380: 59025,
+        42381: 59026,
+        42382: 59027,
+        42383: 59028,
+        42384: 59029,
+        42385: 59030,
+        42386: 59031,
+        42387: 59032,
+        42388: 59033,
+        42389: 59034,
+        42390: 59035,
+        42391: 59036,
+        42392: 59037,
+        42393: 59038,
+        42394: 59039,
+        42395: 59040,
+        42396: 59041,
+        42397: 59042,
+        42398: 59043,
+        42399: 59044,
+        42400: 59045,
+        42401: 12449,
+        42402: 12450,
+        42403: 12451,
+        42404: 12452,
+        42405: 12453,
+        42406: 12454,
+        42407: 12455,
+        42408: 12456,
+        42409: 12457,
+        42410: 12458,
+        42411: 12459,
+        42412: 12460,
+        42413: 12461,
+        42414: 12462,
+        42415: 12463,
+        42416: 12464,
+        42417: 12465,
+        42418: 12466,
+        42419: 12467,
+        42420: 12468,
+        42421: 12469,
+        42422: 12470,
+        42423: 12471,
+        42424: 12472,
+        42425: 12473,
+        42426: 12474,
+        42427: 12475,
+        42428: 12476,
+        42429: 12477,
+        42430: 12478,
+        42431: 12479,
+        42432: 12480,
+        42433: 12481,
+        42434: 12482,
+        42435: 12483,
+        42436: 12484,
+        42437: 12485,
+        42438: 12486,
+        42439: 12487,
+        42440: 12488,
+        42441: 12489,
+        42442: 12490,
+        42443: 12491,
+        42444: 12492,
+        42445: 12493,
+        42446: 12494,
+        42447: 12495,
+        42448: 12496,
+        42449: 12497,
+        42450: 12498,
+        42451: 12499,
+        42452: 12500,
+        42453: 12501,
+        42454: 12502,
+        42455: 12503,
+        42456: 12504,
+        42457: 12505,
+        42458: 12506,
+        42459: 12507,
+        42460: 12508,
+        42461: 12509,
+        42462: 12510,
+        42463: 12511,
+        42464: 12512,
+        42465: 12513,
+        42466: 12514,
+        42467: 12515,
+        42468: 12516,
+        42469: 12517,
+        42470: 12518,
+        42471: 12519,
+        42472: 12520,
+        42473: 12521,
+        42474: 12522,
+        42475: 12523,
+        42476: 12524,
+        42477: 12525,
+        42478: 12526,
+        42479: 12527,
+        42480: 12528,
+        42481: 12529,
+        42482: 12530,
+        42483: 12531,
+        42484: 12532,
+        42485: 12533,
+        42486: 12534,
+        42487: 59261,
+        42488: 59262,
+        42489: 59263,
+        42490: 59264,
+        42491: 59265,
+        42492: 59266,
+        42493: 59267,
+        42494: 59268,
+        42560: 59046,
+        42561: 59047,
+        42562: 59048,
+        42563: 59049,
+        42564: 59050,
+        42565: 59051,
+        42566: 59052,
+        42567: 59053,
+        42568: 59054,
+        42569: 59055,
+        42570: 59056,
+        42571: 59057,
+        42572: 59058,
+        42573: 59059,
+        42574: 59060,
+        42575: 59061,
+        42576: 59062,
+        42577: 59063,
+        42578: 59064,
+        42579: 59065,
+        42580: 59066,
+        42581: 59067,
+        42582: 59068,
+        42583: 59069,
+        42584: 59070,
+        42585: 59071,
+        42586: 59072,
+        42587: 59073,
+        42588: 59074,
+        42589: 59075,
+        42590: 59076,
+        42591: 59077,
+        42592: 59078,
+        42593: 59079,
+        42594: 59080,
+        42595: 59081,
+        42596: 59082,
+        42597: 59083,
+        42598: 59084,
+        42599: 59085,
+        42600: 59086,
+        42601: 59087,
+        42602: 59088,
+        42603: 59089,
+        42604: 59090,
+        42605: 59091,
+        42606: 59092,
+        42607: 59093,
+        42608: 59094,
+        42609: 59095,
+        42610: 59096,
+        42611: 59097,
+        42612: 59098,
+        42613: 59099,
+        42614: 59100,
+        42615: 59101,
+        42616: 59102,
+        42617: 59103,
+        42618: 59104,
+        42619: 59105,
+        42620: 59106,
+        42621: 59107,
+        42622: 59108,
+        42624: 59109,
+        42625: 59110,
+        42626: 59111,
+        42627: 59112,
+        42628: 59113,
+        42629: 59114,
+        42630: 59115,
+        42631: 59116,
+        42632: 59117,
+        42633: 59118,
+        42634: 59119,
+        42635: 59120,
+        42636: 59121,
+        42637: 59122,
+        42638: 59123,
+        42639: 59124,
+        42640: 59125,
+        42641: 59126,
+        42642: 59127,
+        42643: 59128,
+        42644: 59129,
+        42645: 59130,
+        42646: 59131,
+        42647: 59132,
+        42648: 59133,
+        42649: 59134,
+        42650: 59135,
+        42651: 59136,
+        42652: 59137,
+        42653: 59138,
+        42654: 59139,
+        42655: 59140,
+        42656: 59141,
+        42657: 913,
+        42658: 914,
+        42659: 915,
+        42660: 916,
+        42661: 917,
+        42662: 918,
+        42663: 919,
+        42664: 920,
+        42665: 921,
+        42666: 922,
+        42667: 923,
+        42668: 924,
+        42669: 925,
+        42670: 926,
+        42671: 927,
+        42672: 928,
+        42673: 929,
+        42674: 931,
+        42675: 932,
+        42676: 933,
+        42677: 934,
+        42678: 935,
+        42679: 936,
+        42680: 937,
+        42681: 59269,
+        42682: 59270,
+        42683: 59271,
+        42684: 59272,
+        42685: 59273,
+        42686: 59274,
+        42687: 59275,
+        42688: 59276,
+        42689: 945,
+        42690: 946,
+        42691: 947,
+        42692: 948,
+        42693: 949,
+        42694: 950,
+        42695: 951,
+        42696: 952,
+        42697: 953,
+        42698: 954,
+        42699: 955,
+        42700: 956,
+        42701: 957,
+        42702: 958,
+        42703: 959,
+        42704: 960,
+        42705: 961,
+        42706: 963,
+        42707: 964,
+        42708: 965,
+        42709: 966,
+        42710: 967,
+        42711: 968,
+        42712: 969,
+        42713: 59277,
+        42714: 59278,
+        42715: 59279,
+        42716: 59280,
+        42717: 59281,
+        42718: 59282,
+        42719: 59283,
+        42720: 65077,
+        42721: 65078,
+        42722: 65081,
+        42723: 65082,
+        42724: 65087,
+        42725: 65088,
+        42726: 65085,
+        42727: 65086,
+        42728: 65089,
+        42729: 65090,
+        42730: 65091,
+        42731: 65092,
+        42732: 59284,
+        42733: 59285,
+        42734: 65083,
+        42735: 65084,
+        42736: 65079,
+        42737: 65080,
+        42738: 65073,
+        42739: 59286,
+        42740: 65075,
+        42741: 65076,
+        42742: 59287,
+        42743: 59288,
+        42744: 59289,
+        42745: 59290,
+        42746: 59291,
+        42747: 59292,
+        42748: 59293,
+        42749: 59294,
+        42750: 59295,
+        42816: 59142,
+        42817: 59143,
+        42818: 59144,
+        42819: 59145,
+        42820: 59146,
+        42821: 59147,
+        42822: 59148,
+        42823: 59149,
+        42824: 59150,
+        42825: 59151,
+        42826: 59152,
+        42827: 59153,
+        42828: 59154,
+        42829: 59155,
+        42830: 59156,
+        42831: 59157,
+        42832: 59158,
+        42833: 59159,
+        42834: 59160,
+        42835: 59161,
+        42836: 59162,
+        42837: 59163,
+        42838: 59164,
+        42839: 59165,
+        42840: 59166,
+        42841: 59167,
+        42842: 59168,
+        42843: 59169,
+        42844: 59170,
+        42845: 59171,
+        42846: 59172,
+        42847: 59173,
+        42848: 59174,
+        42849: 59175,
+        42850: 59176,
+        42851: 59177,
+        42852: 59178,
+        42853: 59179,
+        42854: 59180,
+        42855: 59181,
+        42856: 59182,
+        42857: 59183,
+        42858: 59184,
+        42859: 59185,
+        42860: 59186,
+        42861: 59187,
+        42862: 59188,
+        42863: 59189,
+        42864: 59190,
+        42865: 59191,
+        42866: 59192,
+        42867: 59193,
+        42868: 59194,
+        42869: 59195,
+        42870: 59196,
+        42871: 59197,
+        42872: 59198,
+        42873: 59199,
+        42874: 59200,
+        42875: 59201,
+        42876: 59202,
+        42877: 59203,
+        42878: 59204,
+        42880: 59205,
+        42881: 59206,
+        42882: 59207,
+        42883: 59208,
+        42884: 59209,
+        42885: 59210,
+        42886: 59211,
+        42887: 59212,
+        42888: 59213,
+        42889: 59214,
+        42890: 59215,
+        42891: 59216,
+        42892: 59217,
+        42893: 59218,
+        42894: 59219,
+        42895: 59220,
+        42896: 59221,
+        42897: 59222,
+        42898: 59223,
+        42899: 59224,
+        42900: 59225,
+        42901: 59226,
+        42902: 59227,
+        42903: 59228,
+        42904: 59229,
+        42905: 59230,
+        42906: 59231,
+        42907: 59232,
+        42908: 59233,
+        42909: 59234,
+        42910: 59235,
+        42911: 59236,
+        42912: 59237,
+        42913: 1040,
+        42914: 1041,
+        42915: 1042,
+        42916: 1043,
+        42917: 1044,
+        42918: 1045,
+        42919: 1025,
+        42920: 1046,
+        42921: 1047,
+        42922: 1048,
+        42923: 1049,
+        42924: 1050,
+        42925: 1051,
+        42926: 1052,
+        42927: 1053,
+        42928: 1054,
+        42929: 1055,
+        42930: 1056,
+        42931: 1057,
+        42932: 1058,
+        42933: 1059,
+        42934: 1060,
+        42935: 1061,
+        42936: 1062,
+        42937: 1063,
+        42938: 1064,
+        42939: 1065,
+        42940: 1066,
+        42941: 1067,
+        42942: 1068,
+        42943: 1069,
+        42944: 1070,
+        42945: 1071,
+        42946: 59296,
+        42947: 59297,
+        42948: 59298,
+        42949: 59299,
+        42950: 59300,
+        42951: 59301,
+        42952: 59302,
+        42953: 59303,
+        42954: 59304,
+        42955: 59305,
+        42956: 59306,
+        42957: 59307,
+        42958: 59308,
+        42959: 59309,
+        42960: 59310,
+        42961: 1072,
+        42962: 1073,
+        42963: 1074,
+        42964: 1075,
+        42965: 1076,
+        42966: 1077,
+        42967: 1105,
+        42968: 1078,
+        42969: 1079,
+        42970: 1080,
+        42971: 1081,
+        42972: 1082,
+        42973: 1083,
+        42974: 1084,
+        42975: 1085,
+        42976: 1086,
+        42977: 1087,
+        42978: 1088,
+        42979: 1089,
+        42980: 1090,
+        42981: 1091,
+        42982: 1092,
+        42983: 1093,
+        42984: 1094,
+        42985: 1095,
+        42986: 1096,
+        42987: 1097,
+        42988: 1098,
+        42989: 1099,
+        42990: 1100,
+        42991: 1101,
+        42992: 1102,
+        42993: 1103,
+        42994: 59311,
+        42995: 59312,
+        42996: 59313,
+        42997: 59314,
+        42998: 59315,
+        42999: 59316,
+        43000: 59317,
+        43001: 59318,
+        43002: 59319,
+        43003: 59320,
+        43004: 59321,
+        43005: 59322,
+        43006: 59323,
+        43072: 714,
+        43073: 715,
+        43074: 729,
+        43075: 8211,
+        43076: 8213,
+        43077: 8229,
+        43078: 8245,
+        43079: 8453,
+        43080: 8457,
+        43081: 8598,
+        43082: 8599,
+        43083: 8600,
+        43084: 8601,
+        43085: 8725,
+        43086: 8735,
+        43087: 8739,
+        43088: 8786,
+        43089: 8806,
+        43090: 8807,
+        43091: 8895,
+        43092: 9552,
+        43093: 9553,
+        43094: 9554,
+        43095: 9555,
+        43096: 9556,
+        43097: 9557,
+        43098: 9558,
+        43099: 9559,
+        43100: 9560,
+        43101: 9561,
+        43102: 9562,
+        43103: 9563,
+        43104: 9564,
+        43105: 9565,
+        43106: 9566,
+        43107: 9567,
+        43108: 9568,
+        43109: 9569,
+        43110: 9570,
+        43111: 9571,
+        43112: 9572,
+        43113: 9573,
+        43114: 9574,
+        43115: 9575,
+        43116: 9576,
+        43117: 9577,
+        43118: 9578,
+        43119: 9579,
+        43120: 9580,
+        43121: 9581,
+        43122: 9582,
+        43123: 9583,
+        43124: 9584,
+        43125: 9585,
+        43126: 9586,
+        43127: 9587,
+        43128: 9601,
+        43129: 9602,
+        43130: 9603,
+        43131: 9604,
+        43132: 9605,
+        43133: 9606,
+        43134: 9607,
+        43136: 9608,
+        43137: 9609,
+        43138: 9610,
+        43139: 9611,
+        43140: 9612,
+        43141: 9613,
+        43142: 9614,
+        43143: 9615,
+        43144: 9619,
+        43145: 9620,
+        43146: 9621,
+        43147: 9660,
+        43148: 9661,
+        43149: 9698,
+        43150: 9699,
+        43151: 9700,
+        43152: 9701,
+        43153: 9737,
+        43154: 8853,
+        43155: 12306,
+        43156: 12317,
+        43157: 12318,
+        43158: 59324,
+        43159: 59325,
+        43160: 59326,
+        43161: 59327,
+        43162: 59328,
+        43163: 59329,
+        43164: 59330,
+        43165: 59331,
+        43166: 59332,
+        43167: 59333,
+        43168: 59334,
+        43169: 257,
+        43170: 225,
+        43171: 462,
+        43172: 224,
+        43173: 275,
+        43174: 233,
+        43175: 283,
+        43176: 232,
+        43177: 299,
+        43178: 237,
+        43179: 464,
+        43180: 236,
+        43181: 333,
+        43182: 243,
+        43183: 466,
+        43184: 242,
+        43185: 363,
+        43186: 250,
+        43187: 468,
+        43188: 249,
+        43189: 470,
+        43190: 472,
+        43191: 474,
+        43192: 476,
+        43193: 252,
+        43194: 234,
+        43195: 593,
+        43196: 59335,
+        43197: 324,
+        43198: 328,
+        43199: 505,
+        43200: 609,
+        43201: 59337,
+        43202: 59338,
+        43203: 59339,
+        43204: 59340,
+        43205: 12549,
+        43206: 12550,
+        43207: 12551,
+        43208: 12552,
+        43209: 12553,
+        43210: 12554,
+        43211: 12555,
+        43212: 12556,
+        43213: 12557,
+        43214: 12558,
+        43215: 12559,
+        43216: 12560,
+        43217: 12561,
+        43218: 12562,
+        43219: 12563,
+        43220: 12564,
+        43221: 12565,
+        43222: 12566,
+        43223: 12567,
+        43224: 12568,
+        43225: 12569,
+        43226: 12570,
+        43227: 12571,
+        43228: 12572,
+        43229: 12573,
+        43230: 12574,
+        43231: 12575,
+        43232: 12576,
+        43233: 12577,
+        43234: 12578,
+        43235: 12579,
+        43236: 12580,
+        43237: 12581,
+        43238: 12582,
+        43239: 12583,
+        43240: 12584,
+        43241: 12585,
+        43242: 59341,
+        43243: 59342,
+        43244: 59343,
+        43245: 59344,
+        43246: 59345,
+        43247: 59346,
+        43248: 59347,
+        43249: 59348,
+        43250: 59349,
+        43251: 59350,
+        43252: 59351,
+        43253: 59352,
+        43254: 59353,
+        43255: 59354,
+        43256: 59355,
+        43257: 59356,
+        43258: 59357,
+        43259: 59358,
+        43260: 59359,
+        43261: 59360,
+        43262: 59361,
+        43328: 12321,
+        43329: 12322,
+        43330: 12323,
+        43331: 12324,
+        43332: 12325,
+        43333: 12326,
+        43334: 12327,
+        43335: 12328,
+        43336: 12329,
+        43337: 12963,
+        43338: 13198,
+        43339: 13199,
+        43340: 13212,
+        43341: 13213,
+        43342: 13214,
+        43343: 13217,
+        43344: 13252,
+        43345: 13262,
+        43346: 13265,
+        43347: 13266,
+        43348: 13269,
+        43349: 65072,
+        43350: 65506,
+        43351: 65508,
+        43352: 59362,
+        43353: 8481,
+        43354: 12849,
+        43355: 59363,
+        43356: 8208,
+        43357: 59364,
+        43358: 59365,
+        43359: 59366,
+        43360: 12540,
+        43361: 12443,
+        43362: 12444,
+        43363: 12541,
+        43364: 12542,
+        43365: 12294,
+        43366: 12445,
+        43367: 12446,
+        43368: 65097,
+        43369: 65098,
+        43370: 65099,
+        43371: 65100,
+        43372: 65101,
+        43373: 65102,
+        43374: 65103,
+        43375: 65104,
+        43376: 65105,
+        43377: 65106,
+        43378: 65108,
+        43379: 65109,
+        43380: 65110,
+        43381: 65111,
+        43382: 65113,
+        43383: 65114,
+        43384: 65115,
+        43385: 65116,
+        43386: 65117,
+        43387: 65118,
+        43388: 65119,
+        43389: 65120,
+        43390: 65121,
+        43392: 65122,
+        43393: 65123,
+        43394: 65124,
+        43395: 65125,
+        43396: 65126,
+        43397: 65128,
+        43398: 65129,
+        43399: 65130,
+        43400: 65131,
+        43401: 12350,
+        43402: 12272,
+        43403: 12273,
+        43404: 12274,
+        43405: 12275,
+        43406: 12276,
+        43407: 12277,
+        43408: 12278,
+        43409: 12279,
+        43410: 12280,
+        43411: 12281,
+        43412: 12282,
+        43413: 12283,
+        43414: 12295,
+        43415: 59380,
+        43416: 59381,
+        43417: 59382,
+        43418: 59383,
+        43419: 59384,
+        43420: 59385,
+        43421: 59386,
+        43422: 59387,
+        43423: 59388,
+        43424: 59389,
+        43425: 59390,
+        43426: 59391,
+        43427: 59392,
+        43428: 9472,
+        43429: 9473,
+        43430: 9474,
+        43431: 9475,
+        43432: 9476,
+        43433: 9477,
+        43434: 9478,
+        43435: 9479,
+        43436: 9480,
+        43437: 9481,
+        43438: 9482,
+        43439: 9483,
+        43440: 9484,
+        43441: 9485,
+        43442: 9486,
+        43443: 9487,
+        43444: 9488,
+        43445: 9489,
+        43446: 9490,
+        43447: 9491,
+        43448: 9492,
+        43449: 9493,
+        43450: 9494,
+        43451: 9495,
+        43452: 9496,
+        43453: 9497,
+        43454: 9498,
+        43455: 9499,
+        43456: 9500,
+        43457: 9501,
+        43458: 9502,
+        43459: 9503,
+        43460: 9504,
+        43461: 9505,
+        43462: 9506,
+        43463: 9507,
+        43464: 9508,
+        43465: 9509,
+        43466: 9510,
+        43467: 9511,
+        43468: 9512,
+        43469: 9513,
+        43470: 9514,
+        43471: 9515,
+        43472: 9516,
+        43473: 9517,
+        43474: 9518,
+        43475: 9519,
+        43476: 9520,
+        43477: 9521,
+        43478: 9522,
+        43479: 9523,
+        43480: 9524,
+        43481: 9525,
+        43482: 9526,
+        43483: 9527,
+        43484: 9528,
+        43485: 9529,
+        43486: 9530,
+        43487: 9531,
+        43488: 9532,
+        43489: 9533,
+        43490: 9534,
+        43491: 9535,
+        43492: 9536,
+        43493: 9537,
+        43494: 9538,
+        43495: 9539,
+        43496: 9540,
+        43497: 9541,
+        43498: 9542,
+        43499: 9543,
+        43500: 9544,
+        43501: 9545,
+        43502: 9546,
+        43503: 9547,
+        43504: 59393,
+        43505: 59394,
+        43506: 59395,
+        43507: 59396,
+        43508: 59397,
+        43509: 59398,
+        43510: 59399,
+        43511: 59400,
+        43512: 59401,
+        43513: 59402,
+        43514: 59403,
+        43515: 59404,
+        43516: 59405,
+        43517: 59406,
+        43518: 59407,
+        43584: 29404,
+        43585: 29405,
+        43586: 29407,
+        43587: 29410,
+        43588: 29411,
+        43589: 29412,
+        43590: 29413,
+        43591: 29414,
+        43592: 29415,
+        43593: 29418,
+        43594: 29419,
+        43595: 29429,
+        43596: 29430,
+        43597: 29433,
+        43598: 29437,
+        43599: 29438,
+        43600: 29439,
+        43601: 29440,
+        43602: 29442,
+        43603: 29444,
+        43604: 29445,
+        43605: 29446,
+        43606: 29447,
+        43607: 29448,
+        43608: 29449,
+        43609: 29451,
+        43610: 29452,
+        43611: 29453,
+        43612: 29455,
+        43613: 29456,
+        43614: 29457,
+        43615: 29458,
+        43616: 29460,
+        43617: 29464,
+        43618: 29465,
+        43619: 29466,
+        43620: 29471,
+        43621: 29472,
+        43622: 29475,
+        43623: 29476,
+        43624: 29478,
+        43625: 29479,
+        43626: 29480,
+        43627: 29485,
+        43628: 29487,
+        43629: 29488,
+        43630: 29490,
+        43631: 29491,
+        43632: 29493,
+        43633: 29494,
+        43634: 29498,
+        43635: 29499,
+        43636: 29500,
+        43637: 29501,
+        43638: 29504,
+        43639: 29505,
+        43640: 29506,
+        43641: 29507,
+        43642: 29508,
+        43643: 29509,
+        43644: 29510,
+        43645: 29511,
+        43646: 29512,
+        43648: 29513,
+        43649: 29514,
+        43650: 29515,
+        43651: 29516,
+        43652: 29518,
+        43653: 29519,
+        43654: 29521,
+        43655: 29523,
+        43656: 29524,
+        43657: 29525,
+        43658: 29526,
+        43659: 29528,
+        43660: 29529,
+        43661: 29530,
+        43662: 29531,
+        43663: 29532,
+        43664: 29533,
+        43665: 29534,
+        43666: 29535,
+        43667: 29537,
+        43668: 29538,
+        43669: 29539,
+        43670: 29540,
+        43671: 29541,
+        43672: 29542,
+        43673: 29543,
+        43674: 29544,
+        43675: 29545,
+        43676: 29546,
+        43677: 29547,
+        43678: 29550,
+        43679: 29552,
+        43680: 29553,
+        43681: 57344,
+        43682: 57345,
+        43683: 57346,
+        43684: 57347,
+        43685: 57348,
+        43686: 57349,
+        43687: 57350,
+        43688: 57351,
+        43689: 57352,
+        43690: 57353,
+        43691: 57354,
+        43692: 57355,
+        43693: 57356,
+        43694: 57357,
+        43695: 57358,
+        43696: 57359,
+        43697: 57360,
+        43698: 57361,
+        43699: 57362,
+        43700: 57363,
+        43701: 57364,
+        43702: 57365,
+        43703: 57366,
+        43704: 57367,
+        43705: 57368,
+        43706: 57369,
+        43707: 57370,
+        43708: 57371,
+        43709: 57372,
+        43710: 57373,
+        43711: 57374,
+        43712: 57375,
+        43713: 57376,
+        43714: 57377,
+        43715: 57378,
+        43716: 57379,
+        43717: 57380,
+        43718: 57381,
+        43719: 57382,
+        43720: 57383,
+        43721: 57384,
+        43722: 57385,
+        43723: 57386,
+        43724: 57387,
+        43725: 57388,
+        43726: 57389,
+        43727: 57390,
+        43728: 57391,
+        43729: 57392,
+        43730: 57393,
+        43731: 57394,
+        43732: 57395,
+        43733: 57396,
+        43734: 57397,
+        43735: 57398,
+        43736: 57399,
+        43737: 57400,
+        43738: 57401,
+        43739: 57402,
+        43740: 57403,
+        43741: 57404,
+        43742: 57405,
+        43743: 57406,
+        43744: 57407,
+        43745: 57408,
+        43746: 57409,
+        43747: 57410,
+        43748: 57411,
+        43749: 57412,
+        43750: 57413,
+        43751: 57414,
+        43752: 57415,
+        43753: 57416,
+        43754: 57417,
+        43755: 57418,
+        43756: 57419,
+        43757: 57420,
+        43758: 57421,
+        43759: 57422,
+        43760: 57423,
+        43761: 57424,
+        43762: 57425,
+        43763: 57426,
+        43764: 57427,
+        43765: 57428,
+        43766: 57429,
+        43767: 57430,
+        43768: 57431,
+        43769: 57432,
+        43770: 57433,
+        43771: 57434,
+        43772: 57435,
+        43773: 57436,
+        43774: 57437,
+        43840: 29554,
+        43841: 29555,
+        43842: 29556,
+        43843: 29557,
+        43844: 29558,
+        43845: 29559,
+        43846: 29560,
+        43847: 29561,
+        43848: 29562,
+        43849: 29563,
+        43850: 29564,
+        43851: 29565,
+        43852: 29567,
+        43853: 29568,
+        43854: 29569,
+        43855: 29570,
+        43856: 29571,
+        43857: 29573,
+        43858: 29574,
+        43859: 29576,
+        43860: 29578,
+        43861: 29580,
+        43862: 29581,
+        43863: 29583,
+        43864: 29584,
+        43865: 29586,
+        43866: 29587,
+        43867: 29588,
+        43868: 29589,
+        43869: 29591,
+        43870: 29592,
+        43871: 29593,
+        43872: 29594,
+        43873: 29596,
+        43874: 29597,
+        43875: 29598,
+        43876: 29600,
+        43877: 29601,
+        43878: 29603,
+        43879: 29604,
+        43880: 29605,
+        43881: 29606,
+        43882: 29607,
+        43883: 29608,
+        43884: 29610,
+        43885: 29612,
+        43886: 29613,
+        43887: 29617,
+        43888: 29620,
+        43889: 29621,
+        43890: 29622,
+        43891: 29624,
+        43892: 29625,
+        43893: 29628,
+        43894: 29629,
+        43895: 29630,
+        43896: 29631,
+        43897: 29633,
+        43898: 29635,
+        43899: 29636,
+        43900: 29637,
+        43901: 29638,
+        43902: 29639,
+        43904: 29643,
+        43905: 29644,
+        43906: 29646,
+        43907: 29650,
+        43908: 29651,
+        43909: 29652,
+        43910: 29653,
+        43911: 29654,
+        43912: 29655,
+        43913: 29656,
+        43914: 29658,
+        43915: 29659,
+        43916: 29660,
+        43917: 29661,
+        43918: 29663,
+        43919: 29665,
+        43920: 29666,
+        43921: 29667,
+        43922: 29668,
+        43923: 29670,
+        43924: 29672,
+        43925: 29674,
+        43926: 29675,
+        43927: 29676,
+        43928: 29678,
+        43929: 29679,
+        43930: 29680,
+        43931: 29681,
+        43932: 29683,
+        43933: 29684,
+        43934: 29685,
+        43935: 29686,
+        43936: 29687,
+        43937: 57438,
+        43938: 57439,
+        43939: 57440,
+        43940: 57441,
+        43941: 57442,
+        43942: 57443,
+        43943: 57444,
+        43944: 57445,
+        43945: 57446,
+        43946: 57447,
+        43947: 57448,
+        43948: 57449,
+        43949: 57450,
+        43950: 57451,
+        43951: 57452,
+        43952: 57453,
+        43953: 57454,
+        43954: 57455,
+        43955: 57456,
+        43956: 57457,
+        43957: 57458,
+        43958: 57459,
+        43959: 57460,
+        43960: 57461,
+        43961: 57462,
+        43962: 57463,
+        43963: 57464,
+        43964: 57465,
+        43965: 57466,
+        43966: 57467,
+        43967: 57468,
+        43968: 57469,
+        43969: 57470,
+        43970: 57471,
+        43971: 57472,
+        43972: 57473,
+        43973: 57474,
+        43974: 57475,
+        43975: 57476,
+        43976: 57477,
+        43977: 57478,
+        43978: 57479,
+        43979: 57480,
+        43980: 57481,
+        43981: 57482,
+        43982: 57483,
+        43983: 57484,
+        43984: 57485,
+        43985: 57486,
+        43986: 57487,
+        43987: 57488,
+        43988: 57489,
+        43989: 57490,
+        43990: 57491,
+        43991: 57492,
+        43992: 57493,
+        43993: 57494,
+        43994: 57495,
+        43995: 57496,
+        43996: 57497,
+        43997: 57498,
+        43998: 57499,
+        43999: 57500,
+        44000: 57501,
+        44001: 57502,
+        44002: 57503,
+        44003: 57504,
+        44004: 57505,
+        44005: 57506,
+        44006: 57507,
+        44007: 57508,
+        44008: 57509,
+        44009: 57510,
+        44010: 57511,
+        44011: 57512,
+        44012: 57513,
+        44013: 57514,
+        44014: 57515,
+        44015: 57516,
+        44016: 57517,
+        44017: 57518,
+        44018: 57519,
+        44019: 57520,
+        44020: 57521,
+        44021: 57522,
+        44022: 57523,
+        44023: 57524,
+        44024: 57525,
+        44025: 57526,
+        44026: 57527,
+        44027: 57528,
+        44028: 57529,
+        44029: 57530,
+        44030: 57531,
+        44096: 29688,
+        44097: 29689,
+        44098: 29690,
+        44099: 29691,
+        44100: 29692,
+        44101: 29693,
+        44102: 29694,
+        44103: 29695,
+        44104: 29696,
+        44105: 29697,
+        44106: 29698,
+        44107: 29700,
+        44108: 29703,
+        44109: 29704,
+        44110: 29707,
+        44111: 29708,
+        44112: 29709,
+        44113: 29710,
+        44114: 29713,
+        44115: 29714,
+        44116: 29715,
+        44117: 29716,
+        44118: 29717,
+        44119: 29718,
+        44120: 29719,
+        44121: 29720,
+        44122: 29721,
+        44123: 29724,
+        44124: 29725,
+        44125: 29726,
+        44126: 29727,
+        44127: 29728,
+        44128: 29729,
+        44129: 29731,
+        44130: 29732,
+        44131: 29735,
+        44132: 29737,
+        44133: 29739,
+        44134: 29741,
+        44135: 29743,
+        44136: 29745,
+        44137: 29746,
+        44138: 29751,
+        44139: 29752,
+        44140: 29753,
+        44141: 29754,
+        44142: 29755,
+        44143: 29757,
+        44144: 29758,
+        44145: 29759,
+        44146: 29760,
+        44147: 29762,
+        44148: 29763,
+        44149: 29764,
+        44150: 29765,
+        44151: 29766,
+        44152: 29767,
+        44153: 29768,
+        44154: 29769,
+        44155: 29770,
+        44156: 29771,
+        44157: 29772,
+        44158: 29773,
+        44160: 29774,
+        44161: 29775,
+        44162: 29776,
+        44163: 29777,
+        44164: 29778,
+        44165: 29779,
+        44166: 29780,
+        44167: 29782,
+        44168: 29784,
+        44169: 29789,
+        44170: 29792,
+        44171: 29793,
+        44172: 29794,
+        44173: 29795,
+        44174: 29796,
+        44175: 29797,
+        44176: 29798,
+        44177: 29799,
+        44178: 29800,
+        44179: 29801,
+        44180: 29802,
+        44181: 29803,
+        44182: 29804,
+        44183: 29806,
+        44184: 29807,
+        44185: 29809,
+        44186: 29810,
+        44187: 29811,
+        44188: 29812,
+        44189: 29813,
+        44190: 29816,
+        44191: 29817,
+        44192: 29818,
+        44193: 57532,
+        44194: 57533,
+        44195: 57534,
+        44196: 57535,
+        44197: 57536,
+        44198: 57537,
+        44199: 57538,
+        44200: 57539,
+        44201: 57540,
+        44202: 57541,
+        44203: 57542,
+        44204: 57543,
+        44205: 57544,
+        44206: 57545,
+        44207: 57546,
+        44208: 57547,
+        44209: 57548,
+        44210: 57549,
+        44211: 57550,
+        44212: 57551,
+        44213: 57552,
+        44214: 57553,
+        44215: 57554,
+        44216: 57555,
+        44217: 57556,
+        44218: 57557,
+        44219: 57558,
+        44220: 57559,
+        44221: 57560,
+        44222: 57561,
+        44223: 57562,
+        44224: 57563,
+        44225: 57564,
+        44226: 57565,
+        44227: 57566,
+        44228: 57567,
+        44229: 57568,
+        44230: 57569,
+        44231: 57570,
+        44232: 57571,
+        44233: 57572,
+        44234: 57573,
+        44235: 57574,
+        44236: 57575,
+        44237: 57576,
+        44238: 57577,
+        44239: 57578,
+        44240: 57579,
+        44241: 57580,
+        44242: 57581,
+        44243: 57582,
+        44244: 57583,
+        44245: 57584,
+        44246: 57585,
+        44247: 57586,
+        44248: 57587,
+        44249: 57588,
+        44250: 57589,
+        44251: 57590,
+        44252: 57591,
+        44253: 57592,
+        44254: 57593,
+        44255: 57594,
+        44256: 57595,
+        44257: 57596,
+        44258: 57597,
+        44259: 57598,
+        44260: 57599,
+        44261: 57600,
+        44262: 57601,
+        44263: 57602,
+        44264: 57603,
+        44265: 57604,
+        44266: 57605,
+        44267: 57606,
+        44268: 57607,
+        44269: 57608,
+        44270: 57609,
+        44271: 57610,
+        44272: 57611,
+        44273: 57612,
+        44274: 57613,
+        44275: 57614,
+        44276: 57615,
+        44277: 57616,
+        44278: 57617,
+        44279: 57618,
+        44280: 57619,
+        44281: 57620,
+        44282: 57621,
+        44283: 57622,
+        44284: 57623,
+        44285: 57624,
+        44286: 57625,
+        44352: 29819,
+        44353: 29820,
+        44354: 29821,
+        44355: 29823,
+        44356: 29826,
+        44357: 29828,
+        44358: 29829,
+        44359: 29830,
+        44360: 29832,
+        44361: 29833,
+        44362: 29834,
+        44363: 29836,
+        44364: 29837,
+        44365: 29839,
+        44366: 29841,
+        44367: 29842,
+        44368: 29843,
+        44369: 29844,
+        44370: 29845,
+        44371: 29846,
+        44372: 29847,
+        44373: 29848,
+        44374: 29849,
+        44375: 29850,
+        44376: 29851,
+        44377: 29853,
+        44378: 29855,
+        44379: 29856,
+        44380: 29857,
+        44381: 29858,
+        44382: 29859,
+        44383: 29860,
+        44384: 29861,
+        44385: 29862,
+        44386: 29866,
+        44387: 29867,
+        44388: 29868,
+        44389: 29869,
+        44390: 29870,
+        44391: 29871,
+        44392: 29872,
+        44393: 29873,
+        44394: 29874,
+        44395: 29875,
+        44396: 29876,
+        44397: 29877,
+        44398: 29878,
+        44399: 29879,
+        44400: 29880,
+        44401: 29881,
+        44402: 29883,
+        44403: 29884,
+        44404: 29885,
+        44405: 29886,
+        44406: 29887,
+        44407: 29888,
+        44408: 29889,
+        44409: 29890,
+        44410: 29891,
+        44411: 29892,
+        44412: 29893,
+        44413: 29894,
+        44414: 29895,
+        44416: 29896,
+        44417: 29897,
+        44418: 29898,
+        44419: 29899,
+        44420: 29900,
+        44421: 29901,
+        44422: 29902,
+        44423: 29903,
+        44424: 29904,
+        44425: 29905,
+        44426: 29907,
+        44427: 29908,
+        44428: 29909,
+        44429: 29910,
+        44430: 29911,
+        44431: 29912,
+        44432: 29913,
+        44433: 29914,
+        44434: 29915,
+        44435: 29917,
+        44436: 29919,
+        44437: 29921,
+        44438: 29925,
+        44439: 29927,
+        44440: 29928,
+        44441: 29929,
+        44442: 29930,
+        44443: 29931,
+        44444: 29932,
+        44445: 29933,
+        44446: 29936,
+        44447: 29937,
+        44448: 29938,
+        44449: 57626,
+        44450: 57627,
+        44451: 57628,
+        44452: 57629,
+        44453: 57630,
+        44454: 57631,
+        44455: 57632,
+        44456: 57633,
+        44457: 57634,
+        44458: 57635,
+        44459: 57636,
+        44460: 57637,
+        44461: 57638,
+        44462: 57639,
+        44463: 57640,
+        44464: 57641,
+        44465: 57642,
+        44466: 57643,
+        44467: 57644,
+        44468: 57645,
+        44469: 57646,
+        44470: 57647,
+        44471: 57648,
+        44472: 57649,
+        44473: 57650,
+        44474: 57651,
+        44475: 57652,
+        44476: 57653,
+        44477: 57654,
+        44478: 57655,
+        44479: 57656,
+        44480: 57657,
+        44481: 57658,
+        44482: 57659,
+        44483: 57660,
+        44484: 57661,
+        44485: 57662,
+        44486: 57663,
+        44487: 57664,
+        44488: 57665,
+        44489: 57666,
+        44490: 57667,
+        44491: 57668,
+        44492: 57669,
+        44493: 57670,
+        44494: 57671,
+        44495: 57672,
+        44496: 57673,
+        44497: 57674,
+        44498: 57675,
+        44499: 57676,
+        44500: 57677,
+        44501: 57678,
+        44502: 57679,
+        44503: 57680,
+        44504: 57681,
+        44505: 57682,
+        44506: 57683,
+        44507: 57684,
+        44508: 57685,
+        44509: 57686,
+        44510: 57687,
+        44511: 57688,
+        44512: 57689,
+        44513: 57690,
+        44514: 57691,
+        44515: 57692,
+        44516: 57693,
+        44517: 57694,
+        44518: 57695,
+        44519: 57696,
+        44520: 57697,
+        44521: 57698,
+        44522: 57699,
+        44523: 57700,
+        44524: 57701,
+        44525: 57702,
+        44526: 57703,
+        44527: 57704,
+        44528: 57705,
+        44529: 57706,
+        44530: 57707,
+        44531: 57708,
+        44532: 57709,
+        44533: 57710,
+        44534: 57711,
+        44535: 57712,
+        44536: 57713,
+        44537: 57714,
+        44538: 57715,
+        44539: 57716,
+        44540: 57717,
+        44541: 57718,
+        44542: 57719,
+        44608: 29939,
+        44609: 29941,
+        44610: 29944,
+        44611: 29945,
+        44612: 29946,
+        44613: 29947,
+        44614: 29948,
+        44615: 29949,
+        44616: 29950,
+        44617: 29952,
+        44618: 29953,
+        44619: 29954,
+        44620: 29955,
+        44621: 29957,
+        44622: 29958,
+        44623: 29959,
+        44624: 29960,
+        44625: 29961,
+        44626: 29962,
+        44627: 29963,
+        44628: 29964,
+        44629: 29966,
+        44630: 29968,
+        44631: 29970,
+        44632: 29972,
+        44633: 29973,
+        44634: 29974,
+        44635: 29975,
+        44636: 29979,
+        44637: 29981,
+        44638: 29982,
+        44639: 29984,
+        44640: 29985,
+        44641: 29986,
+        44642: 29987,
+        44643: 29988,
+        44644: 29990,
+        44645: 29991,
+        44646: 29994,
+        44647: 29998,
+        44648: 30004,
+        44649: 30006,
+        44650: 30009,
+        44651: 30012,
+        44652: 30013,
+        44653: 30015,
+        44654: 30017,
+        44655: 30018,
+        44656: 30019,
+        44657: 30020,
+        44658: 30022,
+        44659: 30023,
+        44660: 30025,
+        44661: 30026,
+        44662: 30029,
+        44663: 30032,
+        44664: 30033,
+        44665: 30034,
+        44666: 30035,
+        44667: 30037,
+        44668: 30038,
+        44669: 30039,
+        44670: 30040,
+        44672: 30045,
+        44673: 30046,
+        44674: 30047,
+        44675: 30048,
+        44676: 30049,
+        44677: 30050,
+        44678: 30051,
+        44679: 30052,
+        44680: 30055,
+        44681: 30056,
+        44682: 30057,
+        44683: 30059,
+        44684: 30060,
+        44685: 30061,
+        44686: 30062,
+        44687: 30063,
+        44688: 30064,
+        44689: 30065,
+        44690: 30067,
+        44691: 30069,
+        44692: 30070,
+        44693: 30071,
+        44694: 30074,
+        44695: 30075,
+        44696: 30076,
+        44697: 30077,
+        44698: 30078,
+        44699: 30080,
+        44700: 30081,
+        44701: 30082,
+        44702: 30084,
+        44703: 30085,
+        44704: 30087,
+        44705: 57720,
+        44706: 57721,
+        44707: 57722,
+        44708: 57723,
+        44709: 57724,
+        44710: 57725,
+        44711: 57726,
+        44712: 57727,
+        44713: 57728,
+        44714: 57729,
+        44715: 57730,
+        44716: 57731,
+        44717: 57732,
+        44718: 57733,
+        44719: 57734,
+        44720: 57735,
+        44721: 57736,
+        44722: 57737,
+        44723: 57738,
+        44724: 57739,
+        44725: 57740,
+        44726: 57741,
+        44727: 57742,
+        44728: 57743,
+        44729: 57744,
+        44730: 57745,
+        44731: 57746,
+        44732: 57747,
+        44733: 57748,
+        44734: 57749,
+        44735: 57750,
+        44736: 57751,
+        44737: 57752,
+        44738: 57753,
+        44739: 57754,
+        44740: 57755,
+        44741: 57756,
+        44742: 57757,
+        44743: 57758,
+        44744: 57759,
+        44745: 57760,
+        44746: 57761,
+        44747: 57762,
+        44748: 57763,
+        44749: 57764,
+        44750: 57765,
+        44751: 57766,
+        44752: 57767,
+        44753: 57768,
+        44754: 57769,
+        44755: 57770,
+        44756: 57771,
+        44757: 57772,
+        44758: 57773,
+        44759: 57774,
+        44760: 57775,
+        44761: 57776,
+        44762: 57777,
+        44763: 57778,
+        44764: 57779,
+        44765: 57780,
+        44766: 57781,
+        44767: 57782,
+        44768: 57783,
+        44769: 57784,
+        44770: 57785,
+        44771: 57786,
+        44772: 57787,
+        44773: 57788,
+        44774: 57789,
+        44775: 57790,
+        44776: 57791,
+        44777: 57792,
+        44778: 57793,
+        44779: 57794,
+        44780: 57795,
+        44781: 57796,
+        44782: 57797,
+        44783: 57798,
+        44784: 57799,
+        44785: 57800,
+        44786: 57801,
+        44787: 57802,
+        44788: 57803,
+        44789: 57804,
+        44790: 57805,
+        44791: 57806,
+        44792: 57807,
+        44793: 57808,
+        44794: 57809,
+        44795: 57810,
+        44796: 57811,
+        44797: 57812,
+        44798: 57813,
+        44864: 30088,
+        44865: 30089,
+        44866: 30090,
+        44867: 30092,
+        44868: 30093,
+        44869: 30094,
+        44870: 30096,
+        44871: 30099,
+        44872: 30101,
+        44873: 30104,
+        44874: 30107,
+        44875: 30108,
+        44876: 30110,
+        44877: 30114,
+        44878: 30118,
+        44879: 30119,
+        44880: 30120,
+        44881: 30121,
+        44882: 30122,
+        44883: 30125,
+        44884: 30134,
+        44885: 30135,
+        44886: 30138,
+        44887: 30139,
+        44888: 30143,
+        44889: 30144,
+        44890: 30145,
+        44891: 30150,
+        44892: 30155,
+        44893: 30156,
+        44894: 30158,
+        44895: 30159,
+        44896: 30160,
+        44897: 30161,
+        44898: 30163,
+        44899: 30167,
+        44900: 30169,
+        44901: 30170,
+        44902: 30172,
+        44903: 30173,
+        44904: 30175,
+        44905: 30176,
+        44906: 30177,
+        44907: 30181,
+        44908: 30185,
+        44909: 30188,
+        44910: 30189,
+        44911: 30190,
+        44912: 30191,
+        44913: 30194,
+        44914: 30195,
+        44915: 30197,
+        44916: 30198,
+        44917: 30199,
+        44918: 30200,
+        44919: 30202,
+        44920: 30203,
+        44921: 30205,
+        44922: 30206,
+        44923: 30210,
+        44924: 30212,
+        44925: 30214,
+        44926: 30215,
+        44928: 30216,
+        44929: 30217,
+        44930: 30219,
+        44931: 30221,
+        44932: 30222,
+        44933: 30223,
+        44934: 30225,
+        44935: 30226,
+        44936: 30227,
+        44937: 30228,
+        44938: 30230,
+        44939: 30234,
+        44940: 30236,
+        44941: 30237,
+        44942: 30238,
+        44943: 30241,
+        44944: 30243,
+        44945: 30247,
+        44946: 30248,
+        44947: 30252,
+        44948: 30254,
+        44949: 30255,
+        44950: 30257,
+        44951: 30258,
+        44952: 30262,
+        44953: 30263,
+        44954: 30265,
+        44955: 30266,
+        44956: 30267,
+        44957: 30269,
+        44958: 30273,
+        44959: 30274,
+        44960: 30276,
+        44961: 57814,
+        44962: 57815,
+        44963: 57816,
+        44964: 57817,
+        44965: 57818,
+        44966: 57819,
+        44967: 57820,
+        44968: 57821,
+        44969: 57822,
+        44970: 57823,
+        44971: 57824,
+        44972: 57825,
+        44973: 57826,
+        44974: 57827,
+        44975: 57828,
+        44976: 57829,
+        44977: 57830,
+        44978: 57831,
+        44979: 57832,
+        44980: 57833,
+        44981: 57834,
+        44982: 57835,
+        44983: 57836,
+        44984: 57837,
+        44985: 57838,
+        44986: 57839,
+        44987: 57840,
+        44988: 57841,
+        44989: 57842,
+        44990: 57843,
+        44991: 57844,
+        44992: 57845,
+        44993: 57846,
+        44994: 57847,
+        44995: 57848,
+        44996: 57849,
+        44997: 57850,
+        44998: 57851,
+        44999: 57852,
+        45000: 57853,
+        45001: 57854,
+        45002: 57855,
+        45003: 57856,
+        45004: 57857,
+        45005: 57858,
+        45006: 57859,
+        45007: 57860,
+        45008: 57861,
+        45009: 57862,
+        45010: 57863,
+        45011: 57864,
+        45012: 57865,
+        45013: 57866,
+        45014: 57867,
+        45015: 57868,
+        45016: 57869,
+        45017: 57870,
+        45018: 57871,
+        45019: 57872,
+        45020: 57873,
+        45021: 57874,
+        45022: 57875,
+        45023: 57876,
+        45024: 57877,
+        45025: 57878,
+        45026: 57879,
+        45027: 57880,
+        45028: 57881,
+        45029: 57882,
+        45030: 57883,
+        45031: 57884,
+        45032: 57885,
+        45033: 57886,
+        45034: 57887,
+        45035: 57888,
+        45036: 57889,
+        45037: 57890,
+        45038: 57891,
+        45039: 57892,
+        45040: 57893,
+        45041: 57894,
+        45042: 57895,
+        45043: 57896,
+        45044: 57897,
+        45045: 57898,
+        45046: 57899,
+        45047: 57900,
+        45048: 57901,
+        45049: 57902,
+        45050: 57903,
+        45051: 57904,
+        45052: 57905,
+        45053: 57906,
+        45054: 57907,
+        45120: 30277,
+        45121: 30278,
+        45122: 30279,
+        45123: 30280,
+        45124: 30281,
+        45125: 30282,
+        45126: 30283,
+        45127: 30286,
+        45128: 30287,
+        45129: 30288,
+        45130: 30289,
+        45131: 30290,
+        45132: 30291,
+        45133: 30293,
+        45134: 30295,
+        45135: 30296,
+        45136: 30297,
+        45137: 30298,
+        45138: 30299,
+        45139: 30301,
+        45140: 30303,
+        45141: 30304,
+        45142: 30305,
+        45143: 30306,
+        45144: 30308,
+        45145: 30309,
+        45146: 30310,
+        45147: 30311,
+        45148: 30312,
+        45149: 30313,
+        45150: 30314,
+        45151: 30316,
+        45152: 30317,
+        45153: 30318,
+        45154: 30320,
+        45155: 30321,
+        45156: 30322,
+        45157: 30323,
+        45158: 30324,
+        45159: 30325,
+        45160: 30326,
+        45161: 30327,
+        45162: 30329,
+        45163: 30330,
+        45164: 30332,
+        45165: 30335,
+        45166: 30336,
+        45167: 30337,
+        45168: 30339,
+        45169: 30341,
+        45170: 30345,
+        45171: 30346,
+        45172: 30348,
+        45173: 30349,
+        45174: 30351,
+        45175: 30352,
+        45176: 30354,
+        45177: 30356,
+        45178: 30357,
+        45179: 30359,
+        45180: 30360,
+        45181: 30362,
+        45182: 30363,
+        45184: 30364,
+        45185: 30365,
+        45186: 30366,
+        45187: 30367,
+        45188: 30368,
+        45189: 30369,
+        45190: 30370,
+        45191: 30371,
+        45192: 30373,
+        45193: 30374,
+        45194: 30375,
+        45195: 30376,
+        45196: 30377,
+        45197: 30378,
+        45198: 30379,
+        45199: 30380,
+        45200: 30381,
+        45201: 30383,
+        45202: 30384,
+        45203: 30387,
+        45204: 30389,
+        45205: 30390,
+        45206: 30391,
+        45207: 30392,
+        45208: 30393,
+        45209: 30394,
+        45210: 30395,
+        45211: 30396,
+        45212: 30397,
+        45213: 30398,
+        45214: 30400,
+        45215: 30401,
+        45216: 30403,
+        45217: 21834,
+        45218: 38463,
+        45219: 22467,
+        45220: 25384,
+        45221: 21710,
+        45222: 21769,
+        45223: 21696,
+        45224: 30353,
+        45225: 30284,
+        45226: 34108,
+        45227: 30702,
+        45228: 33406,
+        45229: 30861,
+        45230: 29233,
+        45231: 38552,
+        45232: 38797,
+        45233: 27688,
+        45234: 23433,
+        45235: 20474,
+        45236: 25353,
+        45237: 26263,
+        45238: 23736,
+        45239: 33018,
+        45240: 26696,
+        45241: 32942,
+        45242: 26114,
+        45243: 30414,
+        45244: 20985,
+        45245: 25942,
+        45246: 29100,
+        45247: 32753,
+        45248: 34948,
+        45249: 20658,
+        45250: 22885,
+        45251: 25034,
+        45252: 28595,
+        45253: 33453,
+        45254: 25420,
+        45255: 25170,
+        45256: 21485,
+        45257: 21543,
+        45258: 31494,
+        45259: 20843,
+        45260: 30116,
+        45261: 24052,
+        45262: 25300,
+        45263: 36299,
+        45264: 38774,
+        45265: 25226,
+        45266: 32793,
+        45267: 22365,
+        45268: 38712,
+        45269: 32610,
+        45270: 29240,
+        45271: 30333,
+        45272: 26575,
+        45273: 30334,
+        45274: 25670,
+        45275: 20336,
+        45276: 36133,
+        45277: 25308,
+        45278: 31255,
+        45279: 26001,
+        45280: 29677,
+        45281: 25644,
+        45282: 25203,
+        45283: 33324,
+        45284: 39041,
+        45285: 26495,
+        45286: 29256,
+        45287: 25198,
+        45288: 25292,
+        45289: 20276,
+        45290: 29923,
+        45291: 21322,
+        45292: 21150,
+        45293: 32458,
+        45294: 37030,
+        45295: 24110,
+        45296: 26758,
+        45297: 27036,
+        45298: 33152,
+        45299: 32465,
+        45300: 26834,
+        45301: 30917,
+        45302: 34444,
+        45303: 38225,
+        45304: 20621,
+        45305: 35876,
+        45306: 33502,
+        45307: 32990,
+        45308: 21253,
+        45309: 35090,
+        45310: 21093,
+        45376: 30404,
+        45377: 30407,
+        45378: 30409,
+        45379: 30411,
+        45380: 30412,
+        45381: 30419,
+        45382: 30421,
+        45383: 30425,
+        45384: 30426,
+        45385: 30428,
+        45386: 30429,
+        45387: 30430,
+        45388: 30432,
+        45389: 30433,
+        45390: 30434,
+        45391: 30435,
+        45392: 30436,
+        45393: 30438,
+        45394: 30439,
+        45395: 30440,
+        45396: 30441,
+        45397: 30442,
+        45398: 30443,
+        45399: 30444,
+        45400: 30445,
+        45401: 30448,
+        45402: 30451,
+        45403: 30453,
+        45404: 30454,
+        45405: 30455,
+        45406: 30458,
+        45407: 30459,
+        45408: 30461,
+        45409: 30463,
+        45410: 30464,
+        45411: 30466,
+        45412: 30467,
+        45413: 30469,
+        45414: 30470,
+        45415: 30474,
+        45416: 30476,
+        45417: 30478,
+        45418: 30479,
+        45419: 30480,
+        45420: 30481,
+        45421: 30482,
+        45422: 30483,
+        45423: 30484,
+        45424: 30485,
+        45425: 30486,
+        45426: 30487,
+        45427: 30488,
+        45428: 30491,
+        45429: 30492,
+        45430: 30493,
+        45431: 30494,
+        45432: 30497,
+        45433: 30499,
+        45434: 30500,
+        45435: 30501,
+        45436: 30503,
+        45437: 30506,
+        45438: 30507,
+        45440: 30508,
+        45441: 30510,
+        45442: 30512,
+        45443: 30513,
+        45444: 30514,
+        45445: 30515,
+        45446: 30516,
+        45447: 30521,
+        45448: 30523,
+        45449: 30525,
+        45450: 30526,
+        45451: 30527,
+        45452: 30530,
+        45453: 30532,
+        45454: 30533,
+        45455: 30534,
+        45456: 30536,
+        45457: 30537,
+        45458: 30538,
+        45459: 30539,
+        45460: 30540,
+        45461: 30541,
+        45462: 30542,
+        45463: 30543,
+        45464: 30546,
+        45465: 30547,
+        45466: 30548,
+        45467: 30549,
+        45468: 30550,
+        45469: 30551,
+        45470: 30552,
+        45471: 30553,
+        45472: 30556,
+        45473: 34180,
+        45474: 38649,
+        45475: 20445,
+        45476: 22561,
+        45477: 39281,
+        45478: 23453,
+        45479: 25265,
+        45480: 25253,
+        45481: 26292,
+        45482: 35961,
+        45483: 40077,
+        45484: 29190,
+        45485: 26479,
+        45486: 30865,
+        45487: 24754,
+        45488: 21329,
+        45489: 21271,
+        45490: 36744,
+        45491: 32972,
+        45492: 36125,
+        45493: 38049,
+        45494: 20493,
+        45495: 29384,
+        45496: 22791,
+        45497: 24811,
+        45498: 28953,
+        45499: 34987,
+        45500: 22868,
+        45501: 33519,
+        45502: 26412,
+        45503: 31528,
+        45504: 23849,
+        45505: 32503,
+        45506: 29997,
+        45507: 27893,
+        45508: 36454,
+        45509: 36856,
+        45510: 36924,
+        45511: 40763,
+        45512: 27604,
+        45513: 37145,
+        45514: 31508,
+        45515: 24444,
+        45516: 30887,
+        45517: 34006,
+        45518: 34109,
+        45519: 27605,
+        45520: 27609,
+        45521: 27606,
+        45522: 24065,
+        45523: 24199,
+        45524: 30201,
+        45525: 38381,
+        45526: 25949,
+        45527: 24330,
+        45528: 24517,
+        45529: 36767,
+        45530: 22721,
+        45531: 33218,
+        45532: 36991,
+        45533: 38491,
+        45534: 38829,
+        45535: 36793,
+        45536: 32534,
+        45537: 36140,
+        45538: 25153,
+        45539: 20415,
+        45540: 21464,
+        45541: 21342,
+        45542: 36776,
+        45543: 36777,
+        45544: 36779,
+        45545: 36941,
+        45546: 26631,
+        45547: 24426,
+        45548: 33176,
+        45549: 34920,
+        45550: 40150,
+        45551: 24971,
+        45552: 21035,
+        45553: 30250,
+        45554: 24428,
+        45555: 25996,
+        45556: 28626,
+        45557: 28392,
+        45558: 23486,
+        45559: 25672,
+        45560: 20853,
+        45561: 20912,
+        45562: 26564,
+        45563: 19993,
+        45564: 31177,
+        45565: 39292,
+        45566: 28851,
+        45632: 30557,
+        45633: 30558,
+        45634: 30559,
+        45635: 30560,
+        45636: 30564,
+        45637: 30567,
+        45638: 30569,
+        45639: 30570,
+        45640: 30573,
+        45641: 30574,
+        45642: 30575,
+        45643: 30576,
+        45644: 30577,
+        45645: 30578,
+        45646: 30579,
+        45647: 30580,
+        45648: 30581,
+        45649: 30582,
+        45650: 30583,
+        45651: 30584,
+        45652: 30586,
+        45653: 30587,
+        45654: 30588,
+        45655: 30593,
+        45656: 30594,
+        45657: 30595,
+        45658: 30598,
+        45659: 30599,
+        45660: 30600,
+        45661: 30601,
+        45662: 30602,
+        45663: 30603,
+        45664: 30607,
+        45665: 30608,
+        45666: 30611,
+        45667: 30612,
+        45668: 30613,
+        45669: 30614,
+        45670: 30615,
+        45671: 30616,
+        45672: 30617,
+        45673: 30618,
+        45674: 30619,
+        45675: 30620,
+        45676: 30621,
+        45677: 30622,
+        45678: 30625,
+        45679: 30627,
+        45680: 30628,
+        45681: 30630,
+        45682: 30632,
+        45683: 30635,
+        45684: 30637,
+        45685: 30638,
+        45686: 30639,
+        45687: 30641,
+        45688: 30642,
+        45689: 30644,
+        45690: 30646,
+        45691: 30647,
+        45692: 30648,
+        45693: 30649,
+        45694: 30650,
+        45696: 30652,
+        45697: 30654,
+        45698: 30656,
+        45699: 30657,
+        45700: 30658,
+        45701: 30659,
+        45702: 30660,
+        45703: 30661,
+        45704: 30662,
+        45705: 30663,
+        45706: 30664,
+        45707: 30665,
+        45708: 30666,
+        45709: 30667,
+        45710: 30668,
+        45711: 30670,
+        45712: 30671,
+        45713: 30672,
+        45714: 30673,
+        45715: 30674,
+        45716: 30675,
+        45717: 30676,
+        45718: 30677,
+        45719: 30678,
+        45720: 30680,
+        45721: 30681,
+        45722: 30682,
+        45723: 30685,
+        45724: 30686,
+        45725: 30687,
+        45726: 30688,
+        45727: 30689,
+        45728: 30692,
+        45729: 30149,
+        45730: 24182,
+        45731: 29627,
+        45732: 33760,
+        45733: 25773,
+        45734: 25320,
+        45735: 38069,
+        45736: 27874,
+        45737: 21338,
+        45738: 21187,
+        45739: 25615,
+        45740: 38082,
+        45741: 31636,
+        45742: 20271,
+        45743: 24091,
+        45744: 33334,
+        45745: 33046,
+        45746: 33162,
+        45747: 28196,
+        45748: 27850,
+        45749: 39539,
+        45750: 25429,
+        45751: 21340,
+        45752: 21754,
+        45753: 34917,
+        45754: 22496,
+        45755: 19981,
+        45756: 24067,
+        45757: 27493,
+        45758: 31807,
+        45759: 37096,
+        45760: 24598,
+        45761: 25830,
+        45762: 29468,
+        45763: 35009,
+        45764: 26448,
+        45765: 25165,
+        45766: 36130,
+        45767: 30572,
+        45768: 36393,
+        45769: 37319,
+        45770: 24425,
+        45771: 33756,
+        45772: 34081,
+        45773: 39184,
+        45774: 21442,
+        45775: 34453,
+        45776: 27531,
+        45777: 24813,
+        45778: 24808,
+        45779: 28799,
+        45780: 33485,
+        45781: 33329,
+        45782: 20179,
+        45783: 27815,
+        45784: 34255,
+        45785: 25805,
+        45786: 31961,
+        45787: 27133,
+        45788: 26361,
+        45789: 33609,
+        45790: 21397,
+        45791: 31574,
+        45792: 20391,
+        45793: 20876,
+        45794: 27979,
+        45795: 23618,
+        45796: 36461,
+        45797: 25554,
+        45798: 21449,
+        45799: 33580,
+        45800: 33590,
+        45801: 26597,
+        45802: 30900,
+        45803: 25661,
+        45804: 23519,
+        45805: 23700,
+        45806: 24046,
+        45807: 35815,
+        45808: 25286,
+        45809: 26612,
+        45810: 35962,
+        45811: 25600,
+        45812: 25530,
+        45813: 34633,
+        45814: 39307,
+        45815: 35863,
+        45816: 32544,
+        45817: 38130,
+        45818: 20135,
+        45819: 38416,
+        45820: 39076,
+        45821: 26124,
+        45822: 29462,
+        45888: 30694,
+        45889: 30696,
+        45890: 30698,
+        45891: 30703,
+        45892: 30704,
+        45893: 30705,
+        45894: 30706,
+        45895: 30708,
+        45896: 30709,
+        45897: 30711,
+        45898: 30713,
+        45899: 30714,
+        45900: 30715,
+        45901: 30716,
+        45902: 30723,
+        45903: 30724,
+        45904: 30725,
+        45905: 30726,
+        45906: 30727,
+        45907: 30728,
+        45908: 30730,
+        45909: 30731,
+        45910: 30734,
+        45911: 30735,
+        45912: 30736,
+        45913: 30739,
+        45914: 30741,
+        45915: 30745,
+        45916: 30747,
+        45917: 30750,
+        45918: 30752,
+        45919: 30753,
+        45920: 30754,
+        45921: 30756,
+        45922: 30760,
+        45923: 30762,
+        45924: 30763,
+        45925: 30766,
+        45926: 30767,
+        45927: 30769,
+        45928: 30770,
+        45929: 30771,
+        45930: 30773,
+        45931: 30774,
+        45932: 30781,
+        45933: 30783,
+        45934: 30785,
+        45935: 30786,
+        45936: 30787,
+        45937: 30788,
+        45938: 30790,
+        45939: 30792,
+        45940: 30793,
+        45941: 30794,
+        45942: 30795,
+        45943: 30797,
+        45944: 30799,
+        45945: 30801,
+        45946: 30803,
+        45947: 30804,
+        45948: 30808,
+        45949: 30809,
+        45950: 30810,
+        45952: 30811,
+        45953: 30812,
+        45954: 30814,
+        45955: 30815,
+        45956: 30816,
+        45957: 30817,
+        45958: 30818,
+        45959: 30819,
+        45960: 30820,
+        45961: 30821,
+        45962: 30822,
+        45963: 30823,
+        45964: 30824,
+        45965: 30825,
+        45966: 30831,
+        45967: 30832,
+        45968: 30833,
+        45969: 30834,
+        45970: 30835,
+        45971: 30836,
+        45972: 30837,
+        45973: 30838,
+        45974: 30840,
+        45975: 30841,
+        45976: 30842,
+        45977: 30843,
+        45978: 30845,
+        45979: 30846,
+        45980: 30847,
+        45981: 30848,
+        45982: 30849,
+        45983: 30850,
+        45984: 30851,
+        45985: 22330,
+        45986: 23581,
+        45987: 24120,
+        45988: 38271,
+        45989: 20607,
+        45990: 32928,
+        45991: 21378,
+        45992: 25950,
+        45993: 30021,
+        45994: 21809,
+        45995: 20513,
+        45996: 36229,
+        45997: 25220,
+        45998: 38046,
+        45999: 26397,
+        46000: 22066,
+        46001: 28526,
+        46002: 24034,
+        46003: 21557,
+        46004: 28818,
+        46005: 36710,
+        46006: 25199,
+        46007: 25764,
+        46008: 25507,
+        46009: 24443,
+        46010: 28552,
+        46011: 37108,
+        46012: 33251,
+        46013: 36784,
+        46014: 23576,
+        46015: 26216,
+        46016: 24561,
+        46017: 27785,
+        46018: 38472,
+        46019: 36225,
+        46020: 34924,
+        46021: 25745,
+        46022: 31216,
+        46023: 22478,
+        46024: 27225,
+        46025: 25104,
+        46026: 21576,
+        46027: 20056,
+        46028: 31243,
+        46029: 24809,
+        46030: 28548,
+        46031: 35802,
+        46032: 25215,
+        46033: 36894,
+        46034: 39563,
+        46035: 31204,
+        46036: 21507,
+        46037: 30196,
+        46038: 25345,
+        46039: 21273,
+        46040: 27744,
+        46041: 36831,
+        46042: 24347,
+        46043: 39536,
+        46044: 32827,
+        46045: 40831,
+        46046: 20360,
+        46047: 23610,
+        46048: 36196,
+        46049: 32709,
+        46050: 26021,
+        46051: 28861,
+        46052: 20805,
+        46053: 20914,
+        46054: 34411,
+        46055: 23815,
+        46056: 23456,
+        46057: 25277,
+        46058: 37228,
+        46059: 30068,
+        46060: 36364,
+        46061: 31264,
+        46062: 24833,
+        46063: 31609,
+        46064: 20167,
+        46065: 32504,
+        46066: 30597,
+        46067: 19985,
+        46068: 33261,
+        46069: 21021,
+        46070: 20986,
+        46071: 27249,
+        46072: 21416,
+        46073: 36487,
+        46074: 38148,
+        46075: 38607,
+        46076: 28353,
+        46077: 38500,
+        46078: 26970,
+        46144: 30852,
+        46145: 30853,
+        46146: 30854,
+        46147: 30856,
+        46148: 30858,
+        46149: 30859,
+        46150: 30863,
+        46151: 30864,
+        46152: 30866,
+        46153: 30868,
+        46154: 30869,
+        46155: 30870,
+        46156: 30873,
+        46157: 30877,
+        46158: 30878,
+        46159: 30880,
+        46160: 30882,
+        46161: 30884,
+        46162: 30886,
+        46163: 30888,
+        46164: 30889,
+        46165: 30890,
+        46166: 30891,
+        46167: 30892,
+        46168: 30893,
+        46169: 30894,
+        46170: 30895,
+        46171: 30901,
+        46172: 30902,
+        46173: 30903,
+        46174: 30904,
+        46175: 30906,
+        46176: 30907,
+        46177: 30908,
+        46178: 30909,
+        46179: 30911,
+        46180: 30912,
+        46181: 30914,
+        46182: 30915,
+        46183: 30916,
+        46184: 30918,
+        46185: 30919,
+        46186: 30920,
+        46187: 30924,
+        46188: 30925,
+        46189: 30926,
+        46190: 30927,
+        46191: 30929,
+        46192: 30930,
+        46193: 30931,
+        46194: 30934,
+        46195: 30935,
+        46196: 30936,
+        46197: 30938,
+        46198: 30939,
+        46199: 30940,
+        46200: 30941,
+        46201: 30942,
+        46202: 30943,
+        46203: 30944,
+        46204: 30945,
+        46205: 30946,
+        46206: 30947,
+        46208: 30948,
+        46209: 30949,
+        46210: 30950,
+        46211: 30951,
+        46212: 30953,
+        46213: 30954,
+        46214: 30955,
+        46215: 30957,
+        46216: 30958,
+        46217: 30959,
+        46218: 30960,
+        46219: 30961,
+        46220: 30963,
+        46221: 30965,
+        46222: 30966,
+        46223: 30968,
+        46224: 30969,
+        46225: 30971,
+        46226: 30972,
+        46227: 30973,
+        46228: 30974,
+        46229: 30975,
+        46230: 30976,
+        46231: 30978,
+        46232: 30979,
+        46233: 30980,
+        46234: 30982,
+        46235: 30983,
+        46236: 30984,
+        46237: 30985,
+        46238: 30986,
+        46239: 30987,
+        46240: 30988,
+        46241: 30784,
+        46242: 20648,
+        46243: 30679,
+        46244: 25616,
+        46245: 35302,
+        46246: 22788,
+        46247: 25571,
+        46248: 24029,
+        46249: 31359,
+        46250: 26941,
+        46251: 20256,
+        46252: 33337,
+        46253: 21912,
+        46254: 20018,
+        46255: 30126,
+        46256: 31383,
+        46257: 24162,
+        46258: 24202,
+        46259: 38383,
+        46260: 21019,
+        46261: 21561,
+        46262: 28810,
+        46263: 25462,
+        46264: 38180,
+        46265: 22402,
+        46266: 26149,
+        46267: 26943,
+        46268: 37255,
+        46269: 21767,
+        46270: 28147,
+        46271: 32431,
+        46272: 34850,
+        46273: 25139,
+        46274: 32496,
+        46275: 30133,
+        46276: 33576,
+        46277: 30913,
+        46278: 38604,
+        46279: 36766,
+        46280: 24904,
+        46281: 29943,
+        46282: 35789,
+        46283: 27492,
+        46284: 21050,
+        46285: 36176,
+        46286: 27425,
+        46287: 32874,
+        46288: 33905,
+        46289: 22257,
+        46290: 21254,
+        46291: 20174,
+        46292: 19995,
+        46293: 20945,
+        46294: 31895,
+        46295: 37259,
+        46296: 31751,
+        46297: 20419,
+        46298: 36479,
+        46299: 31713,
+        46300: 31388,
+        46301: 25703,
+        46302: 23828,
+        46303: 20652,
+        46304: 33030,
+        46305: 30209,
+        46306: 31929,
+        46307: 28140,
+        46308: 32736,
+        46309: 26449,
+        46310: 23384,
+        46311: 23544,
+        46312: 30923,
+        46313: 25774,
+        46314: 25619,
+        46315: 25514,
+        46316: 25387,
+        46317: 38169,
+        46318: 25645,
+        46319: 36798,
+        46320: 31572,
+        46321: 30249,
+        46322: 25171,
+        46323: 22823,
+        46324: 21574,
+        46325: 27513,
+        46326: 20643,
+        46327: 25140,
+        46328: 24102,
+        46329: 27526,
+        46330: 20195,
+        46331: 36151,
+        46332: 34955,
+        46333: 24453,
+        46334: 36910,
+        46400: 30989,
+        46401: 30990,
+        46402: 30991,
+        46403: 30992,
+        46404: 30993,
+        46405: 30994,
+        46406: 30996,
+        46407: 30997,
+        46408: 30998,
+        46409: 30999,
+        46410: 31000,
+        46411: 31001,
+        46412: 31002,
+        46413: 31003,
+        46414: 31004,
+        46415: 31005,
+        46416: 31007,
+        46417: 31008,
+        46418: 31009,
+        46419: 31010,
+        46420: 31011,
+        46421: 31013,
+        46422: 31014,
+        46423: 31015,
+        46424: 31016,
+        46425: 31017,
+        46426: 31018,
+        46427: 31019,
+        46428: 31020,
+        46429: 31021,
+        46430: 31022,
+        46431: 31023,
+        46432: 31024,
+        46433: 31025,
+        46434: 31026,
+        46435: 31027,
+        46436: 31029,
+        46437: 31030,
+        46438: 31031,
+        46439: 31032,
+        46440: 31033,
+        46441: 31037,
+        46442: 31039,
+        46443: 31042,
+        46444: 31043,
+        46445: 31044,
+        46446: 31045,
+        46447: 31047,
+        46448: 31050,
+        46449: 31051,
+        46450: 31052,
+        46451: 31053,
+        46452: 31054,
+        46453: 31055,
+        46454: 31056,
+        46455: 31057,
+        46456: 31058,
+        46457: 31060,
+        46458: 31061,
+        46459: 31064,
+        46460: 31065,
+        46461: 31073,
+        46462: 31075,
+        46464: 31076,
+        46465: 31078,
+        46466: 31081,
+        46467: 31082,
+        46468: 31083,
+        46469: 31084,
+        46470: 31086,
+        46471: 31088,
+        46472: 31089,
+        46473: 31090,
+        46474: 31091,
+        46475: 31092,
+        46476: 31093,
+        46477: 31094,
+        46478: 31097,
+        46479: 31099,
+        46480: 31100,
+        46481: 31101,
+        46482: 31102,
+        46483: 31103,
+        46484: 31106,
+        46485: 31107,
+        46486: 31110,
+        46487: 31111,
+        46488: 31112,
+        46489: 31113,
+        46490: 31115,
+        46491: 31116,
+        46492: 31117,
+        46493: 31118,
+        46494: 31120,
+        46495: 31121,
+        46496: 31122,
+        46497: 24608,
+        46498: 32829,
+        46499: 25285,
+        46500: 20025,
+        46501: 21333,
+        46502: 37112,
+        46503: 25528,
+        46504: 32966,
+        46505: 26086,
+        46506: 27694,
+        46507: 20294,
+        46508: 24814,
+        46509: 28129,
+        46510: 35806,
+        46511: 24377,
+        46512: 34507,
+        46513: 24403,
+        46514: 25377,
+        46515: 20826,
+        46516: 33633,
+        46517: 26723,
+        46518: 20992,
+        46519: 25443,
+        46520: 36424,
+        46521: 20498,
+        46522: 23707,
+        46523: 31095,
+        46524: 23548,
+        46525: 21040,
+        46526: 31291,
+        46527: 24764,
+        46528: 36947,
+        46529: 30423,
+        46530: 24503,
+        46531: 24471,
+        46532: 30340,
+        46533: 36460,
+        46534: 28783,
+        46535: 30331,
+        46536: 31561,
+        46537: 30634,
+        46538: 20979,
+        46539: 37011,
+        46540: 22564,
+        46541: 20302,
+        46542: 28404,
+        46543: 36842,
+        46544: 25932,
+        46545: 31515,
+        46546: 29380,
+        46547: 28068,
+        46548: 32735,
+        46549: 23265,
+        46550: 25269,
+        46551: 24213,
+        46552: 22320,
+        46553: 33922,
+        46554: 31532,
+        46555: 24093,
+        46556: 24351,
+        46557: 36882,
+        46558: 32532,
+        46559: 39072,
+        46560: 25474,
+        46561: 28359,
+        46562: 30872,
+        46563: 28857,
+        46564: 20856,
+        46565: 38747,
+        46566: 22443,
+        46567: 30005,
+        46568: 20291,
+        46569: 30008,
+        46570: 24215,
+        46571: 24806,
+        46572: 22880,
+        46573: 28096,
+        46574: 27583,
+        46575: 30857,
+        46576: 21500,
+        46577: 38613,
+        46578: 20939,
+        46579: 20993,
+        46580: 25481,
+        46581: 21514,
+        46582: 38035,
+        46583: 35843,
+        46584: 36300,
+        46585: 29241,
+        46586: 30879,
+        46587: 34678,
+        46588: 36845,
+        46589: 35853,
+        46590: 21472,
+        46656: 31123,
+        46657: 31124,
+        46658: 31125,
+        46659: 31126,
+        46660: 31127,
+        46661: 31128,
+        46662: 31129,
+        46663: 31131,
+        46664: 31132,
+        46665: 31133,
+        46666: 31134,
+        46667: 31135,
+        46668: 31136,
+        46669: 31137,
+        46670: 31138,
+        46671: 31139,
+        46672: 31140,
+        46673: 31141,
+        46674: 31142,
+        46675: 31144,
+        46676: 31145,
+        46677: 31146,
+        46678: 31147,
+        46679: 31148,
+        46680: 31149,
+        46681: 31150,
+        46682: 31151,
+        46683: 31152,
+        46684: 31153,
+        46685: 31154,
+        46686: 31156,
+        46687: 31157,
+        46688: 31158,
+        46689: 31159,
+        46690: 31160,
+        46691: 31164,
+        46692: 31167,
+        46693: 31170,
+        46694: 31172,
+        46695: 31173,
+        46696: 31175,
+        46697: 31176,
+        46698: 31178,
+        46699: 31180,
+        46700: 31182,
+        46701: 31183,
+        46702: 31184,
+        46703: 31187,
+        46704: 31188,
+        46705: 31190,
+        46706: 31191,
+        46707: 31193,
+        46708: 31194,
+        46709: 31195,
+        46710: 31196,
+        46711: 31197,
+        46712: 31198,
+        46713: 31200,
+        46714: 31201,
+        46715: 31202,
+        46716: 31205,
+        46717: 31208,
+        46718: 31210,
+        46720: 31212,
+        46721: 31214,
+        46722: 31217,
+        46723: 31218,
+        46724: 31219,
+        46725: 31220,
+        46726: 31221,
+        46727: 31222,
+        46728: 31223,
+        46729: 31225,
+        46730: 31226,
+        46731: 31228,
+        46732: 31230,
+        46733: 31231,
+        46734: 31233,
+        46735: 31236,
+        46736: 31237,
+        46737: 31239,
+        46738: 31240,
+        46739: 31241,
+        46740: 31242,
+        46741: 31244,
+        46742: 31247,
+        46743: 31248,
+        46744: 31249,
+        46745: 31250,
+        46746: 31251,
+        46747: 31253,
+        46748: 31254,
+        46749: 31256,
+        46750: 31257,
+        46751: 31259,
+        46752: 31260,
+        46753: 19969,
+        46754: 30447,
+        46755: 21486,
+        46756: 38025,
+        46757: 39030,
+        46758: 40718,
+        46759: 38189,
+        46760: 23450,
+        46761: 35746,
+        46762: 20002,
+        46763: 19996,
+        46764: 20908,
+        46765: 33891,
+        46766: 25026,
+        46767: 21160,
+        46768: 26635,
+        46769: 20375,
+        46770: 24683,
+        46771: 20923,
+        46772: 27934,
+        46773: 20828,
+        46774: 25238,
+        46775: 26007,
+        46776: 38497,
+        46777: 35910,
+        46778: 36887,
+        46779: 30168,
+        46780: 37117,
+        46781: 30563,
+        46782: 27602,
+        46783: 29322,
+        46784: 29420,
+        46785: 35835,
+        46786: 22581,
+        46787: 30585,
+        46788: 36172,
+        46789: 26460,
+        46790: 38208,
+        46791: 32922,
+        46792: 24230,
+        46793: 28193,
+        46794: 22930,
+        46795: 31471,
+        46796: 30701,
+        46797: 38203,
+        46798: 27573,
+        46799: 26029,
+        46800: 32526,
+        46801: 22534,
+        46802: 20817,
+        46803: 38431,
+        46804: 23545,
+        46805: 22697,
+        46806: 21544,
+        46807: 36466,
+        46808: 25958,
+        46809: 39039,
+        46810: 22244,
+        46811: 38045,
+        46812: 30462,
+        46813: 36929,
+        46814: 25479,
+        46815: 21702,
+        46816: 22810,
+        46817: 22842,
+        46818: 22427,
+        46819: 36530,
+        46820: 26421,
+        46821: 36346,
+        46822: 33333,
+        46823: 21057,
+        46824: 24816,
+        46825: 22549,
+        46826: 34558,
+        46827: 23784,
+        46828: 40517,
+        46829: 20420,
+        46830: 39069,
+        46831: 35769,
+        46832: 23077,
+        46833: 24694,
+        46834: 21380,
+        46835: 25212,
+        46836: 36943,
+        46837: 37122,
+        46838: 39295,
+        46839: 24681,
+        46840: 32780,
+        46841: 20799,
+        46842: 32819,
+        46843: 23572,
+        46844: 39285,
+        46845: 27953,
+        46846: 20108,
+        46912: 31261,
+        46913: 31263,
+        46914: 31265,
+        46915: 31266,
+        46916: 31268,
+        46917: 31269,
+        46918: 31270,
+        46919: 31271,
+        46920: 31272,
+        46921: 31273,
+        46922: 31274,
+        46923: 31275,
+        46924: 31276,
+        46925: 31277,
+        46926: 31278,
+        46927: 31279,
+        46928: 31280,
+        46929: 31281,
+        46930: 31282,
+        46931: 31284,
+        46932: 31285,
+        46933: 31286,
+        46934: 31288,
+        46935: 31290,
+        46936: 31294,
+        46937: 31296,
+        46938: 31297,
+        46939: 31298,
+        46940: 31299,
+        46941: 31300,
+        46942: 31301,
+        46943: 31303,
+        46944: 31304,
+        46945: 31305,
+        46946: 31306,
+        46947: 31307,
+        46948: 31308,
+        46949: 31309,
+        46950: 31310,
+        46951: 31311,
+        46952: 31312,
+        46953: 31314,
+        46954: 31315,
+        46955: 31316,
+        46956: 31317,
+        46957: 31318,
+        46958: 31320,
+        46959: 31321,
+        46960: 31322,
+        46961: 31323,
+        46962: 31324,
+        46963: 31325,
+        46964: 31326,
+        46965: 31327,
+        46966: 31328,
+        46967: 31329,
+        46968: 31330,
+        46969: 31331,
+        46970: 31332,
+        46971: 31333,
+        46972: 31334,
+        46973: 31335,
+        46974: 31336,
+        46976: 31337,
+        46977: 31338,
+        46978: 31339,
+        46979: 31340,
+        46980: 31341,
+        46981: 31342,
+        46982: 31343,
+        46983: 31345,
+        46984: 31346,
+        46985: 31347,
+        46986: 31349,
+        46987: 31355,
+        46988: 31356,
+        46989: 31357,
+        46990: 31358,
+        46991: 31362,
+        46992: 31365,
+        46993: 31367,
+        46994: 31369,
+        46995: 31370,
+        46996: 31371,
+        46997: 31372,
+        46998: 31374,
+        46999: 31375,
+        47000: 31376,
+        47001: 31379,
+        47002: 31380,
+        47003: 31385,
+        47004: 31386,
+        47005: 31387,
+        47006: 31390,
+        47007: 31393,
+        47008: 31394,
+        47009: 36144,
+        47010: 21457,
+        47011: 32602,
+        47012: 31567,
+        47013: 20240,
+        47014: 20047,
+        47015: 38400,
+        47016: 27861,
+        47017: 29648,
+        47018: 34281,
+        47019: 24070,
+        47020: 30058,
+        47021: 32763,
+        47022: 27146,
+        47023: 30718,
+        47024: 38034,
+        47025: 32321,
+        47026: 20961,
+        47027: 28902,
+        47028: 21453,
+        47029: 36820,
+        47030: 33539,
+        47031: 36137,
+        47032: 29359,
+        47033: 39277,
+        47034: 27867,
+        47035: 22346,
+        47036: 33459,
+        47037: 26041,
+        47038: 32938,
+        47039: 25151,
+        47040: 38450,
+        47041: 22952,
+        47042: 20223,
+        47043: 35775,
+        47044: 32442,
+        47045: 25918,
+        47046: 33778,
+        47047: 38750,
+        47048: 21857,
+        47049: 39134,
+        47050: 32933,
+        47051: 21290,
+        47052: 35837,
+        47053: 21536,
+        47054: 32954,
+        47055: 24223,
+        47056: 27832,
+        47057: 36153,
+        47058: 33452,
+        47059: 37210,
+        47060: 21545,
+        47061: 27675,
+        47062: 20998,
+        47063: 32439,
+        47064: 22367,
+        47065: 28954,
+        47066: 27774,
+        47067: 31881,
+        47068: 22859,
+        47069: 20221,
+        47070: 24575,
+        47071: 24868,
+        47072: 31914,
+        47073: 20016,
+        47074: 23553,
+        47075: 26539,
+        47076: 34562,
+        47077: 23792,
+        47078: 38155,
+        47079: 39118,
+        47080: 30127,
+        47081: 28925,
+        47082: 36898,
+        47083: 20911,
+        47084: 32541,
+        47085: 35773,
+        47086: 22857,
+        47087: 20964,
+        47088: 20315,
+        47089: 21542,
+        47090: 22827,
+        47091: 25975,
+        47092: 32932,
+        47093: 23413,
+        47094: 25206,
+        47095: 25282,
+        47096: 36752,
+        47097: 24133,
+        47098: 27679,
+        47099: 31526,
+        47100: 20239,
+        47101: 20440,
+        47102: 26381,
+        47168: 31395,
+        47169: 31396,
+        47170: 31399,
+        47171: 31401,
+        47172: 31402,
+        47173: 31403,
+        47174: 31406,
+        47175: 31407,
+        47176: 31408,
+        47177: 31409,
+        47178: 31410,
+        47179: 31412,
+        47180: 31413,
+        47181: 31414,
+        47182: 31415,
+        47183: 31416,
+        47184: 31417,
+        47185: 31418,
+        47186: 31419,
+        47187: 31420,
+        47188: 31421,
+        47189: 31422,
+        47190: 31424,
+        47191: 31425,
+        47192: 31426,
+        47193: 31427,
+        47194: 31428,
+        47195: 31429,
+        47196: 31430,
+        47197: 31431,
+        47198: 31432,
+        47199: 31433,
+        47200: 31434,
+        47201: 31436,
+        47202: 31437,
+        47203: 31438,
+        47204: 31439,
+        47205: 31440,
+        47206: 31441,
+        47207: 31442,
+        47208: 31443,
+        47209: 31444,
+        47210: 31445,
+        47211: 31447,
+        47212: 31448,
+        47213: 31450,
+        47214: 31451,
+        47215: 31452,
+        47216: 31453,
+        47217: 31457,
+        47218: 31458,
+        47219: 31460,
+        47220: 31463,
+        47221: 31464,
+        47222: 31465,
+        47223: 31466,
+        47224: 31467,
+        47225: 31468,
+        47226: 31470,
+        47227: 31472,
+        47228: 31473,
+        47229: 31474,
+        47230: 31475,
+        47232: 31476,
+        47233: 31477,
+        47234: 31478,
+        47235: 31479,
+        47236: 31480,
+        47237: 31483,
+        47238: 31484,
+        47239: 31486,
+        47240: 31488,
+        47241: 31489,
+        47242: 31490,
+        47243: 31493,
+        47244: 31495,
+        47245: 31497,
+        47246: 31500,
+        47247: 31501,
+        47248: 31502,
+        47249: 31504,
+        47250: 31506,
+        47251: 31507,
+        47252: 31510,
+        47253: 31511,
+        47254: 31512,
+        47255: 31514,
+        47256: 31516,
+        47257: 31517,
+        47258: 31519,
+        47259: 31521,
+        47260: 31522,
+        47261: 31523,
+        47262: 31527,
+        47263: 31529,
+        47264: 31533,
+        47265: 28014,
+        47266: 28074,
+        47267: 31119,
+        47268: 34993,
+        47269: 24343,
+        47270: 29995,
+        47271: 25242,
+        47272: 36741,
+        47273: 20463,
+        47274: 37340,
+        47275: 26023,
+        47276: 33071,
+        47277: 33105,
+        47278: 24220,
+        47279: 33104,
+        47280: 36212,
+        47281: 21103,
+        47282: 35206,
+        47283: 36171,
+        47284: 22797,
+        47285: 20613,
+        47286: 20184,
+        47287: 38428,
+        47288: 29238,
+        47289: 33145,
+        47290: 36127,
+        47291: 23500,
+        47292: 35747,
+        47293: 38468,
+        47294: 22919,
+        47295: 32538,
+        47296: 21648,
+        47297: 22134,
+        47298: 22030,
+        47299: 35813,
+        47300: 25913,
+        47301: 27010,
+        47302: 38041,
+        47303: 30422,
+        47304: 28297,
+        47305: 24178,
+        47306: 29976,
+        47307: 26438,
+        47308: 26577,
+        47309: 31487,
+        47310: 32925,
+        47311: 36214,
+        47312: 24863,
+        47313: 31174,
+        47314: 25954,
+        47315: 36195,
+        47316: 20872,
+        47317: 21018,
+        47318: 38050,
+        47319: 32568,
+        47320: 32923,
+        47321: 32434,
+        47322: 23703,
+        47323: 28207,
+        47324: 26464,
+        47325: 31705,
+        47326: 30347,
+        47327: 39640,
+        47328: 33167,
+        47329: 32660,
+        47330: 31957,
+        47331: 25630,
+        47332: 38224,
+        47333: 31295,
+        47334: 21578,
+        47335: 21733,
+        47336: 27468,
+        47337: 25601,
+        47338: 25096,
+        47339: 40509,
+        47340: 33011,
+        47341: 30105,
+        47342: 21106,
+        47343: 38761,
+        47344: 33883,
+        47345: 26684,
+        47346: 34532,
+        47347: 38401,
+        47348: 38548,
+        47349: 38124,
+        47350: 20010,
+        47351: 21508,
+        47352: 32473,
+        47353: 26681,
+        47354: 36319,
+        47355: 32789,
+        47356: 26356,
+        47357: 24218,
+        47358: 32697,
+        47424: 31535,
+        47425: 31536,
+        47426: 31538,
+        47427: 31540,
+        47428: 31541,
+        47429: 31542,
+        47430: 31543,
+        47431: 31545,
+        47432: 31547,
+        47433: 31549,
+        47434: 31551,
+        47435: 31552,
+        47436: 31553,
+        47437: 31554,
+        47438: 31555,
+        47439: 31556,
+        47440: 31558,
+        47441: 31560,
+        47442: 31562,
+        47443: 31565,
+        47444: 31566,
+        47445: 31571,
+        47446: 31573,
+        47447: 31575,
+        47448: 31577,
+        47449: 31580,
+        47450: 31582,
+        47451: 31583,
+        47452: 31585,
+        47453: 31587,
+        47454: 31588,
+        47455: 31589,
+        47456: 31590,
+        47457: 31591,
+        47458: 31592,
+        47459: 31593,
+        47460: 31594,
+        47461: 31595,
+        47462: 31596,
+        47463: 31597,
+        47464: 31599,
+        47465: 31600,
+        47466: 31603,
+        47467: 31604,
+        47468: 31606,
+        47469: 31608,
+        47470: 31610,
+        47471: 31612,
+        47472: 31613,
+        47473: 31615,
+        47474: 31617,
+        47475: 31618,
+        47476: 31619,
+        47477: 31620,
+        47478: 31622,
+        47479: 31623,
+        47480: 31624,
+        47481: 31625,
+        47482: 31626,
+        47483: 31627,
+        47484: 31628,
+        47485: 31630,
+        47486: 31631,
+        47488: 31633,
+        47489: 31634,
+        47490: 31635,
+        47491: 31638,
+        47492: 31640,
+        47493: 31641,
+        47494: 31642,
+        47495: 31643,
+        47496: 31646,
+        47497: 31647,
+        47498: 31648,
+        47499: 31651,
+        47500: 31652,
+        47501: 31653,
+        47502: 31662,
+        47503: 31663,
+        47504: 31664,
+        47505: 31666,
+        47506: 31667,
+        47507: 31669,
+        47508: 31670,
+        47509: 31671,
+        47510: 31673,
+        47511: 31674,
+        47512: 31675,
+        47513: 31676,
+        47514: 31677,
+        47515: 31678,
+        47516: 31679,
+        47517: 31680,
+        47518: 31682,
+        47519: 31683,
+        47520: 31684,
+        47521: 22466,
+        47522: 32831,
+        47523: 26775,
+        47524: 24037,
+        47525: 25915,
+        47526: 21151,
+        47527: 24685,
+        47528: 40858,
+        47529: 20379,
+        47530: 36524,
+        47531: 20844,
+        47532: 23467,
+        47533: 24339,
+        47534: 24041,
+        47535: 27742,
+        47536: 25329,
+        47537: 36129,
+        47538: 20849,
+        47539: 38057,
+        47540: 21246,
+        47541: 27807,
+        47542: 33503,
+        47543: 29399,
+        47544: 22434,
+        47545: 26500,
+        47546: 36141,
+        47547: 22815,
+        47548: 36764,
+        47549: 33735,
+        47550: 21653,
+        47551: 31629,
+        47552: 20272,
+        47553: 27837,
+        47554: 23396,
+        47555: 22993,
+        47556: 40723,
+        47557: 21476,
+        47558: 34506,
+        47559: 39592,
+        47560: 35895,
+        47561: 32929,
+        47562: 25925,
+        47563: 39038,
+        47564: 22266,
+        47565: 38599,
+        47566: 21038,
+        47567: 29916,
+        47568: 21072,
+        47569: 23521,
+        47570: 25346,
+        47571: 35074,
+        47572: 20054,
+        47573: 25296,
+        47574: 24618,
+        47575: 26874,
+        47576: 20851,
+        47577: 23448,
+        47578: 20896,
+        47579: 35266,
+        47580: 31649,
+        47581: 39302,
+        47582: 32592,
+        47583: 24815,
+        47584: 28748,
+        47585: 36143,
+        47586: 20809,
+        47587: 24191,
+        47588: 36891,
+        47589: 29808,
+        47590: 35268,
+        47591: 22317,
+        47592: 30789,
+        47593: 24402,
+        47594: 40863,
+        47595: 38394,
+        47596: 36712,
+        47597: 39740,
+        47598: 35809,
+        47599: 30328,
+        47600: 26690,
+        47601: 26588,
+        47602: 36330,
+        47603: 36149,
+        47604: 21053,
+        47605: 36746,
+        47606: 28378,
+        47607: 26829,
+        47608: 38149,
+        47609: 37101,
+        47610: 22269,
+        47611: 26524,
+        47612: 35065,
+        47613: 36807,
+        47614: 21704,
+        47680: 31685,
+        47681: 31688,
+        47682: 31689,
+        47683: 31690,
+        47684: 31691,
+        47685: 31693,
+        47686: 31694,
+        47687: 31695,
+        47688: 31696,
+        47689: 31698,
+        47690: 31700,
+        47691: 31701,
+        47692: 31702,
+        47693: 31703,
+        47694: 31704,
+        47695: 31707,
+        47696: 31708,
+        47697: 31710,
+        47698: 31711,
+        47699: 31712,
+        47700: 31714,
+        47701: 31715,
+        47702: 31716,
+        47703: 31719,
+        47704: 31720,
+        47705: 31721,
+        47706: 31723,
+        47707: 31724,
+        47708: 31725,
+        47709: 31727,
+        47710: 31728,
+        47711: 31730,
+        47712: 31731,
+        47713: 31732,
+        47714: 31733,
+        47715: 31734,
+        47716: 31736,
+        47717: 31737,
+        47718: 31738,
+        47719: 31739,
+        47720: 31741,
+        47721: 31743,
+        47722: 31744,
+        47723: 31745,
+        47724: 31746,
+        47725: 31747,
+        47726: 31748,
+        47727: 31749,
+        47728: 31750,
+        47729: 31752,
+        47730: 31753,
+        47731: 31754,
+        47732: 31757,
+        47733: 31758,
+        47734: 31760,
+        47735: 31761,
+        47736: 31762,
+        47737: 31763,
+        47738: 31764,
+        47739: 31765,
+        47740: 31767,
+        47741: 31768,
+        47742: 31769,
+        47744: 31770,
+        47745: 31771,
+        47746: 31772,
+        47747: 31773,
+        47748: 31774,
+        47749: 31776,
+        47750: 31777,
+        47751: 31778,
+        47752: 31779,
+        47753: 31780,
+        47754: 31781,
+        47755: 31784,
+        47756: 31785,
+        47757: 31787,
+        47758: 31788,
+        47759: 31789,
+        47760: 31790,
+        47761: 31791,
+        47762: 31792,
+        47763: 31793,
+        47764: 31794,
+        47765: 31795,
+        47766: 31796,
+        47767: 31797,
+        47768: 31798,
+        47769: 31799,
+        47770: 31801,
+        47771: 31802,
+        47772: 31803,
+        47773: 31804,
+        47774: 31805,
+        47775: 31806,
+        47776: 31810,
+        47777: 39608,
+        47778: 23401,
+        47779: 28023,
+        47780: 27686,
+        47781: 20133,
+        47782: 23475,
+        47783: 39559,
+        47784: 37219,
+        47785: 25000,
+        47786: 37039,
+        47787: 38889,
+        47788: 21547,
+        47789: 28085,
+        47790: 23506,
+        47791: 20989,
+        47792: 21898,
+        47793: 32597,
+        47794: 32752,
+        47795: 25788,
+        47796: 25421,
+        47797: 26097,
+        47798: 25022,
+        47799: 24717,
+        47800: 28938,
+        47801: 27735,
+        47802: 27721,
+        47803: 22831,
+        47804: 26477,
+        47805: 33322,
+        47806: 22741,
+        47807: 22158,
+        47808: 35946,
+        47809: 27627,
+        47810: 37085,
+        47811: 22909,
+        47812: 32791,
+        47813: 21495,
+        47814: 28009,
+        47815: 21621,
+        47816: 21917,
+        47817: 33655,
+        47818: 33743,
+        47819: 26680,
+        47820: 31166,
+        47821: 21644,
+        47822: 20309,
+        47823: 21512,
+        47824: 30418,
+        47825: 35977,
+        47826: 38402,
+        47827: 27827,
+        47828: 28088,
+        47829: 36203,
+        47830: 35088,
+        47831: 40548,
+        47832: 36154,
+        47833: 22079,
+        47834: 40657,
+        47835: 30165,
+        47836: 24456,
+        47837: 29408,
+        47838: 24680,
+        47839: 21756,
+        47840: 20136,
+        47841: 27178,
+        47842: 34913,
+        47843: 24658,
+        47844: 36720,
+        47845: 21700,
+        47846: 28888,
+        47847: 34425,
+        47848: 40511,
+        47849: 27946,
+        47850: 23439,
+        47851: 24344,
+        47852: 32418,
+        47853: 21897,
+        47854: 20399,
+        47855: 29492,
+        47856: 21564,
+        47857: 21402,
+        47858: 20505,
+        47859: 21518,
+        47860: 21628,
+        47861: 20046,
+        47862: 24573,
+        47863: 29786,
+        47864: 22774,
+        47865: 33899,
+        47866: 32993,
+        47867: 34676,
+        47868: 29392,
+        47869: 31946,
+        47870: 28246,
+        47936: 31811,
+        47937: 31812,
+        47938: 31813,
+        47939: 31814,
+        47940: 31815,
+        47941: 31816,
+        47942: 31817,
+        47943: 31818,
+        47944: 31819,
+        47945: 31820,
+        47946: 31822,
+        47947: 31823,
+        47948: 31824,
+        47949: 31825,
+        47950: 31826,
+        47951: 31827,
+        47952: 31828,
+        47953: 31829,
+        47954: 31830,
+        47955: 31831,
+        47956: 31832,
+        47957: 31833,
+        47958: 31834,
+        47959: 31835,
+        47960: 31836,
+        47961: 31837,
+        47962: 31838,
+        47963: 31839,
+        47964: 31840,
+        47965: 31841,
+        47966: 31842,
+        47967: 31843,
+        47968: 31844,
+        47969: 31845,
+        47970: 31846,
+        47971: 31847,
+        47972: 31848,
+        47973: 31849,
+        47974: 31850,
+        47975: 31851,
+        47976: 31852,
+        47977: 31853,
+        47978: 31854,
+        47979: 31855,
+        47980: 31856,
+        47981: 31857,
+        47982: 31858,
+        47983: 31861,
+        47984: 31862,
+        47985: 31863,
+        47986: 31864,
+        47987: 31865,
+        47988: 31866,
+        47989: 31870,
+        47990: 31871,
+        47991: 31872,
+        47992: 31873,
+        47993: 31874,
+        47994: 31875,
+        47995: 31876,
+        47996: 31877,
+        47997: 31878,
+        47998: 31879,
+        48000: 31880,
+        48001: 31882,
+        48002: 31883,
+        48003: 31884,
+        48004: 31885,
+        48005: 31886,
+        48006: 31887,
+        48007: 31888,
+        48008: 31891,
+        48009: 31892,
+        48010: 31894,
+        48011: 31897,
+        48012: 31898,
+        48013: 31899,
+        48014: 31904,
+        48015: 31905,
+        48016: 31907,
+        48017: 31910,
+        48018: 31911,
+        48019: 31912,
+        48020: 31913,
+        48021: 31915,
+        48022: 31916,
+        48023: 31917,
+        48024: 31919,
+        48025: 31920,
+        48026: 31924,
+        48027: 31925,
+        48028: 31926,
+        48029: 31927,
+        48030: 31928,
+        48031: 31930,
+        48032: 31931,
+        48033: 24359,
+        48034: 34382,
+        48035: 21804,
+        48036: 25252,
+        48037: 20114,
+        48038: 27818,
+        48039: 25143,
+        48040: 33457,
+        48041: 21719,
+        48042: 21326,
+        48043: 29502,
+        48044: 28369,
+        48045: 30011,
+        48046: 21010,
+        48047: 21270,
+        48048: 35805,
+        48049: 27088,
+        48050: 24458,
+        48051: 24576,
+        48052: 28142,
+        48053: 22351,
+        48054: 27426,
+        48055: 29615,
+        48056: 26707,
+        48057: 36824,
+        48058: 32531,
+        48059: 25442,
+        48060: 24739,
+        48061: 21796,
+        48062: 30186,
+        48063: 35938,
+        48064: 28949,
+        48065: 28067,
+        48066: 23462,
+        48067: 24187,
+        48068: 33618,
+        48069: 24908,
+        48070: 40644,
+        48071: 30970,
+        48072: 34647,
+        48073: 31783,
+        48074: 30343,
+        48075: 20976,
+        48076: 24822,
+        48077: 29004,
+        48078: 26179,
+        48079: 24140,
+        48080: 24653,
+        48081: 35854,
+        48082: 28784,
+        48083: 25381,
+        48084: 36745,
+        48085: 24509,
+        48086: 24674,
+        48087: 34516,
+        48088: 22238,
+        48089: 27585,
+        48090: 24724,
+        48091: 24935,
+        48092: 21321,
+        48093: 24800,
+        48094: 26214,
+        48095: 36159,
+        48096: 31229,
+        48097: 20250,
+        48098: 28905,
+        48099: 27719,
+        48100: 35763,
+        48101: 35826,
+        48102: 32472,
+        48103: 33636,
+        48104: 26127,
+        48105: 23130,
+        48106: 39746,
+        48107: 27985,
+        48108: 28151,
+        48109: 35905,
+        48110: 27963,
+        48111: 20249,
+        48112: 28779,
+        48113: 33719,
+        48114: 25110,
+        48115: 24785,
+        48116: 38669,
+        48117: 36135,
+        48118: 31096,
+        48119: 20987,
+        48120: 22334,
+        48121: 22522,
+        48122: 26426,
+        48123: 30072,
+        48124: 31293,
+        48125: 31215,
+        48126: 31637,
+        48192: 31935,
+        48193: 31936,
+        48194: 31938,
+        48195: 31939,
+        48196: 31940,
+        48197: 31942,
+        48198: 31945,
+        48199: 31947,
+        48200: 31950,
+        48201: 31951,
+        48202: 31952,
+        48203: 31953,
+        48204: 31954,
+        48205: 31955,
+        48206: 31956,
+        48207: 31960,
+        48208: 31962,
+        48209: 31963,
+        48210: 31965,
+        48211: 31966,
+        48212: 31969,
+        48213: 31970,
+        48214: 31971,
+        48215: 31972,
+        48216: 31973,
+        48217: 31974,
+        48218: 31975,
+        48219: 31977,
+        48220: 31978,
+        48221: 31979,
+        48222: 31980,
+        48223: 31981,
+        48224: 31982,
+        48225: 31984,
+        48226: 31985,
+        48227: 31986,
+        48228: 31987,
+        48229: 31988,
+        48230: 31989,
+        48231: 31990,
+        48232: 31991,
+        48233: 31993,
+        48234: 31994,
+        48235: 31996,
+        48236: 31997,
+        48237: 31998,
+        48238: 31999,
+        48239: 32000,
+        48240: 32001,
+        48241: 32002,
+        48242: 32003,
+        48243: 32004,
+        48244: 32005,
+        48245: 32006,
+        48246: 32007,
+        48247: 32008,
+        48248: 32009,
+        48249: 32011,
+        48250: 32012,
+        48251: 32013,
+        48252: 32014,
+        48253: 32015,
+        48254: 32016,
+        48256: 32017,
+        48257: 32018,
+        48258: 32019,
+        48259: 32020,
+        48260: 32021,
+        48261: 32022,
+        48262: 32023,
+        48263: 32024,
+        48264: 32025,
+        48265: 32026,
+        48266: 32027,
+        48267: 32028,
+        48268: 32029,
+        48269: 32030,
+        48270: 32031,
+        48271: 32033,
+        48272: 32035,
+        48273: 32036,
+        48274: 32037,
+        48275: 32038,
+        48276: 32040,
+        48277: 32041,
+        48278: 32042,
+        48279: 32044,
+        48280: 32045,
+        48281: 32046,
+        48282: 32048,
+        48283: 32049,
+        48284: 32050,
+        48285: 32051,
+        48286: 32052,
+        48287: 32053,
+        48288: 32054,
+        48289: 32908,
+        48290: 39269,
+        48291: 36857,
+        48292: 28608,
+        48293: 35749,
+        48294: 40481,
+        48295: 23020,
+        48296: 32489,
+        48297: 32521,
+        48298: 21513,
+        48299: 26497,
+        48300: 26840,
+        48301: 36753,
+        48302: 31821,
+        48303: 38598,
+        48304: 21450,
+        48305: 24613,
+        48306: 30142,
+        48307: 27762,
+        48308: 21363,
+        48309: 23241,
+        48310: 32423,
+        48311: 25380,
+        48312: 20960,
+        48313: 33034,
+        48314: 24049,
+        48315: 34015,
+        48316: 25216,
+        48317: 20864,
+        48318: 23395,
+        48319: 20238,
+        48320: 31085,
+        48321: 21058,
+        48322: 24760,
+        48323: 27982,
+        48324: 23492,
+        48325: 23490,
+        48326: 35745,
+        48327: 35760,
+        48328: 26082,
+        48329: 24524,
+        48330: 38469,
+        48331: 22931,
+        48332: 32487,
+        48333: 32426,
+        48334: 22025,
+        48335: 26551,
+        48336: 22841,
+        48337: 20339,
+        48338: 23478,
+        48339: 21152,
+        48340: 33626,
+        48341: 39050,
+        48342: 36158,
+        48343: 30002,
+        48344: 38078,
+        48345: 20551,
+        48346: 31292,
+        48347: 20215,
+        48348: 26550,
+        48349: 39550,
+        48350: 23233,
+        48351: 27516,
+        48352: 30417,
+        48353: 22362,
+        48354: 23574,
+        48355: 31546,
+        48356: 38388,
+        48357: 29006,
+        48358: 20860,
+        48359: 32937,
+        48360: 33392,
+        48361: 22904,
+        48362: 32516,
+        48363: 33575,
+        48364: 26816,
+        48365: 26604,
+        48366: 30897,
+        48367: 30839,
+        48368: 25315,
+        48369: 25441,
+        48370: 31616,
+        48371: 20461,
+        48372: 21098,
+        48373: 20943,
+        48374: 33616,
+        48375: 27099,
+        48376: 37492,
+        48377: 36341,
+        48378: 36145,
+        48379: 35265,
+        48380: 38190,
+        48381: 31661,
+        48382: 20214,
+        48448: 32055,
+        48449: 32056,
+        48450: 32057,
+        48451: 32058,
+        48452: 32059,
+        48453: 32060,
+        48454: 32061,
+        48455: 32062,
+        48456: 32063,
+        48457: 32064,
+        48458: 32065,
+        48459: 32066,
+        48460: 32067,
+        48461: 32068,
+        48462: 32069,
+        48463: 32070,
+        48464: 32071,
+        48465: 32072,
+        48466: 32073,
+        48467: 32074,
+        48468: 32075,
+        48469: 32076,
+        48470: 32077,
+        48471: 32078,
+        48472: 32079,
+        48473: 32080,
+        48474: 32081,
+        48475: 32082,
+        48476: 32083,
+        48477: 32084,
+        48478: 32085,
+        48479: 32086,
+        48480: 32087,
+        48481: 32088,
+        48482: 32089,
+        48483: 32090,
+        48484: 32091,
+        48485: 32092,
+        48486: 32093,
+        48487: 32094,
+        48488: 32095,
+        48489: 32096,
+        48490: 32097,
+        48491: 32098,
+        48492: 32099,
+        48493: 32100,
+        48494: 32101,
+        48495: 32102,
+        48496: 32103,
+        48497: 32104,
+        48498: 32105,
+        48499: 32106,
+        48500: 32107,
+        48501: 32108,
+        48502: 32109,
+        48503: 32111,
+        48504: 32112,
+        48505: 32113,
+        48506: 32114,
+        48507: 32115,
+        48508: 32116,
+        48509: 32117,
+        48510: 32118,
+        48512: 32120,
+        48513: 32121,
+        48514: 32122,
+        48515: 32123,
+        48516: 32124,
+        48517: 32125,
+        48518: 32126,
+        48519: 32127,
+        48520: 32128,
+        48521: 32129,
+        48522: 32130,
+        48523: 32131,
+        48524: 32132,
+        48525: 32133,
+        48526: 32134,
+        48527: 32135,
+        48528: 32136,
+        48529: 32137,
+        48530: 32138,
+        48531: 32139,
+        48532: 32140,
+        48533: 32141,
+        48534: 32142,
+        48535: 32143,
+        48536: 32144,
+        48537: 32145,
+        48538: 32146,
+        48539: 32147,
+        48540: 32148,
+        48541: 32149,
+        48542: 32150,
+        48543: 32151,
+        48544: 32152,
+        48545: 20581,
+        48546: 33328,
+        48547: 21073,
+        48548: 39279,
+        48549: 28176,
+        48550: 28293,
+        48551: 28071,
+        48552: 24314,
+        48553: 20725,
+        48554: 23004,
+        48555: 23558,
+        48556: 27974,
+        48557: 27743,
+        48558: 30086,
+        48559: 33931,
+        48560: 26728,
+        48561: 22870,
+        48562: 35762,
+        48563: 21280,
+        48564: 37233,
+        48565: 38477,
+        48566: 34121,
+        48567: 26898,
+        48568: 30977,
+        48569: 28966,
+        48570: 33014,
+        48571: 20132,
+        48572: 37066,
+        48573: 27975,
+        48574: 39556,
+        48575: 23047,
+        48576: 22204,
+        48577: 25605,
+        48578: 38128,
+        48579: 30699,
+        48580: 20389,
+        48581: 33050,
+        48582: 29409,
+        48583: 35282,
+        48584: 39290,
+        48585: 32564,
+        48586: 32478,
+        48587: 21119,
+        48588: 25945,
+        48589: 37237,
+        48590: 36735,
+        48591: 36739,
+        48592: 21483,
+        48593: 31382,
+        48594: 25581,
+        48595: 25509,
+        48596: 30342,
+        48597: 31224,
+        48598: 34903,
+        48599: 38454,
+        48600: 25130,
+        48601: 21163,
+        48602: 33410,
+        48603: 26708,
+        48604: 26480,
+        48605: 25463,
+        48606: 30571,
+        48607: 31469,
+        48608: 27905,
+        48609: 32467,
+        48610: 35299,
+        48611: 22992,
+        48612: 25106,
+        48613: 34249,
+        48614: 33445,
+        48615: 30028,
+        48616: 20511,
+        48617: 20171,
+        48618: 30117,
+        48619: 35819,
+        48620: 23626,
+        48621: 24062,
+        48622: 31563,
+        48623: 26020,
+        48624: 37329,
+        48625: 20170,
+        48626: 27941,
+        48627: 35167,
+        48628: 32039,
+        48629: 38182,
+        48630: 20165,
+        48631: 35880,
+        48632: 36827,
+        48633: 38771,
+        48634: 26187,
+        48635: 31105,
+        48636: 36817,
+        48637: 28908,
+        48638: 28024,
+        48704: 32153,
+        48705: 32154,
+        48706: 32155,
+        48707: 32156,
+        48708: 32157,
+        48709: 32158,
+        48710: 32159,
+        48711: 32160,
+        48712: 32161,
+        48713: 32162,
+        48714: 32163,
+        48715: 32164,
+        48716: 32165,
+        48717: 32167,
+        48718: 32168,
+        48719: 32169,
+        48720: 32170,
+        48721: 32171,
+        48722: 32172,
+        48723: 32173,
+        48724: 32175,
+        48725: 32176,
+        48726: 32177,
+        48727: 32178,
+        48728: 32179,
+        48729: 32180,
+        48730: 32181,
+        48731: 32182,
+        48732: 32183,
+        48733: 32184,
+        48734: 32185,
+        48735: 32186,
+        48736: 32187,
+        48737: 32188,
+        48738: 32189,
+        48739: 32190,
+        48740: 32191,
+        48741: 32192,
+        48742: 32193,
+        48743: 32194,
+        48744: 32195,
+        48745: 32196,
+        48746: 32197,
+        48747: 32198,
+        48748: 32199,
+        48749: 32200,
+        48750: 32201,
+        48751: 32202,
+        48752: 32203,
+        48753: 32204,
+        48754: 32205,
+        48755: 32206,
+        48756: 32207,
+        48757: 32208,
+        48758: 32209,
+        48759: 32210,
+        48760: 32211,
+        48761: 32212,
+        48762: 32213,
+        48763: 32214,
+        48764: 32215,
+        48765: 32216,
+        48766: 32217,
+        48768: 32218,
+        48769: 32219,
+        48770: 32220,
+        48771: 32221,
+        48772: 32222,
+        48773: 32223,
+        48774: 32224,
+        48775: 32225,
+        48776: 32226,
+        48777: 32227,
+        48778: 32228,
+        48779: 32229,
+        48780: 32230,
+        48781: 32231,
+        48782: 32232,
+        48783: 32233,
+        48784: 32234,
+        48785: 32235,
+        48786: 32236,
+        48787: 32237,
+        48788: 32238,
+        48789: 32239,
+        48790: 32240,
+        48791: 32241,
+        48792: 32242,
+        48793: 32243,
+        48794: 32244,
+        48795: 32245,
+        48796: 32246,
+        48797: 32247,
+        48798: 32248,
+        48799: 32249,
+        48800: 32250,
+        48801: 23613,
+        48802: 21170,
+        48803: 33606,
+        48804: 20834,
+        48805: 33550,
+        48806: 30555,
+        48807: 26230,
+        48808: 40120,
+        48809: 20140,
+        48810: 24778,
+        48811: 31934,
+        48812: 31923,
+        48813: 32463,
+        48814: 20117,
+        48815: 35686,
+        48816: 26223,
+        48817: 39048,
+        48818: 38745,
+        48819: 22659,
+        48820: 25964,
+        48821: 38236,
+        48822: 24452,
+        48823: 30153,
+        48824: 38742,
+        48825: 31455,
+        48826: 31454,
+        48827: 20928,
+        48828: 28847,
+        48829: 31384,
+        48830: 25578,
+        48831: 31350,
+        48832: 32416,
+        48833: 29590,
+        48834: 38893,
+        48835: 20037,
+        48836: 28792,
+        48837: 20061,
+        48838: 37202,
+        48839: 21417,
+        48840: 25937,
+        48841: 26087,
+        48842: 33276,
+        48843: 33285,
+        48844: 21646,
+        48845: 23601,
+        48846: 30106,
+        48847: 38816,
+        48848: 25304,
+        48849: 29401,
+        48850: 30141,
+        48851: 23621,
+        48852: 39545,
+        48853: 33738,
+        48854: 23616,
+        48855: 21632,
+        48856: 30697,
+        48857: 20030,
+        48858: 27822,
+        48859: 32858,
+        48860: 25298,
+        48861: 25454,
+        48862: 24040,
+        48863: 20855,
+        48864: 36317,
+        48865: 36382,
+        48866: 38191,
+        48867: 20465,
+        48868: 21477,
+        48869: 24807,
+        48870: 28844,
+        48871: 21095,
+        48872: 25424,
+        48873: 40515,
+        48874: 23071,
+        48875: 20518,
+        48876: 30519,
+        48877: 21367,
+        48878: 32482,
+        48879: 25733,
+        48880: 25899,
+        48881: 25225,
+        48882: 25496,
+        48883: 20500,
+        48884: 29237,
+        48885: 35273,
+        48886: 20915,
+        48887: 35776,
+        48888: 32477,
+        48889: 22343,
+        48890: 33740,
+        48891: 38055,
+        48892: 20891,
+        48893: 21531,
+        48894: 23803,
+        48960: 32251,
+        48961: 32252,
+        48962: 32253,
+        48963: 32254,
+        48964: 32255,
+        48965: 32256,
+        48966: 32257,
+        48967: 32258,
+        48968: 32259,
+        48969: 32260,
+        48970: 32261,
+        48971: 32262,
+        48972: 32263,
+        48973: 32264,
+        48974: 32265,
+        48975: 32266,
+        48976: 32267,
+        48977: 32268,
+        48978: 32269,
+        48979: 32270,
+        48980: 32271,
+        48981: 32272,
+        48982: 32273,
+        48983: 32274,
+        48984: 32275,
+        48985: 32276,
+        48986: 32277,
+        48987: 32278,
+        48988: 32279,
+        48989: 32280,
+        48990: 32281,
+        48991: 32282,
+        48992: 32283,
+        48993: 32284,
+        48994: 32285,
+        48995: 32286,
+        48996: 32287,
+        48997: 32288,
+        48998: 32289,
+        48999: 32290,
+        49000: 32291,
+        49001: 32292,
+        49002: 32293,
+        49003: 32294,
+        49004: 32295,
+        49005: 32296,
+        49006: 32297,
+        49007: 32298,
+        49008: 32299,
+        49009: 32300,
+        49010: 32301,
+        49011: 32302,
+        49012: 32303,
+        49013: 32304,
+        49014: 32305,
+        49015: 32306,
+        49016: 32307,
+        49017: 32308,
+        49018: 32309,
+        49019: 32310,
+        49020: 32311,
+        49021: 32312,
+        49022: 32313,
+        49024: 32314,
+        49025: 32316,
+        49026: 32317,
+        49027: 32318,
+        49028: 32319,
+        49029: 32320,
+        49030: 32322,
+        49031: 32323,
+        49032: 32324,
+        49033: 32325,
+        49034: 32326,
+        49035: 32328,
+        49036: 32329,
+        49037: 32330,
+        49038: 32331,
+        49039: 32332,
+        49040: 32333,
+        49041: 32334,
+        49042: 32335,
+        49043: 32336,
+        49044: 32337,
+        49045: 32338,
+        49046: 32339,
+        49047: 32340,
+        49048: 32341,
+        49049: 32342,
+        49050: 32343,
+        49051: 32344,
+        49052: 32345,
+        49053: 32346,
+        49054: 32347,
+        49055: 32348,
+        49056: 32349,
+        49057: 20426,
+        49058: 31459,
+        49059: 27994,
+        49060: 37089,
+        49061: 39567,
+        49062: 21888,
+        49063: 21654,
+        49064: 21345,
+        49065: 21679,
+        49066: 24320,
+        49067: 25577,
+        49068: 26999,
+        49069: 20975,
+        49070: 24936,
+        49071: 21002,
+        49072: 22570,
+        49073: 21208,
+        49074: 22350,
+        49075: 30733,
+        49076: 30475,
+        49077: 24247,
+        49078: 24951,
+        49079: 31968,
+        49080: 25179,
+        49081: 25239,
+        49082: 20130,
+        49083: 28821,
+        49084: 32771,
+        49085: 25335,
+        49086: 28900,
+        49087: 38752,
+        49088: 22391,
+        49089: 33499,
+        49090: 26607,
+        49091: 26869,
+        49092: 30933,
+        49093: 39063,
+        49094: 31185,
+        49095: 22771,
+        49096: 21683,
+        49097: 21487,
+        49098: 28212,
+        49099: 20811,
+        49100: 21051,
+        49101: 23458,
+        49102: 35838,
+        49103: 32943,
+        49104: 21827,
+        49105: 22438,
+        49106: 24691,
+        49107: 22353,
+        49108: 21549,
+        49109: 31354,
+        49110: 24656,
+        49111: 23380,
+        49112: 25511,
+        49113: 25248,
+        49114: 21475,
+        49115: 25187,
+        49116: 23495,
+        49117: 26543,
+        49118: 21741,
+        49119: 31391,
+        49120: 33510,
+        49121: 37239,
+        49122: 24211,
+        49123: 35044,
+        49124: 22840,
+        49125: 22446,
+        49126: 25358,
+        49127: 36328,
+        49128: 33007,
+        49129: 22359,
+        49130: 31607,
+        49131: 20393,
+        49132: 24555,
+        49133: 23485,
+        49134: 27454,
+        49135: 21281,
+        49136: 31568,
+        49137: 29378,
+        49138: 26694,
+        49139: 30719,
+        49140: 30518,
+        49141: 26103,
+        49142: 20917,
+        49143: 20111,
+        49144: 30420,
+        49145: 23743,
+        49146: 31397,
+        49147: 33909,
+        49148: 22862,
+        49149: 39745,
+        49150: 20608,
+        49216: 32350,
+        49217: 32351,
+        49218: 32352,
+        49219: 32353,
+        49220: 32354,
+        49221: 32355,
+        49222: 32356,
+        49223: 32357,
+        49224: 32358,
+        49225: 32359,
+        49226: 32360,
+        49227: 32361,
+        49228: 32362,
+        49229: 32363,
+        49230: 32364,
+        49231: 32365,
+        49232: 32366,
+        49233: 32367,
+        49234: 32368,
+        49235: 32369,
+        49236: 32370,
+        49237: 32371,
+        49238: 32372,
+        49239: 32373,
+        49240: 32374,
+        49241: 32375,
+        49242: 32376,
+        49243: 32377,
+        49244: 32378,
+        49245: 32379,
+        49246: 32380,
+        49247: 32381,
+        49248: 32382,
+        49249: 32383,
+        49250: 32384,
+        49251: 32385,
+        49252: 32387,
+        49253: 32388,
+        49254: 32389,
+        49255: 32390,
+        49256: 32391,
+        49257: 32392,
+        49258: 32393,
+        49259: 32394,
+        49260: 32395,
+        49261: 32396,
+        49262: 32397,
+        49263: 32398,
+        49264: 32399,
+        49265: 32400,
+        49266: 32401,
+        49267: 32402,
+        49268: 32403,
+        49269: 32404,
+        49270: 32405,
+        49271: 32406,
+        49272: 32407,
+        49273: 32408,
+        49274: 32409,
+        49275: 32410,
+        49276: 32412,
+        49277: 32413,
+        49278: 32414,
+        49280: 32430,
+        49281: 32436,
+        49282: 32443,
+        49283: 32444,
+        49284: 32470,
+        49285: 32484,
+        49286: 32492,
+        49287: 32505,
+        49288: 32522,
+        49289: 32528,
+        49290: 32542,
+        49291: 32567,
+        49292: 32569,
+        49293: 32571,
+        49294: 32572,
+        49295: 32573,
+        49296: 32574,
+        49297: 32575,
+        49298: 32576,
+        49299: 32577,
+        49300: 32579,
+        49301: 32582,
+        49302: 32583,
+        49303: 32584,
+        49304: 32585,
+        49305: 32586,
+        49306: 32587,
+        49307: 32588,
+        49308: 32589,
+        49309: 32590,
+        49310: 32591,
+        49311: 32594,
+        49312: 32595,
+        49313: 39304,
+        49314: 24871,
+        49315: 28291,
+        49316: 22372,
+        49317: 26118,
+        49318: 25414,
+        49319: 22256,
+        49320: 25324,
+        49321: 25193,
+        49322: 24275,
+        49323: 38420,
+        49324: 22403,
+        49325: 25289,
+        49326: 21895,
+        49327: 34593,
+        49328: 33098,
+        49329: 36771,
+        49330: 21862,
+        49331: 33713,
+        49332: 26469,
+        49333: 36182,
+        49334: 34013,
+        49335: 23146,
+        49336: 26639,
+        49337: 25318,
+        49338: 31726,
+        49339: 38417,
+        49340: 20848,
+        49341: 28572,
+        49342: 35888,
+        49343: 25597,
+        49344: 35272,
+        49345: 25042,
+        49346: 32518,
+        49347: 28866,
+        49348: 28389,
+        49349: 29701,
+        49350: 27028,
+        49351: 29436,
+        49352: 24266,
+        49353: 37070,
+        49354: 26391,
+        49355: 28010,
+        49356: 25438,
+        49357: 21171,
+        49358: 29282,
+        49359: 32769,
+        49360: 20332,
+        49361: 23013,
+        49362: 37226,
+        49363: 28889,
+        49364: 28061,
+        49365: 21202,
+        49366: 20048,
+        49367: 38647,
+        49368: 38253,
+        49369: 34174,
+        49370: 30922,
+        49371: 32047,
+        49372: 20769,
+        49373: 22418,
+        49374: 25794,
+        49375: 32907,
+        49376: 31867,
+        49377: 27882,
+        49378: 26865,
+        49379: 26974,
+        49380: 20919,
+        49381: 21400,
+        49382: 26792,
+        49383: 29313,
+        49384: 40654,
+        49385: 31729,
+        49386: 29432,
+        49387: 31163,
+        49388: 28435,
+        49389: 29702,
+        49390: 26446,
+        49391: 37324,
+        49392: 40100,
+        49393: 31036,
+        49394: 33673,
+        49395: 33620,
+        49396: 21519,
+        49397: 26647,
+        49398: 20029,
+        49399: 21385,
+        49400: 21169,
+        49401: 30782,
+        49402: 21382,
+        49403: 21033,
+        49404: 20616,
+        49405: 20363,
+        49406: 20432,
+        49472: 32598,
+        49473: 32601,
+        49474: 32603,
+        49475: 32604,
+        49476: 32605,
+        49477: 32606,
+        49478: 32608,
+        49479: 32611,
+        49480: 32612,
+        49481: 32613,
+        49482: 32614,
+        49483: 32615,
+        49484: 32619,
+        49485: 32620,
+        49486: 32621,
+        49487: 32623,
+        49488: 32624,
+        49489: 32627,
+        49490: 32629,
+        49491: 32630,
+        49492: 32631,
+        49493: 32632,
+        49494: 32634,
+        49495: 32635,
+        49496: 32636,
+        49497: 32637,
+        49498: 32639,
+        49499: 32640,
+        49500: 32642,
+        49501: 32643,
+        49502: 32644,
+        49503: 32645,
+        49504: 32646,
+        49505: 32647,
+        49506: 32648,
+        49507: 32649,
+        49508: 32651,
+        49509: 32653,
+        49510: 32655,
+        49511: 32656,
+        49512: 32657,
+        49513: 32658,
+        49514: 32659,
+        49515: 32661,
+        49516: 32662,
+        49517: 32663,
+        49518: 32664,
+        49519: 32665,
+        49520: 32667,
+        49521: 32668,
+        49522: 32672,
+        49523: 32674,
+        49524: 32675,
+        49525: 32677,
+        49526: 32678,
+        49527: 32680,
+        49528: 32681,
+        49529: 32682,
+        49530: 32683,
+        49531: 32684,
+        49532: 32685,
+        49533: 32686,
+        49534: 32689,
+        49536: 32691,
+        49537: 32692,
+        49538: 32693,
+        49539: 32694,
+        49540: 32695,
+        49541: 32698,
+        49542: 32699,
+        49543: 32702,
+        49544: 32704,
+        49545: 32706,
+        49546: 32707,
+        49547: 32708,
+        49548: 32710,
+        49549: 32711,
+        49550: 32712,
+        49551: 32713,
+        49552: 32715,
+        49553: 32717,
+        49554: 32719,
+        49555: 32720,
+        49556: 32721,
+        49557: 32722,
+        49558: 32723,
+        49559: 32726,
+        49560: 32727,
+        49561: 32729,
+        49562: 32730,
+        49563: 32731,
+        49564: 32732,
+        49565: 32733,
+        49566: 32734,
+        49567: 32738,
+        49568: 32739,
+        49569: 30178,
+        49570: 31435,
+        49571: 31890,
+        49572: 27813,
+        49573: 38582,
+        49574: 21147,
+        49575: 29827,
+        49576: 21737,
+        49577: 20457,
+        49578: 32852,
+        49579: 33714,
+        49580: 36830,
+        49581: 38256,
+        49582: 24265,
+        49583: 24604,
+        49584: 28063,
+        49585: 24088,
+        49586: 25947,
+        49587: 33080,
+        49588: 38142,
+        49589: 24651,
+        49590: 28860,
+        49591: 32451,
+        49592: 31918,
+        49593: 20937,
+        49594: 26753,
+        49595: 31921,
+        49596: 33391,
+        49597: 20004,
+        49598: 36742,
+        49599: 37327,
+        49600: 26238,
+        49601: 20142,
+        49602: 35845,
+        49603: 25769,
+        49604: 32842,
+        49605: 20698,
+        49606: 30103,
+        49607: 29134,
+        49608: 23525,
+        49609: 36797,
+        49610: 28518,
+        49611: 20102,
+        49612: 25730,
+        49613: 38243,
+        49614: 24278,
+        49615: 26009,
+        49616: 21015,
+        49617: 35010,
+        49618: 28872,
+        49619: 21155,
+        49620: 29454,
+        49621: 29747,
+        49622: 26519,
+        49623: 30967,
+        49624: 38678,
+        49625: 20020,
+        49626: 37051,
+        49627: 40158,
+        49628: 28107,
+        49629: 20955,
+        49630: 36161,
+        49631: 21533,
+        49632: 25294,
+        49633: 29618,
+        49634: 33777,
+        49635: 38646,
+        49636: 40836,
+        49637: 38083,
+        49638: 20278,
+        49639: 32666,
+        49640: 20940,
+        49641: 28789,
+        49642: 38517,
+        49643: 23725,
+        49644: 39046,
+        49645: 21478,
+        49646: 20196,
+        49647: 28316,
+        49648: 29705,
+        49649: 27060,
+        49650: 30827,
+        49651: 39311,
+        49652: 30041,
+        49653: 21016,
+        49654: 30244,
+        49655: 27969,
+        49656: 26611,
+        49657: 20845,
+        49658: 40857,
+        49659: 32843,
+        49660: 21657,
+        49661: 31548,
+        49662: 31423,
+        49728: 32740,
+        49729: 32743,
+        49730: 32744,
+        49731: 32746,
+        49732: 32747,
+        49733: 32748,
+        49734: 32749,
+        49735: 32751,
+        49736: 32754,
+        49737: 32756,
+        49738: 32757,
+        49739: 32758,
+        49740: 32759,
+        49741: 32760,
+        49742: 32761,
+        49743: 32762,
+        49744: 32765,
+        49745: 32766,
+        49746: 32767,
+        49747: 32770,
+        49748: 32775,
+        49749: 32776,
+        49750: 32777,
+        49751: 32778,
+        49752: 32782,
+        49753: 32783,
+        49754: 32785,
+        49755: 32787,
+        49756: 32794,
+        49757: 32795,
+        49758: 32797,
+        49759: 32798,
+        49760: 32799,
+        49761: 32801,
+        49762: 32803,
+        49763: 32804,
+        49764: 32811,
+        49765: 32812,
+        49766: 32813,
+        49767: 32814,
+        49768: 32815,
+        49769: 32816,
+        49770: 32818,
+        49771: 32820,
+        49772: 32825,
+        49773: 32826,
+        49774: 32828,
+        49775: 32830,
+        49776: 32832,
+        49777: 32833,
+        49778: 32836,
+        49779: 32837,
+        49780: 32839,
+        49781: 32840,
+        49782: 32841,
+        49783: 32846,
+        49784: 32847,
+        49785: 32848,
+        49786: 32849,
+        49787: 32851,
+        49788: 32853,
+        49789: 32854,
+        49790: 32855,
+        49792: 32857,
+        49793: 32859,
+        49794: 32860,
+        49795: 32861,
+        49796: 32862,
+        49797: 32863,
+        49798: 32864,
+        49799: 32865,
+        49800: 32866,
+        49801: 32867,
+        49802: 32868,
+        49803: 32869,
+        49804: 32870,
+        49805: 32871,
+        49806: 32872,
+        49807: 32875,
+        49808: 32876,
+        49809: 32877,
+        49810: 32878,
+        49811: 32879,
+        49812: 32880,
+        49813: 32882,
+        49814: 32883,
+        49815: 32884,
+        49816: 32885,
+        49817: 32886,
+        49818: 32887,
+        49819: 32888,
+        49820: 32889,
+        49821: 32890,
+        49822: 32891,
+        49823: 32892,
+        49824: 32893,
+        49825: 38534,
+        49826: 22404,
+        49827: 25314,
+        49828: 38471,
+        49829: 27004,
+        49830: 23044,
+        49831: 25602,
+        49832: 31699,
+        49833: 28431,
+        49834: 38475,
+        49835: 33446,
+        49836: 21346,
+        49837: 39045,
+        49838: 24208,
+        49839: 28809,
+        49840: 25523,
+        49841: 21348,
+        49842: 34383,
+        49843: 40065,
+        49844: 40595,
+        49845: 30860,
+        49846: 38706,
+        49847: 36335,
+        49848: 36162,
+        49849: 40575,
+        49850: 28510,
+        49851: 31108,
+        49852: 24405,
+        49853: 38470,
+        49854: 25134,
+        49855: 39540,
+        49856: 21525,
+        49857: 38109,
+        49858: 20387,
+        49859: 26053,
+        49860: 23653,
+        49861: 23649,
+        49862: 32533,
+        49863: 34385,
+        49864: 27695,
+        49865: 24459,
+        49866: 29575,
+        49867: 28388,
+        49868: 32511,
+        49869: 23782,
+        49870: 25371,
+        49871: 23402,
+        49872: 28390,
+        49873: 21365,
+        49874: 20081,
+        49875: 25504,
+        49876: 30053,
+        49877: 25249,
+        49878: 36718,
+        49879: 20262,
+        49880: 20177,
+        49881: 27814,
+        49882: 32438,
+        49883: 35770,
+        49884: 33821,
+        49885: 34746,
+        49886: 32599,
+        49887: 36923,
+        49888: 38179,
+        49889: 31657,
+        49890: 39585,
+        49891: 35064,
+        49892: 33853,
+        49893: 27931,
+        49894: 39558,
+        49895: 32476,
+        49896: 22920,
+        49897: 40635,
+        49898: 29595,
+        49899: 30721,
+        49900: 34434,
+        49901: 39532,
+        49902: 39554,
+        49903: 22043,
+        49904: 21527,
+        49905: 22475,
+        49906: 20080,
+        49907: 40614,
+        49908: 21334,
+        49909: 36808,
+        49910: 33033,
+        49911: 30610,
+        49912: 39314,
+        49913: 34542,
+        49914: 28385,
+        49915: 34067,
+        49916: 26364,
+        49917: 24930,
+        49918: 28459,
+        49984: 32894,
+        49985: 32897,
+        49986: 32898,
+        49987: 32901,
+        49988: 32904,
+        49989: 32906,
+        49990: 32909,
+        49991: 32910,
+        49992: 32911,
+        49993: 32912,
+        49994: 32913,
+        49995: 32914,
+        49996: 32916,
+        49997: 32917,
+        49998: 32919,
+        49999: 32921,
+        50000: 32926,
+        50001: 32931,
+        50002: 32934,
+        50003: 32935,
+        50004: 32936,
+        50005: 32940,
+        50006: 32944,
+        50007: 32947,
+        50008: 32949,
+        50009: 32950,
+        50010: 32952,
+        50011: 32953,
+        50012: 32955,
+        50013: 32965,
+        50014: 32967,
+        50015: 32968,
+        50016: 32969,
+        50017: 32970,
+        50018: 32971,
+        50019: 32975,
+        50020: 32976,
+        50021: 32977,
+        50022: 32978,
+        50023: 32979,
+        50024: 32980,
+        50025: 32981,
+        50026: 32984,
+        50027: 32991,
+        50028: 32992,
+        50029: 32994,
+        50030: 32995,
+        50031: 32998,
+        50032: 33006,
+        50033: 33013,
+        50034: 33015,
+        50035: 33017,
+        50036: 33019,
+        50037: 33022,
+        50038: 33023,
+        50039: 33024,
+        50040: 33025,
+        50041: 33027,
+        50042: 33028,
+        50043: 33029,
+        50044: 33031,
+        50045: 33032,
+        50046: 33035,
+        50048: 33036,
+        50049: 33045,
+        50050: 33047,
+        50051: 33049,
+        50052: 33051,
+        50053: 33052,
+        50054: 33053,
+        50055: 33055,
+        50056: 33056,
+        50057: 33057,
+        50058: 33058,
+        50059: 33059,
+        50060: 33060,
+        50061: 33061,
+        50062: 33062,
+        50063: 33063,
+        50064: 33064,
+        50065: 33065,
+        50066: 33066,
+        50067: 33067,
+        50068: 33069,
+        50069: 33070,
+        50070: 33072,
+        50071: 33075,
+        50072: 33076,
+        50073: 33077,
+        50074: 33079,
+        50075: 33081,
+        50076: 33082,
+        50077: 33083,
+        50078: 33084,
+        50079: 33085,
+        50080: 33087,
+        50081: 35881,
+        50082: 33426,
+        50083: 33579,
+        50084: 30450,
+        50085: 27667,
+        50086: 24537,
+        50087: 33725,
+        50088: 29483,
+        50089: 33541,
+        50090: 38170,
+        50091: 27611,
+        50092: 30683,
+        50093: 38086,
+        50094: 21359,
+        50095: 33538,
+        50096: 20882,
+        50097: 24125,
+        50098: 35980,
+        50099: 36152,
+        50100: 20040,
+        50101: 29611,
+        50102: 26522,
+        50103: 26757,
+        50104: 37238,
+        50105: 38665,
+        50106: 29028,
+        50107: 27809,
+        50108: 30473,
+        50109: 23186,
+        50110: 38209,
+        50111: 27599,
+        50112: 32654,
+        50113: 26151,
+        50114: 23504,
+        50115: 22969,
+        50116: 23194,
+        50117: 38376,
+        50118: 38391,
+        50119: 20204,
+        50120: 33804,
+        50121: 33945,
+        50122: 27308,
+        50123: 30431,
+        50124: 38192,
+        50125: 29467,
+        50126: 26790,
+        50127: 23391,
+        50128: 30511,
+        50129: 37274,
+        50130: 38753,
+        50131: 31964,
+        50132: 36855,
+        50133: 35868,
+        50134: 24357,
+        50135: 31859,
+        50136: 31192,
+        50137: 35269,
+        50138: 27852,
+        50139: 34588,
+        50140: 23494,
+        50141: 24130,
+        50142: 26825,
+        50143: 30496,
+        50144: 32501,
+        50145: 20885,
+        50146: 20813,
+        50147: 21193,
+        50148: 23081,
+        50149: 32517,
+        50150: 38754,
+        50151: 33495,
+        50152: 25551,
+        50153: 30596,
+        50154: 34256,
+        50155: 31186,
+        50156: 28218,
+        50157: 24217,
+        50158: 22937,
+        50159: 34065,
+        50160: 28781,
+        50161: 27665,
+        50162: 25279,
+        50163: 30399,
+        50164: 25935,
+        50165: 24751,
+        50166: 38397,
+        50167: 26126,
+        50168: 34719,
+        50169: 40483,
+        50170: 38125,
+        50171: 21517,
+        50172: 21629,
+        50173: 35884,
+        50174: 25720,
+        50240: 33088,
+        50241: 33089,
+        50242: 33090,
+        50243: 33091,
+        50244: 33092,
+        50245: 33093,
+        50246: 33095,
+        50247: 33097,
+        50248: 33101,
+        50249: 33102,
+        50250: 33103,
+        50251: 33106,
+        50252: 33110,
+        50253: 33111,
+        50254: 33112,
+        50255: 33115,
+        50256: 33116,
+        50257: 33117,
+        50258: 33118,
+        50259: 33119,
+        50260: 33121,
+        50261: 33122,
+        50262: 33123,
+        50263: 33124,
+        50264: 33126,
+        50265: 33128,
+        50266: 33130,
+        50267: 33131,
+        50268: 33132,
+        50269: 33135,
+        50270: 33138,
+        50271: 33139,
+        50272: 33141,
+        50273: 33142,
+        50274: 33143,
+        50275: 33144,
+        50276: 33153,
+        50277: 33155,
+        50278: 33156,
+        50279: 33157,
+        50280: 33158,
+        50281: 33159,
+        50282: 33161,
+        50283: 33163,
+        50284: 33164,
+        50285: 33165,
+        50286: 33166,
+        50287: 33168,
+        50288: 33170,
+        50289: 33171,
+        50290: 33172,
+        50291: 33173,
+        50292: 33174,
+        50293: 33175,
+        50294: 33177,
+        50295: 33178,
+        50296: 33182,
+        50297: 33183,
+        50298: 33184,
+        50299: 33185,
+        50300: 33186,
+        50301: 33188,
+        50302: 33189,
+        50304: 33191,
+        50305: 33193,
+        50306: 33195,
+        50307: 33196,
+        50308: 33197,
+        50309: 33198,
+        50310: 33199,
+        50311: 33200,
+        50312: 33201,
+        50313: 33202,
+        50314: 33204,
+        50315: 33205,
+        50316: 33206,
+        50317: 33207,
+        50318: 33208,
+        50319: 33209,
+        50320: 33212,
+        50321: 33213,
+        50322: 33214,
+        50323: 33215,
+        50324: 33220,
+        50325: 33221,
+        50326: 33223,
+        50327: 33224,
+        50328: 33225,
+        50329: 33227,
+        50330: 33229,
+        50331: 33230,
+        50332: 33231,
+        50333: 33232,
+        50334: 33233,
+        50335: 33234,
+        50336: 33235,
+        50337: 25721,
+        50338: 34321,
+        50339: 27169,
+        50340: 33180,
+        50341: 30952,
+        50342: 25705,
+        50343: 39764,
+        50344: 25273,
+        50345: 26411,
+        50346: 33707,
+        50347: 22696,
+        50348: 40664,
+        50349: 27819,
+        50350: 28448,
+        50351: 23518,
+        50352: 38476,
+        50353: 35851,
+        50354: 29279,
+        50355: 26576,
+        50356: 25287,
+        50357: 29281,
+        50358: 20137,
+        50359: 22982,
+        50360: 27597,
+        50361: 22675,
+        50362: 26286,
+        50363: 24149,
+        50364: 21215,
+        50365: 24917,
+        50366: 26408,
+        50367: 30446,
+        50368: 30566,
+        50369: 29287,
+        50370: 31302,
+        50371: 25343,
+        50372: 21738,
+        50373: 21584,
+        50374: 38048,
+        50375: 37027,
+        50376: 23068,
+        50377: 32435,
+        50378: 27670,
+        50379: 20035,
+        50380: 22902,
+        50381: 32784,
+        50382: 22856,
+        50383: 21335,
+        50384: 30007,
+        50385: 38590,
+        50386: 22218,
+        50387: 25376,
+        50388: 33041,
+        50389: 24700,
+        50390: 38393,
+        50391: 28118,
+        50392: 21602,
+        50393: 39297,
+        50394: 20869,
+        50395: 23273,
+        50396: 33021,
+        50397: 22958,
+        50398: 38675,
+        50399: 20522,
+        50400: 27877,
+        50401: 23612,
+        50402: 25311,
+        50403: 20320,
+        50404: 21311,
+        50405: 33147,
+        50406: 36870,
+        50407: 28346,
+        50408: 34091,
+        50409: 25288,
+        50410: 24180,
+        50411: 30910,
+        50412: 25781,
+        50413: 25467,
+        50414: 24565,
+        50415: 23064,
+        50416: 37247,
+        50417: 40479,
+        50418: 23615,
+        50419: 25423,
+        50420: 32834,
+        50421: 23421,
+        50422: 21870,
+        50423: 38218,
+        50424: 38221,
+        50425: 28037,
+        50426: 24744,
+        50427: 26592,
+        50428: 29406,
+        50429: 20957,
+        50430: 23425,
+        50496: 33236,
+        50497: 33237,
+        50498: 33238,
+        50499: 33239,
+        50500: 33240,
+        50501: 33241,
+        50502: 33242,
+        50503: 33243,
+        50504: 33244,
+        50505: 33245,
+        50506: 33246,
+        50507: 33247,
+        50508: 33248,
+        50509: 33249,
+        50510: 33250,
+        50511: 33252,
+        50512: 33253,
+        50513: 33254,
+        50514: 33256,
+        50515: 33257,
+        50516: 33259,
+        50517: 33262,
+        50518: 33263,
+        50519: 33264,
+        50520: 33265,
+        50521: 33266,
+        50522: 33269,
+        50523: 33270,
+        50524: 33271,
+        50525: 33272,
+        50526: 33273,
+        50527: 33274,
+        50528: 33277,
+        50529: 33279,
+        50530: 33283,
+        50531: 33287,
+        50532: 33288,
+        50533: 33289,
+        50534: 33290,
+        50535: 33291,
+        50536: 33294,
+        50537: 33295,
+        50538: 33297,
+        50539: 33299,
+        50540: 33301,
+        50541: 33302,
+        50542: 33303,
+        50543: 33304,
+        50544: 33305,
+        50545: 33306,
+        50546: 33309,
+        50547: 33312,
+        50548: 33316,
+        50549: 33317,
+        50550: 33318,
+        50551: 33319,
+        50552: 33321,
+        50553: 33326,
+        50554: 33330,
+        50555: 33338,
+        50556: 33340,
+        50557: 33341,
+        50558: 33343,
+        50560: 33344,
+        50561: 33345,
+        50562: 33346,
+        50563: 33347,
+        50564: 33349,
+        50565: 33350,
+        50566: 33352,
+        50567: 33354,
+        50568: 33356,
+        50569: 33357,
+        50570: 33358,
+        50571: 33360,
+        50572: 33361,
+        50573: 33362,
+        50574: 33363,
+        50575: 33364,
+        50576: 33365,
+        50577: 33366,
+        50578: 33367,
+        50579: 33369,
+        50580: 33371,
+        50581: 33372,
+        50582: 33373,
+        50583: 33374,
+        50584: 33376,
+        50585: 33377,
+        50586: 33378,
+        50587: 33379,
+        50588: 33380,
+        50589: 33381,
+        50590: 33382,
+        50591: 33383,
+        50592: 33385,
+        50593: 25319,
+        50594: 27870,
+        50595: 29275,
+        50596: 25197,
+        50597: 38062,
+        50598: 32445,
+        50599: 33043,
+        50600: 27987,
+        50601: 20892,
+        50602: 24324,
+        50603: 22900,
+        50604: 21162,
+        50605: 24594,
+        50606: 22899,
+        50607: 26262,
+        50608: 34384,
+        50609: 30111,
+        50610: 25386,
+        50611: 25062,
+        50612: 31983,
+        50613: 35834,
+        50614: 21734,
+        50615: 27431,
+        50616: 40485,
+        50617: 27572,
+        50618: 34261,
+        50619: 21589,
+        50620: 20598,
+        50621: 27812,
+        50622: 21866,
+        50623: 36276,
+        50624: 29228,
+        50625: 24085,
+        50626: 24597,
+        50627: 29750,
+        50628: 25293,
+        50629: 25490,
+        50630: 29260,
+        50631: 24472,
+        50632: 28227,
+        50633: 27966,
+        50634: 25856,
+        50635: 28504,
+        50636: 30424,
+        50637: 30928,
+        50638: 30460,
+        50639: 30036,
+        50640: 21028,
+        50641: 21467,
+        50642: 20051,
+        50643: 24222,
+        50644: 26049,
+        50645: 32810,
+        50646: 32982,
+        50647: 25243,
+        50648: 21638,
+        50649: 21032,
+        50650: 28846,
+        50651: 34957,
+        50652: 36305,
+        50653: 27873,
+        50654: 21624,
+        50655: 32986,
+        50656: 22521,
+        50657: 35060,
+        50658: 36180,
+        50659: 38506,
+        50660: 37197,
+        50661: 20329,
+        50662: 27803,
+        50663: 21943,
+        50664: 30406,
+        50665: 30768,
+        50666: 25256,
+        50667: 28921,
+        50668: 28558,
+        50669: 24429,
+        50670: 34028,
+        50671: 26842,
+        50672: 30844,
+        50673: 31735,
+        50674: 33192,
+        50675: 26379,
+        50676: 40527,
+        50677: 25447,
+        50678: 30896,
+        50679: 22383,
+        50680: 30738,
+        50681: 38713,
+        50682: 25209,
+        50683: 25259,
+        50684: 21128,
+        50685: 29749,
+        50686: 27607,
+        50752: 33386,
+        50753: 33387,
+        50754: 33388,
+        50755: 33389,
+        50756: 33393,
+        50757: 33397,
+        50758: 33398,
+        50759: 33399,
+        50760: 33400,
+        50761: 33403,
+        50762: 33404,
+        50763: 33408,
+        50764: 33409,
+        50765: 33411,
+        50766: 33413,
+        50767: 33414,
+        50768: 33415,
+        50769: 33417,
+        50770: 33420,
+        50771: 33424,
+        50772: 33427,
+        50773: 33428,
+        50774: 33429,
+        50775: 33430,
+        50776: 33434,
+        50777: 33435,
+        50778: 33438,
+        50779: 33440,
+        50780: 33442,
+        50781: 33443,
+        50782: 33447,
+        50783: 33458,
+        50784: 33461,
+        50785: 33462,
+        50786: 33466,
+        50787: 33467,
+        50788: 33468,
+        50789: 33471,
+        50790: 33472,
+        50791: 33474,
+        50792: 33475,
+        50793: 33477,
+        50794: 33478,
+        50795: 33481,
+        50796: 33488,
+        50797: 33494,
+        50798: 33497,
+        50799: 33498,
+        50800: 33501,
+        50801: 33506,
+        50802: 33511,
+        50803: 33512,
+        50804: 33513,
+        50805: 33514,
+        50806: 33516,
+        50807: 33517,
+        50808: 33518,
+        50809: 33520,
+        50810: 33522,
+        50811: 33523,
+        50812: 33525,
+        50813: 33526,
+        50814: 33528,
+        50816: 33530,
+        50817: 33532,
+        50818: 33533,
+        50819: 33534,
+        50820: 33535,
+        50821: 33536,
+        50822: 33546,
+        50823: 33547,
+        50824: 33549,
+        50825: 33552,
+        50826: 33554,
+        50827: 33555,
+        50828: 33558,
+        50829: 33560,
+        50830: 33561,
+        50831: 33565,
+        50832: 33566,
+        50833: 33567,
+        50834: 33568,
+        50835: 33569,
+        50836: 33570,
+        50837: 33571,
+        50838: 33572,
+        50839: 33573,
+        50840: 33574,
+        50841: 33577,
+        50842: 33578,
+        50843: 33582,
+        50844: 33584,
+        50845: 33586,
+        50846: 33591,
+        50847: 33595,
+        50848: 33597,
+        50849: 21860,
+        50850: 33086,
+        50851: 30130,
+        50852: 30382,
+        50853: 21305,
+        50854: 30174,
+        50855: 20731,
+        50856: 23617,
+        50857: 35692,
+        50858: 31687,
+        50859: 20559,
+        50860: 29255,
+        50861: 39575,
+        50862: 39128,
+        50863: 28418,
+        50864: 29922,
+        50865: 31080,
+        50866: 25735,
+        50867: 30629,
+        50868: 25340,
+        50869: 39057,
+        50870: 36139,
+        50871: 21697,
+        50872: 32856,
+        50873: 20050,
+        50874: 22378,
+        50875: 33529,
+        50876: 33805,
+        50877: 24179,
+        50878: 20973,
+        50879: 29942,
+        50880: 35780,
+        50881: 23631,
+        50882: 22369,
+        50883: 27900,
+        50884: 39047,
+        50885: 23110,
+        50886: 30772,
+        50887: 39748,
+        50888: 36843,
+        50889: 31893,
+        50890: 21078,
+        50891: 25169,
+        50892: 38138,
+        50893: 20166,
+        50894: 33670,
+        50895: 33889,
+        50896: 33769,
+        50897: 33970,
+        50898: 22484,
+        50899: 26420,
+        50900: 22275,
+        50901: 26222,
+        50902: 28006,
+        50903: 35889,
+        50904: 26333,
+        50905: 28689,
+        50906: 26399,
+        50907: 27450,
+        50908: 26646,
+        50909: 25114,
+        50910: 22971,
+        50911: 19971,
+        50912: 20932,
+        50913: 28422,
+        50914: 26578,
+        50915: 27791,
+        50916: 20854,
+        50917: 26827,
+        50918: 22855,
+        50919: 27495,
+        50920: 30054,
+        50921: 23822,
+        50922: 33040,
+        50923: 40784,
+        50924: 26071,
+        50925: 31048,
+        50926: 31041,
+        50927: 39569,
+        50928: 36215,
+        50929: 23682,
+        50930: 20062,
+        50931: 20225,
+        50932: 21551,
+        50933: 22865,
+        50934: 30732,
+        50935: 22120,
+        50936: 27668,
+        50937: 36804,
+        50938: 24323,
+        50939: 27773,
+        50940: 27875,
+        50941: 35755,
+        50942: 25488,
+        51008: 33598,
+        51009: 33599,
+        51010: 33601,
+        51011: 33602,
+        51012: 33604,
+        51013: 33605,
+        51014: 33608,
+        51015: 33610,
+        51016: 33611,
+        51017: 33612,
+        51018: 33613,
+        51019: 33614,
+        51020: 33619,
+        51021: 33621,
+        51022: 33622,
+        51023: 33623,
+        51024: 33624,
+        51025: 33625,
+        51026: 33629,
+        51027: 33634,
+        51028: 33648,
+        51029: 33649,
+        51030: 33650,
+        51031: 33651,
+        51032: 33652,
+        51033: 33653,
+        51034: 33654,
+        51035: 33657,
+        51036: 33658,
+        51037: 33662,
+        51038: 33663,
+        51039: 33664,
+        51040: 33665,
+        51041: 33666,
+        51042: 33667,
+        51043: 33668,
+        51044: 33671,
+        51045: 33672,
+        51046: 33674,
+        51047: 33675,
+        51048: 33676,
+        51049: 33677,
+        51050: 33679,
+        51051: 33680,
+        51052: 33681,
+        51053: 33684,
+        51054: 33685,
+        51055: 33686,
+        51056: 33687,
+        51057: 33689,
+        51058: 33690,
+        51059: 33693,
+        51060: 33695,
+        51061: 33697,
+        51062: 33698,
+        51063: 33699,
+        51064: 33700,
+        51065: 33701,
+        51066: 33702,
+        51067: 33703,
+        51068: 33708,
+        51069: 33709,
+        51070: 33710,
+        51072: 33711,
+        51073: 33717,
+        51074: 33723,
+        51075: 33726,
+        51076: 33727,
+        51077: 33730,
+        51078: 33731,
+        51079: 33732,
+        51080: 33734,
+        51081: 33736,
+        51082: 33737,
+        51083: 33739,
+        51084: 33741,
+        51085: 33742,
+        51086: 33744,
+        51087: 33745,
+        51088: 33746,
+        51089: 33747,
+        51090: 33749,
+        51091: 33751,
+        51092: 33753,
+        51093: 33754,
+        51094: 33755,
+        51095: 33758,
+        51096: 33762,
+        51097: 33763,
+        51098: 33764,
+        51099: 33766,
+        51100: 33767,
+        51101: 33768,
+        51102: 33771,
+        51103: 33772,
+        51104: 33773,
+        51105: 24688,
+        51106: 27965,
+        51107: 29301,
+        51108: 25190,
+        51109: 38030,
+        51110: 38085,
+        51111: 21315,
+        51112: 36801,
+        51113: 31614,
+        51114: 20191,
+        51115: 35878,
+        51116: 20094,
+        51117: 40660,
+        51118: 38065,
+        51119: 38067,
+        51120: 21069,
+        51121: 28508,
+        51122: 36963,
+        51123: 27973,
+        51124: 35892,
+        51125: 22545,
+        51126: 23884,
+        51127: 27424,
+        51128: 27465,
+        51129: 26538,
+        51130: 21595,
+        51131: 33108,
+        51132: 32652,
+        51133: 22681,
+        51134: 34103,
+        51135: 24378,
+        51136: 25250,
+        51137: 27207,
+        51138: 38201,
+        51139: 25970,
+        51140: 24708,
+        51141: 26725,
+        51142: 30631,
+        51143: 20052,
+        51144: 20392,
+        51145: 24039,
+        51146: 38808,
+        51147: 25772,
+        51148: 32728,
+        51149: 23789,
+        51150: 20431,
+        51151: 31373,
+        51152: 20999,
+        51153: 33540,
+        51154: 19988,
+        51155: 24623,
+        51156: 31363,
+        51157: 38054,
+        51158: 20405,
+        51159: 20146,
+        51160: 31206,
+        51161: 29748,
+        51162: 21220,
+        51163: 33465,
+        51164: 25810,
+        51165: 31165,
+        51166: 23517,
+        51167: 27777,
+        51168: 38738,
+        51169: 36731,
+        51170: 27682,
+        51171: 20542,
+        51172: 21375,
+        51173: 28165,
+        51174: 25806,
+        51175: 26228,
+        51176: 27696,
+        51177: 24773,
+        51178: 39031,
+        51179: 35831,
+        51180: 24198,
+        51181: 29756,
+        51182: 31351,
+        51183: 31179,
+        51184: 19992,
+        51185: 37041,
+        51186: 29699,
+        51187: 27714,
+        51188: 22234,
+        51189: 37195,
+        51190: 27845,
+        51191: 36235,
+        51192: 21306,
+        51193: 34502,
+        51194: 26354,
+        51195: 36527,
+        51196: 23624,
+        51197: 39537,
+        51198: 28192,
+        51264: 33774,
+        51265: 33775,
+        51266: 33779,
+        51267: 33780,
+        51268: 33781,
+        51269: 33782,
+        51270: 33783,
+        51271: 33786,
+        51272: 33787,
+        51273: 33788,
+        51274: 33790,
+        51275: 33791,
+        51276: 33792,
+        51277: 33794,
+        51278: 33797,
+        51279: 33799,
+        51280: 33800,
+        51281: 33801,
+        51282: 33802,
+        51283: 33808,
+        51284: 33810,
+        51285: 33811,
+        51286: 33812,
+        51287: 33813,
+        51288: 33814,
+        51289: 33815,
+        51290: 33817,
+        51291: 33818,
+        51292: 33819,
+        51293: 33822,
+        51294: 33823,
+        51295: 33824,
+        51296: 33825,
+        51297: 33826,
+        51298: 33827,
+        51299: 33833,
+        51300: 33834,
+        51301: 33835,
+        51302: 33836,
+        51303: 33837,
+        51304: 33838,
+        51305: 33839,
+        51306: 33840,
+        51307: 33842,
+        51308: 33843,
+        51309: 33844,
+        51310: 33845,
+        51311: 33846,
+        51312: 33847,
+        51313: 33849,
+        51314: 33850,
+        51315: 33851,
+        51316: 33854,
+        51317: 33855,
+        51318: 33856,
+        51319: 33857,
+        51320: 33858,
+        51321: 33859,
+        51322: 33860,
+        51323: 33861,
+        51324: 33863,
+        51325: 33864,
+        51326: 33865,
+        51328: 33866,
+        51329: 33867,
+        51330: 33868,
+        51331: 33869,
+        51332: 33870,
+        51333: 33871,
+        51334: 33872,
+        51335: 33874,
+        51336: 33875,
+        51337: 33876,
+        51338: 33877,
+        51339: 33878,
+        51340: 33880,
+        51341: 33885,
+        51342: 33886,
+        51343: 33887,
+        51344: 33888,
+        51345: 33890,
+        51346: 33892,
+        51347: 33893,
+        51348: 33894,
+        51349: 33895,
+        51350: 33896,
+        51351: 33898,
+        51352: 33902,
+        51353: 33903,
+        51354: 33904,
+        51355: 33906,
+        51356: 33908,
+        51357: 33911,
+        51358: 33913,
+        51359: 33915,
+        51360: 33916,
+        51361: 21462,
+        51362: 23094,
+        51363: 40843,
+        51364: 36259,
+        51365: 21435,
+        51366: 22280,
+        51367: 39079,
+        51368: 26435,
+        51369: 37275,
+        51370: 27849,
+        51371: 20840,
+        51372: 30154,
+        51373: 25331,
+        51374: 29356,
+        51375: 21048,
+        51376: 21149,
+        51377: 32570,
+        51378: 28820,
+        51379: 30264,
+        51380: 21364,
+        51381: 40522,
+        51382: 27063,
+        51383: 30830,
+        51384: 38592,
+        51385: 35033,
+        51386: 32676,
+        51387: 28982,
+        51388: 29123,
+        51389: 20873,
+        51390: 26579,
+        51391: 29924,
+        51392: 22756,
+        51393: 25880,
+        51394: 22199,
+        51395: 35753,
+        51396: 39286,
+        51397: 25200,
+        51398: 32469,
+        51399: 24825,
+        51400: 28909,
+        51401: 22764,
+        51402: 20161,
+        51403: 20154,
+        51404: 24525,
+        51405: 38887,
+        51406: 20219,
+        51407: 35748,
+        51408: 20995,
+        51409: 22922,
+        51410: 32427,
+        51411: 25172,
+        51412: 20173,
+        51413: 26085,
+        51414: 25102,
+        51415: 33592,
+        51416: 33993,
+        51417: 33635,
+        51418: 34701,
+        51419: 29076,
+        51420: 28342,
+        51421: 23481,
+        51422: 32466,
+        51423: 20887,
+        51424: 25545,
+        51425: 26580,
+        51426: 32905,
+        51427: 33593,
+        51428: 34837,
+        51429: 20754,
+        51430: 23418,
+        51431: 22914,
+        51432: 36785,
+        51433: 20083,
+        51434: 27741,
+        51435: 20837,
+        51436: 35109,
+        51437: 36719,
+        51438: 38446,
+        51439: 34122,
+        51440: 29790,
+        51441: 38160,
+        51442: 38384,
+        51443: 28070,
+        51444: 33509,
+        51445: 24369,
+        51446: 25746,
+        51447: 27922,
+        51448: 33832,
+        51449: 33134,
+        51450: 40131,
+        51451: 22622,
+        51452: 36187,
+        51453: 19977,
+        51454: 21441,
+        51520: 33917,
+        51521: 33918,
+        51522: 33919,
+        51523: 33920,
+        51524: 33921,
+        51525: 33923,
+        51526: 33924,
+        51527: 33925,
+        51528: 33926,
+        51529: 33930,
+        51530: 33933,
+        51531: 33935,
+        51532: 33936,
+        51533: 33937,
+        51534: 33938,
+        51535: 33939,
+        51536: 33940,
+        51537: 33941,
+        51538: 33942,
+        51539: 33944,
+        51540: 33946,
+        51541: 33947,
+        51542: 33949,
+        51543: 33950,
+        51544: 33951,
+        51545: 33952,
+        51546: 33954,
+        51547: 33955,
+        51548: 33956,
+        51549: 33957,
+        51550: 33958,
+        51551: 33959,
+        51552: 33960,
+        51553: 33961,
+        51554: 33962,
+        51555: 33963,
+        51556: 33964,
+        51557: 33965,
+        51558: 33966,
+        51559: 33968,
+        51560: 33969,
+        51561: 33971,
+        51562: 33973,
+        51563: 33974,
+        51564: 33975,
+        51565: 33979,
+        51566: 33980,
+        51567: 33982,
+        51568: 33984,
+        51569: 33986,
+        51570: 33987,
+        51571: 33989,
+        51572: 33990,
+        51573: 33991,
+        51574: 33992,
+        51575: 33995,
+        51576: 33996,
+        51577: 33998,
+        51578: 33999,
+        51579: 34002,
+        51580: 34004,
+        51581: 34005,
+        51582: 34007,
+        51584: 34008,
+        51585: 34009,
+        51586: 34010,
+        51587: 34011,
+        51588: 34012,
+        51589: 34014,
+        51590: 34017,
+        51591: 34018,
+        51592: 34020,
+        51593: 34023,
+        51594: 34024,
+        51595: 34025,
+        51596: 34026,
+        51597: 34027,
+        51598: 34029,
+        51599: 34030,
+        51600: 34031,
+        51601: 34033,
+        51602: 34034,
+        51603: 34035,
+        51604: 34036,
+        51605: 34037,
+        51606: 34038,
+        51607: 34039,
+        51608: 34040,
+        51609: 34041,
+        51610: 34042,
+        51611: 34043,
+        51612: 34045,
+        51613: 34046,
+        51614: 34048,
+        51615: 34049,
+        51616: 34050,
+        51617: 20254,
+        51618: 25955,
+        51619: 26705,
+        51620: 21971,
+        51621: 20007,
+        51622: 25620,
+        51623: 39578,
+        51624: 25195,
+        51625: 23234,
+        51626: 29791,
+        51627: 33394,
+        51628: 28073,
+        51629: 26862,
+        51630: 20711,
+        51631: 33678,
+        51632: 30722,
+        51633: 26432,
+        51634: 21049,
+        51635: 27801,
+        51636: 32433,
+        51637: 20667,
+        51638: 21861,
+        51639: 29022,
+        51640: 31579,
+        51641: 26194,
+        51642: 29642,
+        51643: 33515,
+        51644: 26441,
+        51645: 23665,
+        51646: 21024,
+        51647: 29053,
+        51648: 34923,
+        51649: 38378,
+        51650: 38485,
+        51651: 25797,
+        51652: 36193,
+        51653: 33203,
+        51654: 21892,
+        51655: 27733,
+        51656: 25159,
+        51657: 32558,
+        51658: 22674,
+        51659: 20260,
+        51660: 21830,
+        51661: 36175,
+        51662: 26188,
+        51663: 19978,
+        51664: 23578,
+        51665: 35059,
+        51666: 26786,
+        51667: 25422,
+        51668: 31245,
+        51669: 28903,
+        51670: 33421,
+        51671: 21242,
+        51672: 38902,
+        51673: 23569,
+        51674: 21736,
+        51675: 37045,
+        51676: 32461,
+        51677: 22882,
+        51678: 36170,
+        51679: 34503,
+        51680: 33292,
+        51681: 33293,
+        51682: 36198,
+        51683: 25668,
+        51684: 23556,
+        51685: 24913,
+        51686: 28041,
+        51687: 31038,
+        51688: 35774,
+        51689: 30775,
+        51690: 30003,
+        51691: 21627,
+        51692: 20280,
+        51693: 36523,
+        51694: 28145,
+        51695: 23072,
+        51696: 32453,
+        51697: 31070,
+        51698: 27784,
+        51699: 23457,
+        51700: 23158,
+        51701: 29978,
+        51702: 32958,
+        51703: 24910,
+        51704: 28183,
+        51705: 22768,
+        51706: 29983,
+        51707: 29989,
+        51708: 29298,
+        51709: 21319,
+        51710: 32499,
+        51776: 34051,
+        51777: 34052,
+        51778: 34053,
+        51779: 34054,
+        51780: 34055,
+        51781: 34056,
+        51782: 34057,
+        51783: 34058,
+        51784: 34059,
+        51785: 34061,
+        51786: 34062,
+        51787: 34063,
+        51788: 34064,
+        51789: 34066,
+        51790: 34068,
+        51791: 34069,
+        51792: 34070,
+        51793: 34072,
+        51794: 34073,
+        51795: 34075,
+        51796: 34076,
+        51797: 34077,
+        51798: 34078,
+        51799: 34080,
+        51800: 34082,
+        51801: 34083,
+        51802: 34084,
+        51803: 34085,
+        51804: 34086,
+        51805: 34087,
+        51806: 34088,
+        51807: 34089,
+        51808: 34090,
+        51809: 34093,
+        51810: 34094,
+        51811: 34095,
+        51812: 34096,
+        51813: 34097,
+        51814: 34098,
+        51815: 34099,
+        51816: 34100,
+        51817: 34101,
+        51818: 34102,
+        51819: 34110,
+        51820: 34111,
+        51821: 34112,
+        51822: 34113,
+        51823: 34114,
+        51824: 34116,
+        51825: 34117,
+        51826: 34118,
+        51827: 34119,
+        51828: 34123,
+        51829: 34124,
+        51830: 34125,
+        51831: 34126,
+        51832: 34127,
+        51833: 34128,
+        51834: 34129,
+        51835: 34130,
+        51836: 34131,
+        51837: 34132,
+        51838: 34133,
+        51840: 34135,
+        51841: 34136,
+        51842: 34138,
+        51843: 34139,
+        51844: 34140,
+        51845: 34141,
+        51846: 34143,
+        51847: 34144,
+        51848: 34145,
+        51849: 34146,
+        51850: 34147,
+        51851: 34149,
+        51852: 34150,
+        51853: 34151,
+        51854: 34153,
+        51855: 34154,
+        51856: 34155,
+        51857: 34156,
+        51858: 34157,
+        51859: 34158,
+        51860: 34159,
+        51861: 34160,
+        51862: 34161,
+        51863: 34163,
+        51864: 34165,
+        51865: 34166,
+        51866: 34167,
+        51867: 34168,
+        51868: 34172,
+        51869: 34173,
+        51870: 34175,
+        51871: 34176,
+        51872: 34177,
+        51873: 30465,
+        51874: 30427,
+        51875: 21097,
+        51876: 32988,
+        51877: 22307,
+        51878: 24072,
+        51879: 22833,
+        51880: 29422,
+        51881: 26045,
+        51882: 28287,
+        51883: 35799,
+        51884: 23608,
+        51885: 34417,
+        51886: 21313,
+        51887: 30707,
+        51888: 25342,
+        51889: 26102,
+        51890: 20160,
+        51891: 39135,
+        51892: 34432,
+        51893: 23454,
+        51894: 35782,
+        51895: 21490,
+        51896: 30690,
+        51897: 20351,
+        51898: 23630,
+        51899: 39542,
+        51900: 22987,
+        51901: 24335,
+        51902: 31034,
+        51903: 22763,
+        51904: 19990,
+        51905: 26623,
+        51906: 20107,
+        51907: 25325,
+        51908: 35475,
+        51909: 36893,
+        51910: 21183,
+        51911: 26159,
+        51912: 21980,
+        51913: 22124,
+        51914: 36866,
+        51915: 20181,
+        51916: 20365,
+        51917: 37322,
+        51918: 39280,
+        51919: 27663,
+        51920: 24066,
+        51921: 24643,
+        51922: 23460,
+        51923: 35270,
+        51924: 35797,
+        51925: 25910,
+        51926: 25163,
+        51927: 39318,
+        51928: 23432,
+        51929: 23551,
+        51930: 25480,
+        51931: 21806,
+        51932: 21463,
+        51933: 30246,
+        51934: 20861,
+        51935: 34092,
+        51936: 26530,
+        51937: 26803,
+        51938: 27530,
+        51939: 25234,
+        51940: 36755,
+        51941: 21460,
+        51942: 33298,
+        51943: 28113,
+        51944: 30095,
+        51945: 20070,
+        51946: 36174,
+        51947: 23408,
+        51948: 29087,
+        51949: 34223,
+        51950: 26257,
+        51951: 26329,
+        51952: 32626,
+        51953: 34560,
+        51954: 40653,
+        51955: 40736,
+        51956: 23646,
+        51957: 26415,
+        51958: 36848,
+        51959: 26641,
+        51960: 26463,
+        51961: 25101,
+        51962: 31446,
+        51963: 22661,
+        51964: 24246,
+        51965: 25968,
+        51966: 28465,
+        52032: 34178,
+        52033: 34179,
+        52034: 34182,
+        52035: 34184,
+        52036: 34185,
+        52037: 34186,
+        52038: 34187,
+        52039: 34188,
+        52040: 34189,
+        52041: 34190,
+        52042: 34192,
+        52043: 34193,
+        52044: 34194,
+        52045: 34195,
+        52046: 34196,
+        52047: 34197,
+        52048: 34198,
+        52049: 34199,
+        52050: 34200,
+        52051: 34201,
+        52052: 34202,
+        52053: 34205,
+        52054: 34206,
+        52055: 34207,
+        52056: 34208,
+        52057: 34209,
+        52058: 34210,
+        52059: 34211,
+        52060: 34213,
+        52061: 34214,
+        52062: 34215,
+        52063: 34217,
+        52064: 34219,
+        52065: 34220,
+        52066: 34221,
+        52067: 34225,
+        52068: 34226,
+        52069: 34227,
+        52070: 34228,
+        52071: 34229,
+        52072: 34230,
+        52073: 34232,
+        52074: 34234,
+        52075: 34235,
+        52076: 34236,
+        52077: 34237,
+        52078: 34238,
+        52079: 34239,
+        52080: 34240,
+        52081: 34242,
+        52082: 34243,
+        52083: 34244,
+        52084: 34245,
+        52085: 34246,
+        52086: 34247,
+        52087: 34248,
+        52088: 34250,
+        52089: 34251,
+        52090: 34252,
+        52091: 34253,
+        52092: 34254,
+        52093: 34257,
+        52094: 34258,
+        52096: 34260,
+        52097: 34262,
+        52098: 34263,
+        52099: 34264,
+        52100: 34265,
+        52101: 34266,
+        52102: 34267,
+        52103: 34269,
+        52104: 34270,
+        52105: 34271,
+        52106: 34272,
+        52107: 34273,
+        52108: 34274,
+        52109: 34275,
+        52110: 34277,
+        52111: 34278,
+        52112: 34279,
+        52113: 34280,
+        52114: 34282,
+        52115: 34283,
+        52116: 34284,
+        52117: 34285,
+        52118: 34286,
+        52119: 34287,
+        52120: 34288,
+        52121: 34289,
+        52122: 34290,
+        52123: 34291,
+        52124: 34292,
+        52125: 34293,
+        52126: 34294,
+        52127: 34295,
+        52128: 34296,
+        52129: 24661,
+        52130: 21047,
+        52131: 32781,
+        52132: 25684,
+        52133: 34928,
+        52134: 29993,
+        52135: 24069,
+        52136: 26643,
+        52137: 25332,
+        52138: 38684,
+        52139: 21452,
+        52140: 29245,
+        52141: 35841,
+        52142: 27700,
+        52143: 30561,
+        52144: 31246,
+        52145: 21550,
+        52146: 30636,
+        52147: 39034,
+        52148: 33308,
+        52149: 35828,
+        52150: 30805,
+        52151: 26388,
+        52152: 28865,
+        52153: 26031,
+        52154: 25749,
+        52155: 22070,
+        52156: 24605,
+        52157: 31169,
+        52158: 21496,
+        52159: 19997,
+        52160: 27515,
+        52161: 32902,
+        52162: 23546,
+        52163: 21987,
+        52164: 22235,
+        52165: 20282,
+        52166: 20284,
+        52167: 39282,
+        52168: 24051,
+        52169: 26494,
+        52170: 32824,
+        52171: 24578,
+        52172: 39042,
+        52173: 36865,
+        52174: 23435,
+        52175: 35772,
+        52176: 35829,
+        52177: 25628,
+        52178: 33368,
+        52179: 25822,
+        52180: 22013,
+        52181: 33487,
+        52182: 37221,
+        52183: 20439,
+        52184: 32032,
+        52185: 36895,
+        52186: 31903,
+        52187: 20723,
+        52188: 22609,
+        52189: 28335,
+        52190: 23487,
+        52191: 35785,
+        52192: 32899,
+        52193: 37240,
+        52194: 33948,
+        52195: 31639,
+        52196: 34429,
+        52197: 38539,
+        52198: 38543,
+        52199: 32485,
+        52200: 39635,
+        52201: 30862,
+        52202: 23681,
+        52203: 31319,
+        52204: 36930,
+        52205: 38567,
+        52206: 31071,
+        52207: 23385,
+        52208: 25439,
+        52209: 31499,
+        52210: 34001,
+        52211: 26797,
+        52212: 21766,
+        52213: 32553,
+        52214: 29712,
+        52215: 32034,
+        52216: 38145,
+        52217: 25152,
+        52218: 22604,
+        52219: 20182,
+        52220: 23427,
+        52221: 22905,
+        52222: 22612,
+        52288: 34297,
+        52289: 34298,
+        52290: 34300,
+        52291: 34301,
+        52292: 34302,
+        52293: 34304,
+        52294: 34305,
+        52295: 34306,
+        52296: 34307,
+        52297: 34308,
+        52298: 34310,
+        52299: 34311,
+        52300: 34312,
+        52301: 34313,
+        52302: 34314,
+        52303: 34315,
+        52304: 34316,
+        52305: 34317,
+        52306: 34318,
+        52307: 34319,
+        52308: 34320,
+        52309: 34322,
+        52310: 34323,
+        52311: 34324,
+        52312: 34325,
+        52313: 34327,
+        52314: 34328,
+        52315: 34329,
+        52316: 34330,
+        52317: 34331,
+        52318: 34332,
+        52319: 34333,
+        52320: 34334,
+        52321: 34335,
+        52322: 34336,
+        52323: 34337,
+        52324: 34338,
+        52325: 34339,
+        52326: 34340,
+        52327: 34341,
+        52328: 34342,
+        52329: 34344,
+        52330: 34346,
+        52331: 34347,
+        52332: 34348,
+        52333: 34349,
+        52334: 34350,
+        52335: 34351,
+        52336: 34352,
+        52337: 34353,
+        52338: 34354,
+        52339: 34355,
+        52340: 34356,
+        52341: 34357,
+        52342: 34358,
+        52343: 34359,
+        52344: 34361,
+        52345: 34362,
+        52346: 34363,
+        52347: 34365,
+        52348: 34366,
+        52349: 34367,
+        52350: 34368,
+        52352: 34369,
+        52353: 34370,
+        52354: 34371,
+        52355: 34372,
+        52356: 34373,
+        52357: 34374,
+        52358: 34375,
+        52359: 34376,
+        52360: 34377,
+        52361: 34378,
+        52362: 34379,
+        52363: 34380,
+        52364: 34386,
+        52365: 34387,
+        52366: 34389,
+        52367: 34390,
+        52368: 34391,
+        52369: 34392,
+        52370: 34393,
+        52371: 34395,
+        52372: 34396,
+        52373: 34397,
+        52374: 34399,
+        52375: 34400,
+        52376: 34401,
+        52377: 34403,
+        52378: 34404,
+        52379: 34405,
+        52380: 34406,
+        52381: 34407,
+        52382: 34408,
+        52383: 34409,
+        52384: 34410,
+        52385: 29549,
+        52386: 25374,
+        52387: 36427,
+        52388: 36367,
+        52389: 32974,
+        52390: 33492,
+        52391: 25260,
+        52392: 21488,
+        52393: 27888,
+        52394: 37214,
+        52395: 22826,
+        52396: 24577,
+        52397: 27760,
+        52398: 22349,
+        52399: 25674,
+        52400: 36138,
+        52401: 30251,
+        52402: 28393,
+        52403: 22363,
+        52404: 27264,
+        52405: 30192,
+        52406: 28525,
+        52407: 35885,
+        52408: 35848,
+        52409: 22374,
+        52410: 27631,
+        52411: 34962,
+        52412: 30899,
+        52413: 25506,
+        52414: 21497,
+        52415: 28845,
+        52416: 27748,
+        52417: 22616,
+        52418: 25642,
+        52419: 22530,
+        52420: 26848,
+        52421: 33179,
+        52422: 21776,
+        52423: 31958,
+        52424: 20504,
+        52425: 36538,
+        52426: 28108,
+        52427: 36255,
+        52428: 28907,
+        52429: 25487,
+        52430: 28059,
+        52431: 28372,
+        52432: 32486,
+        52433: 33796,
+        52434: 26691,
+        52435: 36867,
+        52436: 28120,
+        52437: 38518,
+        52438: 35752,
+        52439: 22871,
+        52440: 29305,
+        52441: 34276,
+        52442: 33150,
+        52443: 30140,
+        52444: 35466,
+        52445: 26799,
+        52446: 21076,
+        52447: 36386,
+        52448: 38161,
+        52449: 25552,
+        52450: 39064,
+        52451: 36420,
+        52452: 21884,
+        52453: 20307,
+        52454: 26367,
+        52455: 22159,
+        52456: 24789,
+        52457: 28053,
+        52458: 21059,
+        52459: 23625,
+        52460: 22825,
+        52461: 28155,
+        52462: 22635,
+        52463: 30000,
+        52464: 29980,
+        52465: 24684,
+        52466: 33300,
+        52467: 33094,
+        52468: 25361,
+        52469: 26465,
+        52470: 36834,
+        52471: 30522,
+        52472: 36339,
+        52473: 36148,
+        52474: 38081,
+        52475: 24086,
+        52476: 21381,
+        52477: 21548,
+        52478: 28867,
+        52544: 34413,
+        52545: 34415,
+        52546: 34416,
+        52547: 34418,
+        52548: 34419,
+        52549: 34420,
+        52550: 34421,
+        52551: 34422,
+        52552: 34423,
+        52553: 34424,
+        52554: 34435,
+        52555: 34436,
+        52556: 34437,
+        52557: 34438,
+        52558: 34439,
+        52559: 34440,
+        52560: 34441,
+        52561: 34446,
+        52562: 34447,
+        52563: 34448,
+        52564: 34449,
+        52565: 34450,
+        52566: 34452,
+        52567: 34454,
+        52568: 34455,
+        52569: 34456,
+        52570: 34457,
+        52571: 34458,
+        52572: 34459,
+        52573: 34462,
+        52574: 34463,
+        52575: 34464,
+        52576: 34465,
+        52577: 34466,
+        52578: 34469,
+        52579: 34470,
+        52580: 34475,
+        52581: 34477,
+        52582: 34478,
+        52583: 34482,
+        52584: 34483,
+        52585: 34487,
+        52586: 34488,
+        52587: 34489,
+        52588: 34491,
+        52589: 34492,
+        52590: 34493,
+        52591: 34494,
+        52592: 34495,
+        52593: 34497,
+        52594: 34498,
+        52595: 34499,
+        52596: 34501,
+        52597: 34504,
+        52598: 34508,
+        52599: 34509,
+        52600: 34514,
+        52601: 34515,
+        52602: 34517,
+        52603: 34518,
+        52604: 34519,
+        52605: 34522,
+        52606: 34524,
+        52608: 34525,
+        52609: 34528,
+        52610: 34529,
+        52611: 34530,
+        52612: 34531,
+        52613: 34533,
+        52614: 34534,
+        52615: 34535,
+        52616: 34536,
+        52617: 34538,
+        52618: 34539,
+        52619: 34540,
+        52620: 34543,
+        52621: 34549,
+        52622: 34550,
+        52623: 34551,
+        52624: 34554,
+        52625: 34555,
+        52626: 34556,
+        52627: 34557,
+        52628: 34559,
+        52629: 34561,
+        52630: 34564,
+        52631: 34565,
+        52632: 34566,
+        52633: 34571,
+        52634: 34572,
+        52635: 34574,
+        52636: 34575,
+        52637: 34576,
+        52638: 34577,
+        52639: 34580,
+        52640: 34582,
+        52641: 27712,
+        52642: 24311,
+        52643: 20572,
+        52644: 20141,
+        52645: 24237,
+        52646: 25402,
+        52647: 33351,
+        52648: 36890,
+        52649: 26704,
+        52650: 37230,
+        52651: 30643,
+        52652: 21516,
+        52653: 38108,
+        52654: 24420,
+        52655: 31461,
+        52656: 26742,
+        52657: 25413,
+        52658: 31570,
+        52659: 32479,
+        52660: 30171,
+        52661: 20599,
+        52662: 25237,
+        52663: 22836,
+        52664: 36879,
+        52665: 20984,
+        52666: 31171,
+        52667: 31361,
+        52668: 22270,
+        52669: 24466,
+        52670: 36884,
+        52671: 28034,
+        52672: 23648,
+        52673: 22303,
+        52674: 21520,
+        52675: 20820,
+        52676: 28237,
+        52677: 22242,
+        52678: 25512,
+        52679: 39059,
+        52680: 33151,
+        52681: 34581,
+        52682: 35114,
+        52683: 36864,
+        52684: 21534,
+        52685: 23663,
+        52686: 33216,
+        52687: 25302,
+        52688: 25176,
+        52689: 33073,
+        52690: 40501,
+        52691: 38464,
+        52692: 39534,
+        52693: 39548,
+        52694: 26925,
+        52695: 22949,
+        52696: 25299,
+        52697: 21822,
+        52698: 25366,
+        52699: 21703,
+        52700: 34521,
+        52701: 27964,
+        52702: 23043,
+        52703: 29926,
+        52704: 34972,
+        52705: 27498,
+        52706: 22806,
+        52707: 35916,
+        52708: 24367,
+        52709: 28286,
+        52710: 29609,
+        52711: 39037,
+        52712: 20024,
+        52713: 28919,
+        52714: 23436,
+        52715: 30871,
+        52716: 25405,
+        52717: 26202,
+        52718: 30358,
+        52719: 24779,
+        52720: 23451,
+        52721: 23113,
+        52722: 19975,
+        52723: 33109,
+        52724: 27754,
+        52725: 29579,
+        52726: 20129,
+        52727: 26505,
+        52728: 32593,
+        52729: 24448,
+        52730: 26106,
+        52731: 26395,
+        52732: 24536,
+        52733: 22916,
+        52734: 23041,
+        52800: 34585,
+        52801: 34587,
+        52802: 34589,
+        52803: 34591,
+        52804: 34592,
+        52805: 34596,
+        52806: 34598,
+        52807: 34599,
+        52808: 34600,
+        52809: 34602,
+        52810: 34603,
+        52811: 34604,
+        52812: 34605,
+        52813: 34607,
+        52814: 34608,
+        52815: 34610,
+        52816: 34611,
+        52817: 34613,
+        52818: 34614,
+        52819: 34616,
+        52820: 34617,
+        52821: 34618,
+        52822: 34620,
+        52823: 34621,
+        52824: 34624,
+        52825: 34625,
+        52826: 34626,
+        52827: 34627,
+        52828: 34628,
+        52829: 34629,
+        52830: 34630,
+        52831: 34634,
+        52832: 34635,
+        52833: 34637,
+        52834: 34639,
+        52835: 34640,
+        52836: 34641,
+        52837: 34642,
+        52838: 34644,
+        52839: 34645,
+        52840: 34646,
+        52841: 34648,
+        52842: 34650,
+        52843: 34651,
+        52844: 34652,
+        52845: 34653,
+        52846: 34654,
+        52847: 34655,
+        52848: 34657,
+        52849: 34658,
+        52850: 34662,
+        52851: 34663,
+        52852: 34664,
+        52853: 34665,
+        52854: 34666,
+        52855: 34667,
+        52856: 34668,
+        52857: 34669,
+        52858: 34671,
+        52859: 34673,
+        52860: 34674,
+        52861: 34675,
+        52862: 34677,
+        52864: 34679,
+        52865: 34680,
+        52866: 34681,
+        52867: 34682,
+        52868: 34687,
+        52869: 34688,
+        52870: 34689,
+        52871: 34692,
+        52872: 34694,
+        52873: 34695,
+        52874: 34697,
+        52875: 34698,
+        52876: 34700,
+        52877: 34702,
+        52878: 34703,
+        52879: 34704,
+        52880: 34705,
+        52881: 34706,
+        52882: 34708,
+        52883: 34709,
+        52884: 34710,
+        52885: 34712,
+        52886: 34713,
+        52887: 34714,
+        52888: 34715,
+        52889: 34716,
+        52890: 34717,
+        52891: 34718,
+        52892: 34720,
+        52893: 34721,
+        52894: 34722,
+        52895: 34723,
+        52896: 34724,
+        52897: 24013,
+        52898: 24494,
+        52899: 21361,
+        52900: 38886,
+        52901: 36829,
+        52902: 26693,
+        52903: 22260,
+        52904: 21807,
+        52905: 24799,
+        52906: 20026,
+        52907: 28493,
+        52908: 32500,
+        52909: 33479,
+        52910: 33806,
+        52911: 22996,
+        52912: 20255,
+        52913: 20266,
+        52914: 23614,
+        52915: 32428,
+        52916: 26410,
+        52917: 34074,
+        52918: 21619,
+        52919: 30031,
+        52920: 32963,
+        52921: 21890,
+        52922: 39759,
+        52923: 20301,
+        52924: 28205,
+        52925: 35859,
+        52926: 23561,
+        52927: 24944,
+        52928: 21355,
+        52929: 30239,
+        52930: 28201,
+        52931: 34442,
+        52932: 25991,
+        52933: 38395,
+        52934: 32441,
+        52935: 21563,
+        52936: 31283,
+        52937: 32010,
+        52938: 38382,
+        52939: 21985,
+        52940: 32705,
+        52941: 29934,
+        52942: 25373,
+        52943: 34583,
+        52944: 28065,
+        52945: 31389,
+        52946: 25105,
+        52947: 26017,
+        52948: 21351,
+        52949: 25569,
+        52950: 27779,
+        52951: 24043,
+        52952: 21596,
+        52953: 38056,
+        52954: 20044,
+        52955: 27745,
+        52956: 35820,
+        52957: 23627,
+        52958: 26080,
+        52959: 33436,
+        52960: 26791,
+        52961: 21566,
+        52962: 21556,
+        52963: 27595,
+        52964: 27494,
+        52965: 20116,
+        52966: 25410,
+        52967: 21320,
+        52968: 33310,
+        52969: 20237,
+        52970: 20398,
+        52971: 22366,
+        52972: 25098,
+        52973: 38654,
+        52974: 26212,
+        52975: 29289,
+        52976: 21247,
+        52977: 21153,
+        52978: 24735,
+        52979: 35823,
+        52980: 26132,
+        52981: 29081,
+        52982: 26512,
+        52983: 35199,
+        52984: 30802,
+        52985: 30717,
+        52986: 26224,
+        52987: 22075,
+        52988: 21560,
+        52989: 38177,
+        52990: 29306,
+        53056: 34725,
+        53057: 34726,
+        53058: 34727,
+        53059: 34729,
+        53060: 34730,
+        53061: 34734,
+        53062: 34736,
+        53063: 34737,
+        53064: 34738,
+        53065: 34740,
+        53066: 34742,
+        53067: 34743,
+        53068: 34744,
+        53069: 34745,
+        53070: 34747,
+        53071: 34748,
+        53072: 34750,
+        53073: 34751,
+        53074: 34753,
+        53075: 34754,
+        53076: 34755,
+        53077: 34756,
+        53078: 34757,
+        53079: 34759,
+        53080: 34760,
+        53081: 34761,
+        53082: 34764,
+        53083: 34765,
+        53084: 34766,
+        53085: 34767,
+        53086: 34768,
+        53087: 34772,
+        53088: 34773,
+        53089: 34774,
+        53090: 34775,
+        53091: 34776,
+        53092: 34777,
+        53093: 34778,
+        53094: 34780,
+        53095: 34781,
+        53096: 34782,
+        53097: 34783,
+        53098: 34785,
+        53099: 34786,
+        53100: 34787,
+        53101: 34788,
+        53102: 34790,
+        53103: 34791,
+        53104: 34792,
+        53105: 34793,
+        53106: 34795,
+        53107: 34796,
+        53108: 34797,
+        53109: 34799,
+        53110: 34800,
+        53111: 34801,
+        53112: 34802,
+        53113: 34803,
+        53114: 34804,
+        53115: 34805,
+        53116: 34806,
+        53117: 34807,
+        53118: 34808,
+        53120: 34810,
+        53121: 34811,
+        53122: 34812,
+        53123: 34813,
+        53124: 34815,
+        53125: 34816,
+        53126: 34817,
+        53127: 34818,
+        53128: 34820,
+        53129: 34821,
+        53130: 34822,
+        53131: 34823,
+        53132: 34824,
+        53133: 34825,
+        53134: 34827,
+        53135: 34828,
+        53136: 34829,
+        53137: 34830,
+        53138: 34831,
+        53139: 34832,
+        53140: 34833,
+        53141: 34834,
+        53142: 34836,
+        53143: 34839,
+        53144: 34840,
+        53145: 34841,
+        53146: 34842,
+        53147: 34844,
+        53148: 34845,
+        53149: 34846,
+        53150: 34847,
+        53151: 34848,
+        53152: 34851,
+        53153: 31232,
+        53154: 24687,
+        53155: 24076,
+        53156: 24713,
+        53157: 33181,
+        53158: 22805,
+        53159: 24796,
+        53160: 29060,
+        53161: 28911,
+        53162: 28330,
+        53163: 27728,
+        53164: 29312,
+        53165: 27268,
+        53166: 34989,
+        53167: 24109,
+        53168: 20064,
+        53169: 23219,
+        53170: 21916,
+        53171: 38115,
+        53172: 27927,
+        53173: 31995,
+        53174: 38553,
+        53175: 25103,
+        53176: 32454,
+        53177: 30606,
+        53178: 34430,
+        53179: 21283,
+        53180: 38686,
+        53181: 36758,
+        53182: 26247,
+        53183: 23777,
+        53184: 20384,
+        53185: 29421,
+        53186: 19979,
+        53187: 21414,
+        53188: 22799,
+        53189: 21523,
+        53190: 25472,
+        53191: 38184,
+        53192: 20808,
+        53193: 20185,
+        53194: 40092,
+        53195: 32420,
+        53196: 21688,
+        53197: 36132,
+        53198: 34900,
+        53199: 33335,
+        53200: 38386,
+        53201: 28046,
+        53202: 24358,
+        53203: 23244,
+        53204: 26174,
+        53205: 38505,
+        53206: 29616,
+        53207: 29486,
+        53208: 21439,
+        53209: 33146,
+        53210: 39301,
+        53211: 32673,
+        53212: 23466,
+        53213: 38519,
+        53214: 38480,
+        53215: 32447,
+        53216: 30456,
+        53217: 21410,
+        53218: 38262,
+        53219: 39321,
+        53220: 31665,
+        53221: 35140,
+        53222: 28248,
+        53223: 20065,
+        53224: 32724,
+        53225: 31077,
+        53226: 35814,
+        53227: 24819,
+        53228: 21709,
+        53229: 20139,
+        53230: 39033,
+        53231: 24055,
+        53232: 27233,
+        53233: 20687,
+        53234: 21521,
+        53235: 35937,
+        53236: 33831,
+        53237: 30813,
+        53238: 38660,
+        53239: 21066,
+        53240: 21742,
+        53241: 22179,
+        53242: 38144,
+        53243: 28040,
+        53244: 23477,
+        53245: 28102,
+        53246: 26195,
+        53312: 34852,
+        53313: 34853,
+        53314: 34854,
+        53315: 34855,
+        53316: 34856,
+        53317: 34857,
+        53318: 34858,
+        53319: 34859,
+        53320: 34860,
+        53321: 34861,
+        53322: 34862,
+        53323: 34863,
+        53324: 34864,
+        53325: 34865,
+        53326: 34867,
+        53327: 34868,
+        53328: 34869,
+        53329: 34870,
+        53330: 34871,
+        53331: 34872,
+        53332: 34874,
+        53333: 34875,
+        53334: 34877,
+        53335: 34878,
+        53336: 34879,
+        53337: 34881,
+        53338: 34882,
+        53339: 34883,
+        53340: 34886,
+        53341: 34887,
+        53342: 34888,
+        53343: 34889,
+        53344: 34890,
+        53345: 34891,
+        53346: 34894,
+        53347: 34895,
+        53348: 34896,
+        53349: 34897,
+        53350: 34898,
+        53351: 34899,
+        53352: 34901,
+        53353: 34902,
+        53354: 34904,
+        53355: 34906,
+        53356: 34907,
+        53357: 34908,
+        53358: 34909,
+        53359: 34910,
+        53360: 34911,
+        53361: 34912,
+        53362: 34918,
+        53363: 34919,
+        53364: 34922,
+        53365: 34925,
+        53366: 34927,
+        53367: 34929,
+        53368: 34931,
+        53369: 34932,
+        53370: 34933,
+        53371: 34934,
+        53372: 34936,
+        53373: 34937,
+        53374: 34938,
+        53376: 34939,
+        53377: 34940,
+        53378: 34944,
+        53379: 34947,
+        53380: 34950,
+        53381: 34951,
+        53382: 34953,
+        53383: 34954,
+        53384: 34956,
+        53385: 34958,
+        53386: 34959,
+        53387: 34960,
+        53388: 34961,
+        53389: 34963,
+        53390: 34964,
+        53391: 34965,
+        53392: 34967,
+        53393: 34968,
+        53394: 34969,
+        53395: 34970,
+        53396: 34971,
+        53397: 34973,
+        53398: 34974,
+        53399: 34975,
+        53400: 34976,
+        53401: 34977,
+        53402: 34979,
+        53403: 34981,
+        53404: 34982,
+        53405: 34983,
+        53406: 34984,
+        53407: 34985,
+        53408: 34986,
+        53409: 23567,
+        53410: 23389,
+        53411: 26657,
+        53412: 32918,
+        53413: 21880,
+        53414: 31505,
+        53415: 25928,
+        53416: 26964,
+        53417: 20123,
+        53418: 27463,
+        53419: 34638,
+        53420: 38795,
+        53421: 21327,
+        53422: 25375,
+        53423: 25658,
+        53424: 37034,
+        53425: 26012,
+        53426: 32961,
+        53427: 35856,
+        53428: 20889,
+        53429: 26800,
+        53430: 21368,
+        53431: 34809,
+        53432: 25032,
+        53433: 27844,
+        53434: 27899,
+        53435: 35874,
+        53436: 23633,
+        53437: 34218,
+        53438: 33455,
+        53439: 38156,
+        53440: 27427,
+        53441: 36763,
+        53442: 26032,
+        53443: 24571,
+        53444: 24515,
+        53445: 20449,
+        53446: 34885,
+        53447: 26143,
+        53448: 33125,
+        53449: 29481,
+        53450: 24826,
+        53451: 20852,
+        53452: 21009,
+        53453: 22411,
+        53454: 24418,
+        53455: 37026,
+        53456: 34892,
+        53457: 37266,
+        53458: 24184,
+        53459: 26447,
+        53460: 24615,
+        53461: 22995,
+        53462: 20804,
+        53463: 20982,
+        53464: 33016,
+        53465: 21256,
+        53466: 27769,
+        53467: 38596,
+        53468: 29066,
+        53469: 20241,
+        53470: 20462,
+        53471: 32670,
+        53472: 26429,
+        53473: 21957,
+        53474: 38152,
+        53475: 31168,
+        53476: 34966,
+        53477: 32483,
+        53478: 22687,
+        53479: 25100,
+        53480: 38656,
+        53481: 34394,
+        53482: 22040,
+        53483: 39035,
+        53484: 24464,
+        53485: 35768,
+        53486: 33988,
+        53487: 37207,
+        53488: 21465,
+        53489: 26093,
+        53490: 24207,
+        53491: 30044,
+        53492: 24676,
+        53493: 32110,
+        53494: 23167,
+        53495: 32490,
+        53496: 32493,
+        53497: 36713,
+        53498: 21927,
+        53499: 23459,
+        53500: 24748,
+        53501: 26059,
+        53502: 29572,
+        53568: 34988,
+        53569: 34990,
+        53570: 34991,
+        53571: 34992,
+        53572: 34994,
+        53573: 34995,
+        53574: 34996,
+        53575: 34997,
+        53576: 34998,
+        53577: 35000,
+        53578: 35001,
+        53579: 35002,
+        53580: 35003,
+        53581: 35005,
+        53582: 35006,
+        53583: 35007,
+        53584: 35008,
+        53585: 35011,
+        53586: 35012,
+        53587: 35015,
+        53588: 35016,
+        53589: 35018,
+        53590: 35019,
+        53591: 35020,
+        53592: 35021,
+        53593: 35023,
+        53594: 35024,
+        53595: 35025,
+        53596: 35027,
+        53597: 35030,
+        53598: 35031,
+        53599: 35034,
+        53600: 35035,
+        53601: 35036,
+        53602: 35037,
+        53603: 35038,
+        53604: 35040,
+        53605: 35041,
+        53606: 35046,
+        53607: 35047,
+        53608: 35049,
+        53609: 35050,
+        53610: 35051,
+        53611: 35052,
+        53612: 35053,
+        53613: 35054,
+        53614: 35055,
+        53615: 35058,
+        53616: 35061,
+        53617: 35062,
+        53618: 35063,
+        53619: 35066,
+        53620: 35067,
+        53621: 35069,
+        53622: 35071,
+        53623: 35072,
+        53624: 35073,
+        53625: 35075,
+        53626: 35076,
+        53627: 35077,
+        53628: 35078,
+        53629: 35079,
+        53630: 35080,
+        53632: 35081,
+        53633: 35083,
+        53634: 35084,
+        53635: 35085,
+        53636: 35086,
+        53637: 35087,
+        53638: 35089,
+        53639: 35092,
+        53640: 35093,
+        53641: 35094,
+        53642: 35095,
+        53643: 35096,
+        53644: 35100,
+        53645: 35101,
+        53646: 35102,
+        53647: 35103,
+        53648: 35104,
+        53649: 35106,
+        53650: 35107,
+        53651: 35108,
+        53652: 35110,
+        53653: 35111,
+        53654: 35112,
+        53655: 35113,
+        53656: 35116,
+        53657: 35117,
+        53658: 35118,
+        53659: 35119,
+        53660: 35121,
+        53661: 35122,
+        53662: 35123,
+        53663: 35125,
+        53664: 35127,
+        53665: 36873,
+        53666: 30307,
+        53667: 30505,
+        53668: 32474,
+        53669: 38772,
+        53670: 34203,
+        53671: 23398,
+        53672: 31348,
+        53673: 38634,
+        53674: 34880,
+        53675: 21195,
+        53676: 29071,
+        53677: 24490,
+        53678: 26092,
+        53679: 35810,
+        53680: 23547,
+        53681: 39535,
+        53682: 24033,
+        53683: 27529,
+        53684: 27739,
+        53685: 35757,
+        53686: 35759,
+        53687: 36874,
+        53688: 36805,
+        53689: 21387,
+        53690: 25276,
+        53691: 40486,
+        53692: 40493,
+        53693: 21568,
+        53694: 20011,
+        53695: 33469,
+        53696: 29273,
+        53697: 34460,
+        53698: 23830,
+        53699: 34905,
+        53700: 28079,
+        53701: 38597,
+        53702: 21713,
+        53703: 20122,
+        53704: 35766,
+        53705: 28937,
+        53706: 21693,
+        53707: 38409,
+        53708: 28895,
+        53709: 28153,
+        53710: 30416,
+        53711: 20005,
+        53712: 30740,
+        53713: 34578,
+        53714: 23721,
+        53715: 24310,
+        53716: 35328,
+        53717: 39068,
+        53718: 38414,
+        53719: 28814,
+        53720: 27839,
+        53721: 22852,
+        53722: 25513,
+        53723: 30524,
+        53724: 34893,
+        53725: 28436,
+        53726: 33395,
+        53727: 22576,
+        53728: 29141,
+        53729: 21388,
+        53730: 30746,
+        53731: 38593,
+        53732: 21761,
+        53733: 24422,
+        53734: 28976,
+        53735: 23476,
+        53736: 35866,
+        53737: 39564,
+        53738: 27523,
+        53739: 22830,
+        53740: 40495,
+        53741: 31207,
+        53742: 26472,
+        53743: 25196,
+        53744: 20335,
+        53745: 30113,
+        53746: 32650,
+        53747: 27915,
+        53748: 38451,
+        53749: 27687,
+        53750: 20208,
+        53751: 30162,
+        53752: 20859,
+        53753: 26679,
+        53754: 28478,
+        53755: 36992,
+        53756: 33136,
+        53757: 22934,
+        53758: 29814,
+        53824: 35128,
+        53825: 35129,
+        53826: 35130,
+        53827: 35131,
+        53828: 35132,
+        53829: 35133,
+        53830: 35134,
+        53831: 35135,
+        53832: 35136,
+        53833: 35138,
+        53834: 35139,
+        53835: 35141,
+        53836: 35142,
+        53837: 35143,
+        53838: 35144,
+        53839: 35145,
+        53840: 35146,
+        53841: 35147,
+        53842: 35148,
+        53843: 35149,
+        53844: 35150,
+        53845: 35151,
+        53846: 35152,
+        53847: 35153,
+        53848: 35154,
+        53849: 35155,
+        53850: 35156,
+        53851: 35157,
+        53852: 35158,
+        53853: 35159,
+        53854: 35160,
+        53855: 35161,
+        53856: 35162,
+        53857: 35163,
+        53858: 35164,
+        53859: 35165,
+        53860: 35168,
+        53861: 35169,
+        53862: 35170,
+        53863: 35171,
+        53864: 35172,
+        53865: 35173,
+        53866: 35175,
+        53867: 35176,
+        53868: 35177,
+        53869: 35178,
+        53870: 35179,
+        53871: 35180,
+        53872: 35181,
+        53873: 35182,
+        53874: 35183,
+        53875: 35184,
+        53876: 35185,
+        53877: 35186,
+        53878: 35187,
+        53879: 35188,
+        53880: 35189,
+        53881: 35190,
+        53882: 35191,
+        53883: 35192,
+        53884: 35193,
+        53885: 35194,
+        53886: 35196,
+        53888: 35197,
+        53889: 35198,
+        53890: 35200,
+        53891: 35202,
+        53892: 35204,
+        53893: 35205,
+        53894: 35207,
+        53895: 35208,
+        53896: 35209,
+        53897: 35210,
+        53898: 35211,
+        53899: 35212,
+        53900: 35213,
+        53901: 35214,
+        53902: 35215,
+        53903: 35216,
+        53904: 35217,
+        53905: 35218,
+        53906: 35219,
+        53907: 35220,
+        53908: 35221,
+        53909: 35222,
+        53910: 35223,
+        53911: 35224,
+        53912: 35225,
+        53913: 35226,
+        53914: 35227,
+        53915: 35228,
+        53916: 35229,
+        53917: 35230,
+        53918: 35231,
+        53919: 35232,
+        53920: 35233,
+        53921: 25671,
+        53922: 23591,
+        53923: 36965,
+        53924: 31377,
+        53925: 35875,
+        53926: 23002,
+        53927: 21676,
+        53928: 33280,
+        53929: 33647,
+        53930: 35201,
+        53931: 32768,
+        53932: 26928,
+        53933: 22094,
+        53934: 32822,
+        53935: 29239,
+        53936: 37326,
+        53937: 20918,
+        53938: 20063,
+        53939: 39029,
+        53940: 25494,
+        53941: 19994,
+        53942: 21494,
+        53943: 26355,
+        53944: 33099,
+        53945: 22812,
+        53946: 28082,
+        53947: 19968,
+        53948: 22777,
+        53949: 21307,
+        53950: 25558,
+        53951: 38129,
+        53952: 20381,
+        53953: 20234,
+        53954: 34915,
+        53955: 39056,
+        53956: 22839,
+        53957: 36951,
+        53958: 31227,
+        53959: 20202,
+        53960: 33008,
+        53961: 30097,
+        53962: 27778,
+        53963: 23452,
+        53964: 23016,
+        53965: 24413,
+        53966: 26885,
+        53967: 34433,
+        53968: 20506,
+        53969: 24050,
+        53970: 20057,
+        53971: 30691,
+        53972: 20197,
+        53973: 33402,
+        53974: 25233,
+        53975: 26131,
+        53976: 37009,
+        53977: 23673,
+        53978: 20159,
+        53979: 24441,
+        53980: 33222,
+        53981: 36920,
+        53982: 32900,
+        53983: 30123,
+        53984: 20134,
+        53985: 35028,
+        53986: 24847,
+        53987: 27589,
+        53988: 24518,
+        53989: 20041,
+        53990: 30410,
+        53991: 28322,
+        53992: 35811,
+        53993: 35758,
+        53994: 35850,
+        53995: 35793,
+        53996: 24322,
+        53997: 32764,
+        53998: 32716,
+        53999: 32462,
+        54000: 33589,
+        54001: 33643,
+        54002: 22240,
+        54003: 27575,
+        54004: 38899,
+        54005: 38452,
+        54006: 23035,
+        54007: 21535,
+        54008: 38134,
+        54009: 28139,
+        54010: 23493,
+        54011: 39278,
+        54012: 23609,
+        54013: 24341,
+        54014: 38544,
+        54080: 35234,
+        54081: 35235,
+        54082: 35236,
+        54083: 35237,
+        54084: 35238,
+        54085: 35239,
+        54086: 35240,
+        54087: 35241,
+        54088: 35242,
+        54089: 35243,
+        54090: 35244,
+        54091: 35245,
+        54092: 35246,
+        54093: 35247,
+        54094: 35248,
+        54095: 35249,
+        54096: 35250,
+        54097: 35251,
+        54098: 35252,
+        54099: 35253,
+        54100: 35254,
+        54101: 35255,
+        54102: 35256,
+        54103: 35257,
+        54104: 35258,
+        54105: 35259,
+        54106: 35260,
+        54107: 35261,
+        54108: 35262,
+        54109: 35263,
+        54110: 35264,
+        54111: 35267,
+        54112: 35277,
+        54113: 35283,
+        54114: 35284,
+        54115: 35285,
+        54116: 35287,
+        54117: 35288,
+        54118: 35289,
+        54119: 35291,
+        54120: 35293,
+        54121: 35295,
+        54122: 35296,
+        54123: 35297,
+        54124: 35298,
+        54125: 35300,
+        54126: 35303,
+        54127: 35304,
+        54128: 35305,
+        54129: 35306,
+        54130: 35308,
+        54131: 35309,
+        54132: 35310,
+        54133: 35312,
+        54134: 35313,
+        54135: 35314,
+        54136: 35316,
+        54137: 35317,
+        54138: 35318,
+        54139: 35319,
+        54140: 35320,
+        54141: 35321,
+        54142: 35322,
+        54144: 35323,
+        54145: 35324,
+        54146: 35325,
+        54147: 35326,
+        54148: 35327,
+        54149: 35329,
+        54150: 35330,
+        54151: 35331,
+        54152: 35332,
+        54153: 35333,
+        54154: 35334,
+        54155: 35336,
+        54156: 35337,
+        54157: 35338,
+        54158: 35339,
+        54159: 35340,
+        54160: 35341,
+        54161: 35342,
+        54162: 35343,
+        54163: 35344,
+        54164: 35345,
+        54165: 35346,
+        54166: 35347,
+        54167: 35348,
+        54168: 35349,
+        54169: 35350,
+        54170: 35351,
+        54171: 35352,
+        54172: 35353,
+        54173: 35354,
+        54174: 35355,
+        54175: 35356,
+        54176: 35357,
+        54177: 21360,
+        54178: 33521,
+        54179: 27185,
+        54180: 23156,
+        54181: 40560,
+        54182: 24212,
+        54183: 32552,
+        54184: 33721,
+        54185: 33828,
+        54186: 33829,
+        54187: 33639,
+        54188: 34631,
+        54189: 36814,
+        54190: 36194,
+        54191: 30408,
+        54192: 24433,
+        54193: 39062,
+        54194: 30828,
+        54195: 26144,
+        54196: 21727,
+        54197: 25317,
+        54198: 20323,
+        54199: 33219,
+        54200: 30152,
+        54201: 24248,
+        54202: 38605,
+        54203: 36362,
+        54204: 34553,
+        54205: 21647,
+        54206: 27891,
+        54207: 28044,
+        54208: 27704,
+        54209: 24703,
+        54210: 21191,
+        54211: 29992,
+        54212: 24189,
+        54213: 20248,
+        54214: 24736,
+        54215: 24551,
+        54216: 23588,
+        54217: 30001,
+        54218: 37038,
+        54219: 38080,
+        54220: 29369,
+        54221: 27833,
+        54222: 28216,
+        54223: 37193,
+        54224: 26377,
+        54225: 21451,
+        54226: 21491,
+        54227: 20305,
+        54228: 37321,
+        54229: 35825,
+        54230: 21448,
+        54231: 24188,
+        54232: 36802,
+        54233: 28132,
+        54234: 20110,
+        54235: 30402,
+        54236: 27014,
+        54237: 34398,
+        54238: 24858,
+        54239: 33286,
+        54240: 20313,
+        54241: 20446,
+        54242: 36926,
+        54243: 40060,
+        54244: 24841,
+        54245: 28189,
+        54246: 28180,
+        54247: 38533,
+        54248: 20104,
+        54249: 23089,
+        54250: 38632,
+        54251: 19982,
+        54252: 23679,
+        54253: 31161,
+        54254: 23431,
+        54255: 35821,
+        54256: 32701,
+        54257: 29577,
+        54258: 22495,
+        54259: 33419,
+        54260: 37057,
+        54261: 21505,
+        54262: 36935,
+        54263: 21947,
+        54264: 23786,
+        54265: 24481,
+        54266: 24840,
+        54267: 27442,
+        54268: 29425,
+        54269: 32946,
+        54270: 35465,
+        54336: 35358,
+        54337: 35359,
+        54338: 35360,
+        54339: 35361,
+        54340: 35362,
+        54341: 35363,
+        54342: 35364,
+        54343: 35365,
+        54344: 35366,
+        54345: 35367,
+        54346: 35368,
+        54347: 35369,
+        54348: 35370,
+        54349: 35371,
+        54350: 35372,
+        54351: 35373,
+        54352: 35374,
+        54353: 35375,
+        54354: 35376,
+        54355: 35377,
+        54356: 35378,
+        54357: 35379,
+        54358: 35380,
+        54359: 35381,
+        54360: 35382,
+        54361: 35383,
+        54362: 35384,
+        54363: 35385,
+        54364: 35386,
+        54365: 35387,
+        54366: 35388,
+        54367: 35389,
+        54368: 35391,
+        54369: 35392,
+        54370: 35393,
+        54371: 35394,
+        54372: 35395,
+        54373: 35396,
+        54374: 35397,
+        54375: 35398,
+        54376: 35399,
+        54377: 35401,
+        54378: 35402,
+        54379: 35403,
+        54380: 35404,
+        54381: 35405,
+        54382: 35406,
+        54383: 35407,
+        54384: 35408,
+        54385: 35409,
+        54386: 35410,
+        54387: 35411,
+        54388: 35412,
+        54389: 35413,
+        54390: 35414,
+        54391: 35415,
+        54392: 35416,
+        54393: 35417,
+        54394: 35418,
+        54395: 35419,
+        54396: 35420,
+        54397: 35421,
+        54398: 35422,
+        54400: 35423,
+        54401: 35424,
+        54402: 35425,
+        54403: 35426,
+        54404: 35427,
+        54405: 35428,
+        54406: 35429,
+        54407: 35430,
+        54408: 35431,
+        54409: 35432,
+        54410: 35433,
+        54411: 35434,
+        54412: 35435,
+        54413: 35436,
+        54414: 35437,
+        54415: 35438,
+        54416: 35439,
+        54417: 35440,
+        54418: 35441,
+        54419: 35442,
+        54420: 35443,
+        54421: 35444,
+        54422: 35445,
+        54423: 35446,
+        54424: 35447,
+        54425: 35448,
+        54426: 35450,
+        54427: 35451,
+        54428: 35452,
+        54429: 35453,
+        54430: 35454,
+        54431: 35455,
+        54432: 35456,
+        54433: 28020,
+        54434: 23507,
+        54435: 35029,
+        54436: 39044,
+        54437: 35947,
+        54438: 39533,
+        54439: 40499,
+        54440: 28170,
+        54441: 20900,
+        54442: 20803,
+        54443: 22435,
+        54444: 34945,
+        54445: 21407,
+        54446: 25588,
+        54447: 36757,
+        54448: 22253,
+        54449: 21592,
+        54450: 22278,
+        54451: 29503,
+        54452: 28304,
+        54453: 32536,
+        54454: 36828,
+        54455: 33489,
+        54456: 24895,
+        54457: 24616,
+        54458: 38498,
+        54459: 26352,
+        54460: 32422,
+        54461: 36234,
+        54462: 36291,
+        54463: 38053,
+        54464: 23731,
+        54465: 31908,
+        54466: 26376,
+        54467: 24742,
+        54468: 38405,
+        54469: 32792,
+        54470: 20113,
+        54471: 37095,
+        54472: 21248,
+        54473: 38504,
+        54474: 20801,
+        54475: 36816,
+        54476: 34164,
+        54477: 37213,
+        54478: 26197,
+        54479: 38901,
+        54480: 23381,
+        54481: 21277,
+        54482: 30776,
+        54483: 26434,
+        54484: 26685,
+        54485: 21705,
+        54486: 28798,
+        54487: 23472,
+        54488: 36733,
+        54489: 20877,
+        54490: 22312,
+        54491: 21681,
+        54492: 25874,
+        54493: 26242,
+        54494: 36190,
+        54495: 36163,
+        54496: 33039,
+        54497: 33900,
+        54498: 36973,
+        54499: 31967,
+        54500: 20991,
+        54501: 34299,
+        54502: 26531,
+        54503: 26089,
+        54504: 28577,
+        54505: 34468,
+        54506: 36481,
+        54507: 22122,
+        54508: 36896,
+        54509: 30338,
+        54510: 28790,
+        54511: 29157,
+        54512: 36131,
+        54513: 25321,
+        54514: 21017,
+        54515: 27901,
+        54516: 36156,
+        54517: 24590,
+        54518: 22686,
+        54519: 24974,
+        54520: 26366,
+        54521: 36192,
+        54522: 25166,
+        54523: 21939,
+        54524: 28195,
+        54525: 26413,
+        54526: 36711,
+        54592: 35457,
+        54593: 35458,
+        54594: 35459,
+        54595: 35460,
+        54596: 35461,
+        54597: 35462,
+        54598: 35463,
+        54599: 35464,
+        54600: 35467,
+        54601: 35468,
+        54602: 35469,
+        54603: 35470,
+        54604: 35471,
+        54605: 35472,
+        54606: 35473,
+        54607: 35474,
+        54608: 35476,
+        54609: 35477,
+        54610: 35478,
+        54611: 35479,
+        54612: 35480,
+        54613: 35481,
+        54614: 35482,
+        54615: 35483,
+        54616: 35484,
+        54617: 35485,
+        54618: 35486,
+        54619: 35487,
+        54620: 35488,
+        54621: 35489,
+        54622: 35490,
+        54623: 35491,
+        54624: 35492,
+        54625: 35493,
+        54626: 35494,
+        54627: 35495,
+        54628: 35496,
+        54629: 35497,
+        54630: 35498,
+        54631: 35499,
+        54632: 35500,
+        54633: 35501,
+        54634: 35502,
+        54635: 35503,
+        54636: 35504,
+        54637: 35505,
+        54638: 35506,
+        54639: 35507,
+        54640: 35508,
+        54641: 35509,
+        54642: 35510,
+        54643: 35511,
+        54644: 35512,
+        54645: 35513,
+        54646: 35514,
+        54647: 35515,
+        54648: 35516,
+        54649: 35517,
+        54650: 35518,
+        54651: 35519,
+        54652: 35520,
+        54653: 35521,
+        54654: 35522,
+        54656: 35523,
+        54657: 35524,
+        54658: 35525,
+        54659: 35526,
+        54660: 35527,
+        54661: 35528,
+        54662: 35529,
+        54663: 35530,
+        54664: 35531,
+        54665: 35532,
+        54666: 35533,
+        54667: 35534,
+        54668: 35535,
+        54669: 35536,
+        54670: 35537,
+        54671: 35538,
+        54672: 35539,
+        54673: 35540,
+        54674: 35541,
+        54675: 35542,
+        54676: 35543,
+        54677: 35544,
+        54678: 35545,
+        54679: 35546,
+        54680: 35547,
+        54681: 35548,
+        54682: 35549,
+        54683: 35550,
+        54684: 35551,
+        54685: 35552,
+        54686: 35553,
+        54687: 35554,
+        54688: 35555,
+        54689: 38113,
+        54690: 38392,
+        54691: 30504,
+        54692: 26629,
+        54693: 27048,
+        54694: 21643,
+        54695: 20045,
+        54696: 28856,
+        54697: 35784,
+        54698: 25688,
+        54699: 25995,
+        54700: 23429,
+        54701: 31364,
+        54702: 20538,
+        54703: 23528,
+        54704: 30651,
+        54705: 27617,
+        54706: 35449,
+        54707: 31896,
+        54708: 27838,
+        54709: 30415,
+        54710: 26025,
+        54711: 36759,
+        54712: 23853,
+        54713: 23637,
+        54714: 34360,
+        54715: 26632,
+        54716: 21344,
+        54717: 25112,
+        54718: 31449,
+        54719: 28251,
+        54720: 32509,
+        54721: 27167,
+        54722: 31456,
+        54723: 24432,
+        54724: 28467,
+        54725: 24352,
+        54726: 25484,
+        54727: 28072,
+        54728: 26454,
+        54729: 19976,
+        54730: 24080,
+        54731: 36134,
+        54732: 20183,
+        54733: 32960,
+        54734: 30260,
+        54735: 38556,
+        54736: 25307,
+        54737: 26157,
+        54738: 25214,
+        54739: 27836,
+        54740: 36213,
+        54741: 29031,
+        54742: 32617,
+        54743: 20806,
+        54744: 32903,
+        54745: 21484,
+        54746: 36974,
+        54747: 25240,
+        54748: 21746,
+        54749: 34544,
+        54750: 36761,
+        54751: 32773,
+        54752: 38167,
+        54753: 34071,
+        54754: 36825,
+        54755: 27993,
+        54756: 29645,
+        54757: 26015,
+        54758: 30495,
+        54759: 29956,
+        54760: 30759,
+        54761: 33275,
+        54762: 36126,
+        54763: 38024,
+        54764: 20390,
+        54765: 26517,
+        54766: 30137,
+        54767: 35786,
+        54768: 38663,
+        54769: 25391,
+        54770: 38215,
+        54771: 38453,
+        54772: 33976,
+        54773: 25379,
+        54774: 30529,
+        54775: 24449,
+        54776: 29424,
+        54777: 20105,
+        54778: 24596,
+        54779: 25972,
+        54780: 25327,
+        54781: 27491,
+        54782: 25919,
+        54848: 35556,
+        54849: 35557,
+        54850: 35558,
+        54851: 35559,
+        54852: 35560,
+        54853: 35561,
+        54854: 35562,
+        54855: 35563,
+        54856: 35564,
+        54857: 35565,
+        54858: 35566,
+        54859: 35567,
+        54860: 35568,
+        54861: 35569,
+        54862: 35570,
+        54863: 35571,
+        54864: 35572,
+        54865: 35573,
+        54866: 35574,
+        54867: 35575,
+        54868: 35576,
+        54869: 35577,
+        54870: 35578,
+        54871: 35579,
+        54872: 35580,
+        54873: 35581,
+        54874: 35582,
+        54875: 35583,
+        54876: 35584,
+        54877: 35585,
+        54878: 35586,
+        54879: 35587,
+        54880: 35588,
+        54881: 35589,
+        54882: 35590,
+        54883: 35592,
+        54884: 35593,
+        54885: 35594,
+        54886: 35595,
+        54887: 35596,
+        54888: 35597,
+        54889: 35598,
+        54890: 35599,
+        54891: 35600,
+        54892: 35601,
+        54893: 35602,
+        54894: 35603,
+        54895: 35604,
+        54896: 35605,
+        54897: 35606,
+        54898: 35607,
+        54899: 35608,
+        54900: 35609,
+        54901: 35610,
+        54902: 35611,
+        54903: 35612,
+        54904: 35613,
+        54905: 35614,
+        54906: 35615,
+        54907: 35616,
+        54908: 35617,
+        54909: 35618,
+        54910: 35619,
+        54912: 35620,
+        54913: 35621,
+        54914: 35623,
+        54915: 35624,
+        54916: 35625,
+        54917: 35626,
+        54918: 35627,
+        54919: 35628,
+        54920: 35629,
+        54921: 35630,
+        54922: 35631,
+        54923: 35632,
+        54924: 35633,
+        54925: 35634,
+        54926: 35635,
+        54927: 35636,
+        54928: 35637,
+        54929: 35638,
+        54930: 35639,
+        54931: 35640,
+        54932: 35641,
+        54933: 35642,
+        54934: 35643,
+        54935: 35644,
+        54936: 35645,
+        54937: 35646,
+        54938: 35647,
+        54939: 35648,
+        54940: 35649,
+        54941: 35650,
+        54942: 35651,
+        54943: 35652,
+        54944: 35653,
+        54945: 24103,
+        54946: 30151,
+        54947: 37073,
+        54948: 35777,
+        54949: 33437,
+        54950: 26525,
+        54951: 25903,
+        54952: 21553,
+        54953: 34584,
+        54954: 30693,
+        54955: 32930,
+        54956: 33026,
+        54957: 27713,
+        54958: 20043,
+        54959: 32455,
+        54960: 32844,
+        54961: 30452,
+        54962: 26893,
+        54963: 27542,
+        54964: 25191,
+        54965: 20540,
+        54966: 20356,
+        54967: 22336,
+        54968: 25351,
+        54969: 27490,
+        54970: 36286,
+        54971: 21482,
+        54972: 26088,
+        54973: 32440,
+        54974: 24535,
+        54975: 25370,
+        54976: 25527,
+        54977: 33267,
+        54978: 33268,
+        54979: 32622,
+        54980: 24092,
+        54981: 23769,
+        54982: 21046,
+        54983: 26234,
+        54984: 31209,
+        54985: 31258,
+        54986: 36136,
+        54987: 28825,
+        54988: 30164,
+        54989: 28382,
+        54990: 27835,
+        54991: 31378,
+        54992: 20013,
+        54993: 30405,
+        54994: 24544,
+        54995: 38047,
+        54996: 34935,
+        54997: 32456,
+        54998: 31181,
+        54999: 32959,
+        55000: 37325,
+        55001: 20210,
+        55002: 20247,
+        55003: 33311,
+        55004: 21608,
+        55005: 24030,
+        55006: 27954,
+        55007: 35788,
+        55008: 31909,
+        55009: 36724,
+        55010: 32920,
+        55011: 24090,
+        55012: 21650,
+        55013: 30385,
+        55014: 23449,
+        55015: 26172,
+        55016: 39588,
+        55017: 29664,
+        55018: 26666,
+        55019: 34523,
+        55020: 26417,
+        55021: 29482,
+        55022: 35832,
+        55023: 35803,
+        55024: 36880,
+        55025: 31481,
+        55026: 28891,
+        55027: 29038,
+        55028: 25284,
+        55029: 30633,
+        55030: 22065,
+        55031: 20027,
+        55032: 33879,
+        55033: 26609,
+        55034: 21161,
+        55035: 34496,
+        55036: 36142,
+        55037: 38136,
+        55038: 31569,
+        55104: 35654,
+        55105: 35655,
+        55106: 35656,
+        55107: 35657,
+        55108: 35658,
+        55109: 35659,
+        55110: 35660,
+        55111: 35661,
+        55112: 35662,
+        55113: 35663,
+        55114: 35664,
+        55115: 35665,
+        55116: 35666,
+        55117: 35667,
+        55118: 35668,
+        55119: 35669,
+        55120: 35670,
+        55121: 35671,
+        55122: 35672,
+        55123: 35673,
+        55124: 35674,
+        55125: 35675,
+        55126: 35676,
+        55127: 35677,
+        55128: 35678,
+        55129: 35679,
+        55130: 35680,
+        55131: 35681,
+        55132: 35682,
+        55133: 35683,
+        55134: 35684,
+        55135: 35685,
+        55136: 35687,
+        55137: 35688,
+        55138: 35689,
+        55139: 35690,
+        55140: 35691,
+        55141: 35693,
+        55142: 35694,
+        55143: 35695,
+        55144: 35696,
+        55145: 35697,
+        55146: 35698,
+        55147: 35699,
+        55148: 35700,
+        55149: 35701,
+        55150: 35702,
+        55151: 35703,
+        55152: 35704,
+        55153: 35705,
+        55154: 35706,
+        55155: 35707,
+        55156: 35708,
+        55157: 35709,
+        55158: 35710,
+        55159: 35711,
+        55160: 35712,
+        55161: 35713,
+        55162: 35714,
+        55163: 35715,
+        55164: 35716,
+        55165: 35717,
+        55166: 35718,
+        55168: 35719,
+        55169: 35720,
+        55170: 35721,
+        55171: 35722,
+        55172: 35723,
+        55173: 35724,
+        55174: 35725,
+        55175: 35726,
+        55176: 35727,
+        55177: 35728,
+        55178: 35729,
+        55179: 35730,
+        55180: 35731,
+        55181: 35732,
+        55182: 35733,
+        55183: 35734,
+        55184: 35735,
+        55185: 35736,
+        55186: 35737,
+        55187: 35738,
+        55188: 35739,
+        55189: 35740,
+        55190: 35741,
+        55191: 35742,
+        55192: 35743,
+        55193: 35756,
+        55194: 35761,
+        55195: 35771,
+        55196: 35783,
+        55197: 35792,
+        55198: 35818,
+        55199: 35849,
+        55200: 35870,
+        55201: 20303,
+        55202: 27880,
+        55203: 31069,
+        55204: 39547,
+        55205: 25235,
+        55206: 29226,
+        55207: 25341,
+        55208: 19987,
+        55209: 30742,
+        55210: 36716,
+        55211: 25776,
+        55212: 36186,
+        55213: 31686,
+        55214: 26729,
+        55215: 24196,
+        55216: 35013,
+        55217: 22918,
+        55218: 25758,
+        55219: 22766,
+        55220: 29366,
+        55221: 26894,
+        55222: 38181,
+        55223: 36861,
+        55224: 36184,
+        55225: 22368,
+        55226: 32512,
+        55227: 35846,
+        55228: 20934,
+        55229: 25417,
+        55230: 25305,
+        55231: 21331,
+        55232: 26700,
+        55233: 29730,
+        55234: 33537,
+        55235: 37196,
+        55236: 21828,
+        55237: 30528,
+        55238: 28796,
+        55239: 27978,
+        55240: 20857,
+        55241: 21672,
+        55242: 36164,
+        55243: 23039,
+        55244: 28363,
+        55245: 28100,
+        55246: 23388,
+        55247: 32043,
+        55248: 20180,
+        55249: 31869,
+        55250: 28371,
+        55251: 23376,
+        55252: 33258,
+        55253: 28173,
+        55254: 23383,
+        55255: 39683,
+        55256: 26837,
+        55257: 36394,
+        55258: 23447,
+        55259: 32508,
+        55260: 24635,
+        55261: 32437,
+        55262: 37049,
+        55263: 36208,
+        55264: 22863,
+        55265: 25549,
+        55266: 31199,
+        55267: 36275,
+        55268: 21330,
+        55269: 26063,
+        55270: 31062,
+        55271: 35781,
+        55272: 38459,
+        55273: 32452,
+        55274: 38075,
+        55275: 32386,
+        55276: 22068,
+        55277: 37257,
+        55278: 26368,
+        55279: 32618,
+        55280: 23562,
+        55281: 36981,
+        55282: 26152,
+        55283: 24038,
+        55284: 20304,
+        55285: 26590,
+        55286: 20570,
+        55287: 20316,
+        55288: 22352,
+        55289: 24231,
+        55290: 59408,
+        55291: 59409,
+        55292: 59410,
+        55293: 59411,
+        55294: 59412,
+        55360: 35896,
+        55361: 35897,
+        55362: 35898,
+        55363: 35899,
+        55364: 35900,
+        55365: 35901,
+        55366: 35902,
+        55367: 35903,
+        55368: 35904,
+        55369: 35906,
+        55370: 35907,
+        55371: 35908,
+        55372: 35909,
+        55373: 35912,
+        55374: 35914,
+        55375: 35915,
+        55376: 35917,
+        55377: 35918,
+        55378: 35919,
+        55379: 35920,
+        55380: 35921,
+        55381: 35922,
+        55382: 35923,
+        55383: 35924,
+        55384: 35926,
+        55385: 35927,
+        55386: 35928,
+        55387: 35929,
+        55388: 35931,
+        55389: 35932,
+        55390: 35933,
+        55391: 35934,
+        55392: 35935,
+        55393: 35936,
+        55394: 35939,
+        55395: 35940,
+        55396: 35941,
+        55397: 35942,
+        55398: 35943,
+        55399: 35944,
+        55400: 35945,
+        55401: 35948,
+        55402: 35949,
+        55403: 35950,
+        55404: 35951,
+        55405: 35952,
+        55406: 35953,
+        55407: 35954,
+        55408: 35956,
+        55409: 35957,
+        55410: 35958,
+        55411: 35959,
+        55412: 35963,
+        55413: 35964,
+        55414: 35965,
+        55415: 35966,
+        55416: 35967,
+        55417: 35968,
+        55418: 35969,
+        55419: 35971,
+        55420: 35972,
+        55421: 35974,
+        55422: 35975,
+        55424: 35976,
+        55425: 35979,
+        55426: 35981,
+        55427: 35982,
+        55428: 35983,
+        55429: 35984,
+        55430: 35985,
+        55431: 35986,
+        55432: 35987,
+        55433: 35989,
+        55434: 35990,
+        55435: 35991,
+        55436: 35993,
+        55437: 35994,
+        55438: 35995,
+        55439: 35996,
+        55440: 35997,
+        55441: 35998,
+        55442: 35999,
+        55443: 36000,
+        55444: 36001,
+        55445: 36002,
+        55446: 36003,
+        55447: 36004,
+        55448: 36005,
+        55449: 36006,
+        55450: 36007,
+        55451: 36008,
+        55452: 36009,
+        55453: 36010,
+        55454: 36011,
+        55455: 36012,
+        55456: 36013,
+        55457: 20109,
+        55458: 19980,
+        55459: 20800,
+        55460: 19984,
+        55461: 24319,
+        55462: 21317,
+        55463: 19989,
+        55464: 20120,
+        55465: 19998,
+        55466: 39730,
+        55467: 23404,
+        55468: 22121,
+        55469: 20008,
+        55470: 31162,
+        55471: 20031,
+        55472: 21269,
+        55473: 20039,
+        55474: 22829,
+        55475: 29243,
+        55476: 21358,
+        55477: 27664,
+        55478: 22239,
+        55479: 32996,
+        55480: 39319,
+        55481: 27603,
+        55482: 30590,
+        55483: 40727,
+        55484: 20022,
+        55485: 20127,
+        55486: 40720,
+        55487: 20060,
+        55488: 20073,
+        55489: 20115,
+        55490: 33416,
+        55491: 23387,
+        55492: 21868,
+        55493: 22031,
+        55494: 20164,
+        55495: 21389,
+        55496: 21405,
+        55497: 21411,
+        55498: 21413,
+        55499: 21422,
+        55500: 38757,
+        55501: 36189,
+        55502: 21274,
+        55503: 21493,
+        55504: 21286,
+        55505: 21294,
+        55506: 21310,
+        55507: 36188,
+        55508: 21350,
+        55509: 21347,
+        55510: 20994,
+        55511: 21000,
+        55512: 21006,
+        55513: 21037,
+        55514: 21043,
+        55515: 21055,
+        55516: 21056,
+        55517: 21068,
+        55518: 21086,
+        55519: 21089,
+        55520: 21084,
+        55521: 33967,
+        55522: 21117,
+        55523: 21122,
+        55524: 21121,
+        55525: 21136,
+        55526: 21139,
+        55527: 20866,
+        55528: 32596,
+        55529: 20155,
+        55530: 20163,
+        55531: 20169,
+        55532: 20162,
+        55533: 20200,
+        55534: 20193,
+        55535: 20203,
+        55536: 20190,
+        55537: 20251,
+        55538: 20211,
+        55539: 20258,
+        55540: 20324,
+        55541: 20213,
+        55542: 20261,
+        55543: 20263,
+        55544: 20233,
+        55545: 20267,
+        55546: 20318,
+        55547: 20327,
+        55548: 25912,
+        55549: 20314,
+        55550: 20317,
+        55616: 36014,
+        55617: 36015,
+        55618: 36016,
+        55619: 36017,
+        55620: 36018,
+        55621: 36019,
+        55622: 36020,
+        55623: 36021,
+        55624: 36022,
+        55625: 36023,
+        55626: 36024,
+        55627: 36025,
+        55628: 36026,
+        55629: 36027,
+        55630: 36028,
+        55631: 36029,
+        55632: 36030,
+        55633: 36031,
+        55634: 36032,
+        55635: 36033,
+        55636: 36034,
+        55637: 36035,
+        55638: 36036,
+        55639: 36037,
+        55640: 36038,
+        55641: 36039,
+        55642: 36040,
+        55643: 36041,
+        55644: 36042,
+        55645: 36043,
+        55646: 36044,
+        55647: 36045,
+        55648: 36046,
+        55649: 36047,
+        55650: 36048,
+        55651: 36049,
+        55652: 36050,
+        55653: 36051,
+        55654: 36052,
+        55655: 36053,
+        55656: 36054,
+        55657: 36055,
+        55658: 36056,
+        55659: 36057,
+        55660: 36058,
+        55661: 36059,
+        55662: 36060,
+        55663: 36061,
+        55664: 36062,
+        55665: 36063,
+        55666: 36064,
+        55667: 36065,
+        55668: 36066,
+        55669: 36067,
+        55670: 36068,
+        55671: 36069,
+        55672: 36070,
+        55673: 36071,
+        55674: 36072,
+        55675: 36073,
+        55676: 36074,
+        55677: 36075,
+        55678: 36076,
+        55680: 36077,
+        55681: 36078,
+        55682: 36079,
+        55683: 36080,
+        55684: 36081,
+        55685: 36082,
+        55686: 36083,
+        55687: 36084,
+        55688: 36085,
+        55689: 36086,
+        55690: 36087,
+        55691: 36088,
+        55692: 36089,
+        55693: 36090,
+        55694: 36091,
+        55695: 36092,
+        55696: 36093,
+        55697: 36094,
+        55698: 36095,
+        55699: 36096,
+        55700: 36097,
+        55701: 36098,
+        55702: 36099,
+        55703: 36100,
+        55704: 36101,
+        55705: 36102,
+        55706: 36103,
+        55707: 36104,
+        55708: 36105,
+        55709: 36106,
+        55710: 36107,
+        55711: 36108,
+        55712: 36109,
+        55713: 20319,
+        55714: 20311,
+        55715: 20274,
+        55716: 20285,
+        55717: 20342,
+        55718: 20340,
+        55719: 20369,
+        55720: 20361,
+        55721: 20355,
+        55722: 20367,
+        55723: 20350,
+        55724: 20347,
+        55725: 20394,
+        55726: 20348,
+        55727: 20396,
+        55728: 20372,
+        55729: 20454,
+        55730: 20456,
+        55731: 20458,
+        55732: 20421,
+        55733: 20442,
+        55734: 20451,
+        55735: 20444,
+        55736: 20433,
+        55737: 20447,
+        55738: 20472,
+        55739: 20521,
+        55740: 20556,
+        55741: 20467,
+        55742: 20524,
+        55743: 20495,
+        55744: 20526,
+        55745: 20525,
+        55746: 20478,
+        55747: 20508,
+        55748: 20492,
+        55749: 20517,
+        55750: 20520,
+        55751: 20606,
+        55752: 20547,
+        55753: 20565,
+        55754: 20552,
+        55755: 20558,
+        55756: 20588,
+        55757: 20603,
+        55758: 20645,
+        55759: 20647,
+        55760: 20649,
+        55761: 20666,
+        55762: 20694,
+        55763: 20742,
+        55764: 20717,
+        55765: 20716,
+        55766: 20710,
+        55767: 20718,
+        55768: 20743,
+        55769: 20747,
+        55770: 20189,
+        55771: 27709,
+        55772: 20312,
+        55773: 20325,
+        55774: 20430,
+        55775: 40864,
+        55776: 27718,
+        55777: 31860,
+        55778: 20846,
+        55779: 24061,
+        55780: 40649,
+        55781: 39320,
+        55782: 20865,
+        55783: 22804,
+        55784: 21241,
+        55785: 21261,
+        55786: 35335,
+        55787: 21264,
+        55788: 20971,
+        55789: 22809,
+        55790: 20821,
+        55791: 20128,
+        55792: 20822,
+        55793: 20147,
+        55794: 34926,
+        55795: 34980,
+        55796: 20149,
+        55797: 33044,
+        55798: 35026,
+        55799: 31104,
+        55800: 23348,
+        55801: 34819,
+        55802: 32696,
+        55803: 20907,
+        55804: 20913,
+        55805: 20925,
+        55806: 20924,
+        55872: 36110,
+        55873: 36111,
+        55874: 36112,
+        55875: 36113,
+        55876: 36114,
+        55877: 36115,
+        55878: 36116,
+        55879: 36117,
+        55880: 36118,
+        55881: 36119,
+        55882: 36120,
+        55883: 36121,
+        55884: 36122,
+        55885: 36123,
+        55886: 36124,
+        55887: 36128,
+        55888: 36177,
+        55889: 36178,
+        55890: 36183,
+        55891: 36191,
+        55892: 36197,
+        55893: 36200,
+        55894: 36201,
+        55895: 36202,
+        55896: 36204,
+        55897: 36206,
+        55898: 36207,
+        55899: 36209,
+        55900: 36210,
+        55901: 36216,
+        55902: 36217,
+        55903: 36218,
+        55904: 36219,
+        55905: 36220,
+        55906: 36221,
+        55907: 36222,
+        55908: 36223,
+        55909: 36224,
+        55910: 36226,
+        55911: 36227,
+        55912: 36230,
+        55913: 36231,
+        55914: 36232,
+        55915: 36233,
+        55916: 36236,
+        55917: 36237,
+        55918: 36238,
+        55919: 36239,
+        55920: 36240,
+        55921: 36242,
+        55922: 36243,
+        55923: 36245,
+        55924: 36246,
+        55925: 36247,
+        55926: 36248,
+        55927: 36249,
+        55928: 36250,
+        55929: 36251,
+        55930: 36252,
+        55931: 36253,
+        55932: 36254,
+        55933: 36256,
+        55934: 36257,
+        55936: 36258,
+        55937: 36260,
+        55938: 36261,
+        55939: 36262,
+        55940: 36263,
+        55941: 36264,
+        55942: 36265,
+        55943: 36266,
+        55944: 36267,
+        55945: 36268,
+        55946: 36269,
+        55947: 36270,
+        55948: 36271,
+        55949: 36272,
+        55950: 36274,
+        55951: 36278,
+        55952: 36279,
+        55953: 36281,
+        55954: 36283,
+        55955: 36285,
+        55956: 36288,
+        55957: 36289,
+        55958: 36290,
+        55959: 36293,
+        55960: 36295,
+        55961: 36296,
+        55962: 36297,
+        55963: 36298,
+        55964: 36301,
+        55965: 36304,
+        55966: 36306,
+        55967: 36307,
+        55968: 36308,
+        55969: 20935,
+        55970: 20886,
+        55971: 20898,
+        55972: 20901,
+        55973: 35744,
+        55974: 35750,
+        55975: 35751,
+        55976: 35754,
+        55977: 35764,
+        55978: 35765,
+        55979: 35767,
+        55980: 35778,
+        55981: 35779,
+        55982: 35787,
+        55983: 35791,
+        55984: 35790,
+        55985: 35794,
+        55986: 35795,
+        55987: 35796,
+        55988: 35798,
+        55989: 35800,
+        55990: 35801,
+        55991: 35804,
+        55992: 35807,
+        55993: 35808,
+        55994: 35812,
+        55995: 35816,
+        55996: 35817,
+        55997: 35822,
+        55998: 35824,
+        55999: 35827,
+        56000: 35830,
+        56001: 35833,
+        56002: 35836,
+        56003: 35839,
+        56004: 35840,
+        56005: 35842,
+        56006: 35844,
+        56007: 35847,
+        56008: 35852,
+        56009: 35855,
+        56010: 35857,
+        56011: 35858,
+        56012: 35860,
+        56013: 35861,
+        56014: 35862,
+        56015: 35865,
+        56016: 35867,
+        56017: 35864,
+        56018: 35869,
+        56019: 35871,
+        56020: 35872,
+        56021: 35873,
+        56022: 35877,
+        56023: 35879,
+        56024: 35882,
+        56025: 35883,
+        56026: 35886,
+        56027: 35887,
+        56028: 35890,
+        56029: 35891,
+        56030: 35893,
+        56031: 35894,
+        56032: 21353,
+        56033: 21370,
+        56034: 38429,
+        56035: 38434,
+        56036: 38433,
+        56037: 38449,
+        56038: 38442,
+        56039: 38461,
+        56040: 38460,
+        56041: 38466,
+        56042: 38473,
+        56043: 38484,
+        56044: 38495,
+        56045: 38503,
+        56046: 38508,
+        56047: 38514,
+        56048: 38516,
+        56049: 38536,
+        56050: 38541,
+        56051: 38551,
+        56052: 38576,
+        56053: 37015,
+        56054: 37019,
+        56055: 37021,
+        56056: 37017,
+        56057: 37036,
+        56058: 37025,
+        56059: 37044,
+        56060: 37043,
+        56061: 37046,
+        56062: 37050,
+        56128: 36309,
+        56129: 36312,
+        56130: 36313,
+        56131: 36316,
+        56132: 36320,
+        56133: 36321,
+        56134: 36322,
+        56135: 36325,
+        56136: 36326,
+        56137: 36327,
+        56138: 36329,
+        56139: 36333,
+        56140: 36334,
+        56141: 36336,
+        56142: 36337,
+        56143: 36338,
+        56144: 36340,
+        56145: 36342,
+        56146: 36348,
+        56147: 36350,
+        56148: 36351,
+        56149: 36352,
+        56150: 36353,
+        56151: 36354,
+        56152: 36355,
+        56153: 36356,
+        56154: 36358,
+        56155: 36359,
+        56156: 36360,
+        56157: 36363,
+        56158: 36365,
+        56159: 36366,
+        56160: 36368,
+        56161: 36369,
+        56162: 36370,
+        56163: 36371,
+        56164: 36373,
+        56165: 36374,
+        56166: 36375,
+        56167: 36376,
+        56168: 36377,
+        56169: 36378,
+        56170: 36379,
+        56171: 36380,
+        56172: 36384,
+        56173: 36385,
+        56174: 36388,
+        56175: 36389,
+        56176: 36390,
+        56177: 36391,
+        56178: 36392,
+        56179: 36395,
+        56180: 36397,
+        56181: 36400,
+        56182: 36402,
+        56183: 36403,
+        56184: 36404,
+        56185: 36406,
+        56186: 36407,
+        56187: 36408,
+        56188: 36411,
+        56189: 36412,
+        56190: 36414,
+        56192: 36415,
+        56193: 36419,
+        56194: 36421,
+        56195: 36422,
+        56196: 36428,
+        56197: 36429,
+        56198: 36430,
+        56199: 36431,
+        56200: 36432,
+        56201: 36435,
+        56202: 36436,
+        56203: 36437,
+        56204: 36438,
+        56205: 36439,
+        56206: 36440,
+        56207: 36442,
+        56208: 36443,
+        56209: 36444,
+        56210: 36445,
+        56211: 36446,
+        56212: 36447,
+        56213: 36448,
+        56214: 36449,
+        56215: 36450,
+        56216: 36451,
+        56217: 36452,
+        56218: 36453,
+        56219: 36455,
+        56220: 36456,
+        56221: 36458,
+        56222: 36459,
+        56223: 36462,
+        56224: 36465,
+        56225: 37048,
+        56226: 37040,
+        56227: 37071,
+        56228: 37061,
+        56229: 37054,
+        56230: 37072,
+        56231: 37060,
+        56232: 37063,
+        56233: 37075,
+        56234: 37094,
+        56235: 37090,
+        56236: 37084,
+        56237: 37079,
+        56238: 37083,
+        56239: 37099,
+        56240: 37103,
+        56241: 37118,
+        56242: 37124,
+        56243: 37154,
+        56244: 37150,
+        56245: 37155,
+        56246: 37169,
+        56247: 37167,
+        56248: 37177,
+        56249: 37187,
+        56250: 37190,
+        56251: 21005,
+        56252: 22850,
+        56253: 21154,
+        56254: 21164,
+        56255: 21165,
+        56256: 21182,
+        56257: 21759,
+        56258: 21200,
+        56259: 21206,
+        56260: 21232,
+        56261: 21471,
+        56262: 29166,
+        56263: 30669,
+        56264: 24308,
+        56265: 20981,
+        56266: 20988,
+        56267: 39727,
+        56268: 21430,
+        56269: 24321,
+        56270: 30042,
+        56271: 24047,
+        56272: 22348,
+        56273: 22441,
+        56274: 22433,
+        56275: 22654,
+        56276: 22716,
+        56277: 22725,
+        56278: 22737,
+        56279: 22313,
+        56280: 22316,
+        56281: 22314,
+        56282: 22323,
+        56283: 22329,
+        56284: 22318,
+        56285: 22319,
+        56286: 22364,
+        56287: 22331,
+        56288: 22338,
+        56289: 22377,
+        56290: 22405,
+        56291: 22379,
+        56292: 22406,
+        56293: 22396,
+        56294: 22395,
+        56295: 22376,
+        56296: 22381,
+        56297: 22390,
+        56298: 22387,
+        56299: 22445,
+        56300: 22436,
+        56301: 22412,
+        56302: 22450,
+        56303: 22479,
+        56304: 22439,
+        56305: 22452,
+        56306: 22419,
+        56307: 22432,
+        56308: 22485,
+        56309: 22488,
+        56310: 22490,
+        56311: 22489,
+        56312: 22482,
+        56313: 22456,
+        56314: 22516,
+        56315: 22511,
+        56316: 22520,
+        56317: 22500,
+        56318: 22493,
+        56384: 36467,
+        56385: 36469,
+        56386: 36471,
+        56387: 36472,
+        56388: 36473,
+        56389: 36474,
+        56390: 36475,
+        56391: 36477,
+        56392: 36478,
+        56393: 36480,
+        56394: 36482,
+        56395: 36483,
+        56396: 36484,
+        56397: 36486,
+        56398: 36488,
+        56399: 36489,
+        56400: 36490,
+        56401: 36491,
+        56402: 36492,
+        56403: 36493,
+        56404: 36494,
+        56405: 36497,
+        56406: 36498,
+        56407: 36499,
+        56408: 36501,
+        56409: 36502,
+        56410: 36503,
+        56411: 36504,
+        56412: 36505,
+        56413: 36506,
+        56414: 36507,
+        56415: 36509,
+        56416: 36511,
+        56417: 36512,
+        56418: 36513,
+        56419: 36514,
+        56420: 36515,
+        56421: 36516,
+        56422: 36517,
+        56423: 36518,
+        56424: 36519,
+        56425: 36520,
+        56426: 36521,
+        56427: 36522,
+        56428: 36525,
+        56429: 36526,
+        56430: 36528,
+        56431: 36529,
+        56432: 36531,
+        56433: 36532,
+        56434: 36533,
+        56435: 36534,
+        56436: 36535,
+        56437: 36536,
+        56438: 36537,
+        56439: 36539,
+        56440: 36540,
+        56441: 36541,
+        56442: 36542,
+        56443: 36543,
+        56444: 36544,
+        56445: 36545,
+        56446: 36546,
+        56448: 36547,
+        56449: 36548,
+        56450: 36549,
+        56451: 36550,
+        56452: 36551,
+        56453: 36552,
+        56454: 36553,
+        56455: 36554,
+        56456: 36555,
+        56457: 36556,
+        56458: 36557,
+        56459: 36559,
+        56460: 36560,
+        56461: 36561,
+        56462: 36562,
+        56463: 36563,
+        56464: 36564,
+        56465: 36565,
+        56466: 36566,
+        56467: 36567,
+        56468: 36568,
+        56469: 36569,
+        56470: 36570,
+        56471: 36571,
+        56472: 36572,
+        56473: 36573,
+        56474: 36574,
+        56475: 36575,
+        56476: 36576,
+        56477: 36577,
+        56478: 36578,
+        56479: 36579,
+        56480: 36580,
+        56481: 22539,
+        56482: 22541,
+        56483: 22525,
+        56484: 22509,
+        56485: 22528,
+        56486: 22558,
+        56487: 22553,
+        56488: 22596,
+        56489: 22560,
+        56490: 22629,
+        56491: 22636,
+        56492: 22657,
+        56493: 22665,
+        56494: 22682,
+        56495: 22656,
+        56496: 39336,
+        56497: 40729,
+        56498: 25087,
+        56499: 33401,
+        56500: 33405,
+        56501: 33407,
+        56502: 33423,
+        56503: 33418,
+        56504: 33448,
+        56505: 33412,
+        56506: 33422,
+        56507: 33425,
+        56508: 33431,
+        56509: 33433,
+        56510: 33451,
+        56511: 33464,
+        56512: 33470,
+        56513: 33456,
+        56514: 33480,
+        56515: 33482,
+        56516: 33507,
+        56517: 33432,
+        56518: 33463,
+        56519: 33454,
+        56520: 33483,
+        56521: 33484,
+        56522: 33473,
+        56523: 33449,
+        56524: 33460,
+        56525: 33441,
+        56526: 33450,
+        56527: 33439,
+        56528: 33476,
+        56529: 33486,
+        56530: 33444,
+        56531: 33505,
+        56532: 33545,
+        56533: 33527,
+        56534: 33508,
+        56535: 33551,
+        56536: 33543,
+        56537: 33500,
+        56538: 33524,
+        56539: 33490,
+        56540: 33496,
+        56541: 33548,
+        56542: 33531,
+        56543: 33491,
+        56544: 33553,
+        56545: 33562,
+        56546: 33542,
+        56547: 33556,
+        56548: 33557,
+        56549: 33504,
+        56550: 33493,
+        56551: 33564,
+        56552: 33617,
+        56553: 33627,
+        56554: 33628,
+        56555: 33544,
+        56556: 33682,
+        56557: 33596,
+        56558: 33588,
+        56559: 33585,
+        56560: 33691,
+        56561: 33630,
+        56562: 33583,
+        56563: 33615,
+        56564: 33607,
+        56565: 33603,
+        56566: 33631,
+        56567: 33600,
+        56568: 33559,
+        56569: 33632,
+        56570: 33581,
+        56571: 33594,
+        56572: 33587,
+        56573: 33638,
+        56574: 33637,
+        56640: 36581,
+        56641: 36582,
+        56642: 36583,
+        56643: 36584,
+        56644: 36585,
+        56645: 36586,
+        56646: 36587,
+        56647: 36588,
+        56648: 36589,
+        56649: 36590,
+        56650: 36591,
+        56651: 36592,
+        56652: 36593,
+        56653: 36594,
+        56654: 36595,
+        56655: 36596,
+        56656: 36597,
+        56657: 36598,
+        56658: 36599,
+        56659: 36600,
+        56660: 36601,
+        56661: 36602,
+        56662: 36603,
+        56663: 36604,
+        56664: 36605,
+        56665: 36606,
+        56666: 36607,
+        56667: 36608,
+        56668: 36609,
+        56669: 36610,
+        56670: 36611,
+        56671: 36612,
+        56672: 36613,
+        56673: 36614,
+        56674: 36615,
+        56675: 36616,
+        56676: 36617,
+        56677: 36618,
+        56678: 36619,
+        56679: 36620,
+        56680: 36621,
+        56681: 36622,
+        56682: 36623,
+        56683: 36624,
+        56684: 36625,
+        56685: 36626,
+        56686: 36627,
+        56687: 36628,
+        56688: 36629,
+        56689: 36630,
+        56690: 36631,
+        56691: 36632,
+        56692: 36633,
+        56693: 36634,
+        56694: 36635,
+        56695: 36636,
+        56696: 36637,
+        56697: 36638,
+        56698: 36639,
+        56699: 36640,
+        56700: 36641,
+        56701: 36642,
+        56702: 36643,
+        56704: 36644,
+        56705: 36645,
+        56706: 36646,
+        56707: 36647,
+        56708: 36648,
+        56709: 36649,
+        56710: 36650,
+        56711: 36651,
+        56712: 36652,
+        56713: 36653,
+        56714: 36654,
+        56715: 36655,
+        56716: 36656,
+        56717: 36657,
+        56718: 36658,
+        56719: 36659,
+        56720: 36660,
+        56721: 36661,
+        56722: 36662,
+        56723: 36663,
+        56724: 36664,
+        56725: 36665,
+        56726: 36666,
+        56727: 36667,
+        56728: 36668,
+        56729: 36669,
+        56730: 36670,
+        56731: 36671,
+        56732: 36672,
+        56733: 36673,
+        56734: 36674,
+        56735: 36675,
+        56736: 36676,
+        56737: 33640,
+        56738: 33563,
+        56739: 33641,
+        56740: 33644,
+        56741: 33642,
+        56742: 33645,
+        56743: 33646,
+        56744: 33712,
+        56745: 33656,
+        56746: 33715,
+        56747: 33716,
+        56748: 33696,
+        56749: 33706,
+        56750: 33683,
+        56751: 33692,
+        56752: 33669,
+        56753: 33660,
+        56754: 33718,
+        56755: 33705,
+        56756: 33661,
+        56757: 33720,
+        56758: 33659,
+        56759: 33688,
+        56760: 33694,
+        56761: 33704,
+        56762: 33722,
+        56763: 33724,
+        56764: 33729,
+        56765: 33793,
+        56766: 33765,
+        56767: 33752,
+        56768: 22535,
+        56769: 33816,
+        56770: 33803,
+        56771: 33757,
+        56772: 33789,
+        56773: 33750,
+        56774: 33820,
+        56775: 33848,
+        56776: 33809,
+        56777: 33798,
+        56778: 33748,
+        56779: 33759,
+        56780: 33807,
+        56781: 33795,
+        56782: 33784,
+        56783: 33785,
+        56784: 33770,
+        56785: 33733,
+        56786: 33728,
+        56787: 33830,
+        56788: 33776,
+        56789: 33761,
+        56790: 33884,
+        56791: 33873,
+        56792: 33882,
+        56793: 33881,
+        56794: 33907,
+        56795: 33927,
+        56796: 33928,
+        56797: 33914,
+        56798: 33929,
+        56799: 33912,
+        56800: 33852,
+        56801: 33862,
+        56802: 33897,
+        56803: 33910,
+        56804: 33932,
+        56805: 33934,
+        56806: 33841,
+        56807: 33901,
+        56808: 33985,
+        56809: 33997,
+        56810: 34000,
+        56811: 34022,
+        56812: 33981,
+        56813: 34003,
+        56814: 33994,
+        56815: 33983,
+        56816: 33978,
+        56817: 34016,
+        56818: 33953,
+        56819: 33977,
+        56820: 33972,
+        56821: 33943,
+        56822: 34021,
+        56823: 34019,
+        56824: 34060,
+        56825: 29965,
+        56826: 34104,
+        56827: 34032,
+        56828: 34105,
+        56829: 34079,
+        56830: 34106,
+        56896: 36677,
+        56897: 36678,
+        56898: 36679,
+        56899: 36680,
+        56900: 36681,
+        56901: 36682,
+        56902: 36683,
+        56903: 36684,
+        56904: 36685,
+        56905: 36686,
+        56906: 36687,
+        56907: 36688,
+        56908: 36689,
+        56909: 36690,
+        56910: 36691,
+        56911: 36692,
+        56912: 36693,
+        56913: 36694,
+        56914: 36695,
+        56915: 36696,
+        56916: 36697,
+        56917: 36698,
+        56918: 36699,
+        56919: 36700,
+        56920: 36701,
+        56921: 36702,
+        56922: 36703,
+        56923: 36704,
+        56924: 36705,
+        56925: 36706,
+        56926: 36707,
+        56927: 36708,
+        56928: 36709,
+        56929: 36714,
+        56930: 36736,
+        56931: 36748,
+        56932: 36754,
+        56933: 36765,
+        56934: 36768,
+        56935: 36769,
+        56936: 36770,
+        56937: 36772,
+        56938: 36773,
+        56939: 36774,
+        56940: 36775,
+        56941: 36778,
+        56942: 36780,
+        56943: 36781,
+        56944: 36782,
+        56945: 36783,
+        56946: 36786,
+        56947: 36787,
+        56948: 36788,
+        56949: 36789,
+        56950: 36791,
+        56951: 36792,
+        56952: 36794,
+        56953: 36795,
+        56954: 36796,
+        56955: 36799,
+        56956: 36800,
+        56957: 36803,
+        56958: 36806,
+        56960: 36809,
+        56961: 36810,
+        56962: 36811,
+        56963: 36812,
+        56964: 36813,
+        56965: 36815,
+        56966: 36818,
+        56967: 36822,
+        56968: 36823,
+        56969: 36826,
+        56970: 36832,
+        56971: 36833,
+        56972: 36835,
+        56973: 36839,
+        56974: 36844,
+        56975: 36847,
+        56976: 36849,
+        56977: 36850,
+        56978: 36852,
+        56979: 36853,
+        56980: 36854,
+        56981: 36858,
+        56982: 36859,
+        56983: 36860,
+        56984: 36862,
+        56985: 36863,
+        56986: 36871,
+        56987: 36872,
+        56988: 36876,
+        56989: 36878,
+        56990: 36883,
+        56991: 36885,
+        56992: 36888,
+        56993: 34134,
+        56994: 34107,
+        56995: 34047,
+        56996: 34044,
+        56997: 34137,
+        56998: 34120,
+        56999: 34152,
+        57000: 34148,
+        57001: 34142,
+        57002: 34170,
+        57003: 30626,
+        57004: 34115,
+        57005: 34162,
+        57006: 34171,
+        57007: 34212,
+        57008: 34216,
+        57009: 34183,
+        57010: 34191,
+        57011: 34169,
+        57012: 34222,
+        57013: 34204,
+        57014: 34181,
+        57015: 34233,
+        57016: 34231,
+        57017: 34224,
+        57018: 34259,
+        57019: 34241,
+        57020: 34268,
+        57021: 34303,
+        57022: 34343,
+        57023: 34309,
+        57024: 34345,
+        57025: 34326,
+        57026: 34364,
+        57027: 24318,
+        57028: 24328,
+        57029: 22844,
+        57030: 22849,
+        57031: 32823,
+        57032: 22869,
+        57033: 22874,
+        57034: 22872,
+        57035: 21263,
+        57036: 23586,
+        57037: 23589,
+        57038: 23596,
+        57039: 23604,
+        57040: 25164,
+        57041: 25194,
+        57042: 25247,
+        57043: 25275,
+        57044: 25290,
+        57045: 25306,
+        57046: 25303,
+        57047: 25326,
+        57048: 25378,
+        57049: 25334,
+        57050: 25401,
+        57051: 25419,
+        57052: 25411,
+        57053: 25517,
+        57054: 25590,
+        57055: 25457,
+        57056: 25466,
+        57057: 25486,
+        57058: 25524,
+        57059: 25453,
+        57060: 25516,
+        57061: 25482,
+        57062: 25449,
+        57063: 25518,
+        57064: 25532,
+        57065: 25586,
+        57066: 25592,
+        57067: 25568,
+        57068: 25599,
+        57069: 25540,
+        57070: 25566,
+        57071: 25550,
+        57072: 25682,
+        57073: 25542,
+        57074: 25534,
+        57075: 25669,
+        57076: 25665,
+        57077: 25611,
+        57078: 25627,
+        57079: 25632,
+        57080: 25612,
+        57081: 25638,
+        57082: 25633,
+        57083: 25694,
+        57084: 25732,
+        57085: 25709,
+        57086: 25750,
+        57152: 36889,
+        57153: 36892,
+        57154: 36899,
+        57155: 36900,
+        57156: 36901,
+        57157: 36903,
+        57158: 36904,
+        57159: 36905,
+        57160: 36906,
+        57161: 36907,
+        57162: 36908,
+        57163: 36912,
+        57164: 36913,
+        57165: 36914,
+        57166: 36915,
+        57167: 36916,
+        57168: 36919,
+        57169: 36921,
+        57170: 36922,
+        57171: 36925,
+        57172: 36927,
+        57173: 36928,
+        57174: 36931,
+        57175: 36933,
+        57176: 36934,
+        57177: 36936,
+        57178: 36937,
+        57179: 36938,
+        57180: 36939,
+        57181: 36940,
+        57182: 36942,
+        57183: 36948,
+        57184: 36949,
+        57185: 36950,
+        57186: 36953,
+        57187: 36954,
+        57188: 36956,
+        57189: 36957,
+        57190: 36958,
+        57191: 36959,
+        57192: 36960,
+        57193: 36961,
+        57194: 36964,
+        57195: 36966,
+        57196: 36967,
+        57197: 36969,
+        57198: 36970,
+        57199: 36971,
+        57200: 36972,
+        57201: 36975,
+        57202: 36976,
+        57203: 36977,
+        57204: 36978,
+        57205: 36979,
+        57206: 36982,
+        57207: 36983,
+        57208: 36984,
+        57209: 36985,
+        57210: 36986,
+        57211: 36987,
+        57212: 36988,
+        57213: 36990,
+        57214: 36993,
+        57216: 36996,
+        57217: 36997,
+        57218: 36998,
+        57219: 36999,
+        57220: 37001,
+        57221: 37002,
+        57222: 37004,
+        57223: 37005,
+        57224: 37006,
+        57225: 37007,
+        57226: 37008,
+        57227: 37010,
+        57228: 37012,
+        57229: 37014,
+        57230: 37016,
+        57231: 37018,
+        57232: 37020,
+        57233: 37022,
+        57234: 37023,
+        57235: 37024,
+        57236: 37028,
+        57237: 37029,
+        57238: 37031,
+        57239: 37032,
+        57240: 37033,
+        57241: 37035,
+        57242: 37037,
+        57243: 37042,
+        57244: 37047,
+        57245: 37052,
+        57246: 37053,
+        57247: 37055,
+        57248: 37056,
+        57249: 25722,
+        57250: 25783,
+        57251: 25784,
+        57252: 25753,
+        57253: 25786,
+        57254: 25792,
+        57255: 25808,
+        57256: 25815,
+        57257: 25828,
+        57258: 25826,
+        57259: 25865,
+        57260: 25893,
+        57261: 25902,
+        57262: 24331,
+        57263: 24530,
+        57264: 29977,
+        57265: 24337,
+        57266: 21343,
+        57267: 21489,
+        57268: 21501,
+        57269: 21481,
+        57270: 21480,
+        57271: 21499,
+        57272: 21522,
+        57273: 21526,
+        57274: 21510,
+        57275: 21579,
+        57276: 21586,
+        57277: 21587,
+        57278: 21588,
+        57279: 21590,
+        57280: 21571,
+        57281: 21537,
+        57282: 21591,
+        57283: 21593,
+        57284: 21539,
+        57285: 21554,
+        57286: 21634,
+        57287: 21652,
+        57288: 21623,
+        57289: 21617,
+        57290: 21604,
+        57291: 21658,
+        57292: 21659,
+        57293: 21636,
+        57294: 21622,
+        57295: 21606,
+        57296: 21661,
+        57297: 21712,
+        57298: 21677,
+        57299: 21698,
+        57300: 21684,
+        57301: 21714,
+        57302: 21671,
+        57303: 21670,
+        57304: 21715,
+        57305: 21716,
+        57306: 21618,
+        57307: 21667,
+        57308: 21717,
+        57309: 21691,
+        57310: 21695,
+        57311: 21708,
+        57312: 21721,
+        57313: 21722,
+        57314: 21724,
+        57315: 21673,
+        57316: 21674,
+        57317: 21668,
+        57318: 21725,
+        57319: 21711,
+        57320: 21726,
+        57321: 21787,
+        57322: 21735,
+        57323: 21792,
+        57324: 21757,
+        57325: 21780,
+        57326: 21747,
+        57327: 21794,
+        57328: 21795,
+        57329: 21775,
+        57330: 21777,
+        57331: 21799,
+        57332: 21802,
+        57333: 21863,
+        57334: 21903,
+        57335: 21941,
+        57336: 21833,
+        57337: 21869,
+        57338: 21825,
+        57339: 21845,
+        57340: 21823,
+        57341: 21840,
+        57342: 21820,
+        57408: 37058,
+        57409: 37059,
+        57410: 37062,
+        57411: 37064,
+        57412: 37065,
+        57413: 37067,
+        57414: 37068,
+        57415: 37069,
+        57416: 37074,
+        57417: 37076,
+        57418: 37077,
+        57419: 37078,
+        57420: 37080,
+        57421: 37081,
+        57422: 37082,
+        57423: 37086,
+        57424: 37087,
+        57425: 37088,
+        57426: 37091,
+        57427: 37092,
+        57428: 37093,
+        57429: 37097,
+        57430: 37098,
+        57431: 37100,
+        57432: 37102,
+        57433: 37104,
+        57434: 37105,
+        57435: 37106,
+        57436: 37107,
+        57437: 37109,
+        57438: 37110,
+        57439: 37111,
+        57440: 37113,
+        57441: 37114,
+        57442: 37115,
+        57443: 37116,
+        57444: 37119,
+        57445: 37120,
+        57446: 37121,
+        57447: 37123,
+        57448: 37125,
+        57449: 37126,
+        57450: 37127,
+        57451: 37128,
+        57452: 37129,
+        57453: 37130,
+        57454: 37131,
+        57455: 37132,
+        57456: 37133,
+        57457: 37134,
+        57458: 37135,
+        57459: 37136,
+        57460: 37137,
+        57461: 37138,
+        57462: 37139,
+        57463: 37140,
+        57464: 37141,
+        57465: 37142,
+        57466: 37143,
+        57467: 37144,
+        57468: 37146,
+        57469: 37147,
+        57470: 37148,
+        57472: 37149,
+        57473: 37151,
+        57474: 37152,
+        57475: 37153,
+        57476: 37156,
+        57477: 37157,
+        57478: 37158,
+        57479: 37159,
+        57480: 37160,
+        57481: 37161,
+        57482: 37162,
+        57483: 37163,
+        57484: 37164,
+        57485: 37165,
+        57486: 37166,
+        57487: 37168,
+        57488: 37170,
+        57489: 37171,
+        57490: 37172,
+        57491: 37173,
+        57492: 37174,
+        57493: 37175,
+        57494: 37176,
+        57495: 37178,
+        57496: 37179,
+        57497: 37180,
+        57498: 37181,
+        57499: 37182,
+        57500: 37183,
+        57501: 37184,
+        57502: 37185,
+        57503: 37186,
+        57504: 37188,
+        57505: 21815,
+        57506: 21846,
+        57507: 21877,
+        57508: 21878,
+        57509: 21879,
+        57510: 21811,
+        57511: 21808,
+        57512: 21852,
+        57513: 21899,
+        57514: 21970,
+        57515: 21891,
+        57516: 21937,
+        57517: 21945,
+        57518: 21896,
+        57519: 21889,
+        57520: 21919,
+        57521: 21886,
+        57522: 21974,
+        57523: 21905,
+        57524: 21883,
+        57525: 21983,
+        57526: 21949,
+        57527: 21950,
+        57528: 21908,
+        57529: 21913,
+        57530: 21994,
+        57531: 22007,
+        57532: 21961,
+        57533: 22047,
+        57534: 21969,
+        57535: 21995,
+        57536: 21996,
+        57537: 21972,
+        57538: 21990,
+        57539: 21981,
+        57540: 21956,
+        57541: 21999,
+        57542: 21989,
+        57543: 22002,
+        57544: 22003,
+        57545: 21964,
+        57546: 21965,
+        57547: 21992,
+        57548: 22005,
+        57549: 21988,
+        57550: 36756,
+        57551: 22046,
+        57552: 22024,
+        57553: 22028,
+        57554: 22017,
+        57555: 22052,
+        57556: 22051,
+        57557: 22014,
+        57558: 22016,
+        57559: 22055,
+        57560: 22061,
+        57561: 22104,
+        57562: 22073,
+        57563: 22103,
+        57564: 22060,
+        57565: 22093,
+        57566: 22114,
+        57567: 22105,
+        57568: 22108,
+        57569: 22092,
+        57570: 22100,
+        57571: 22150,
+        57572: 22116,
+        57573: 22129,
+        57574: 22123,
+        57575: 22139,
+        57576: 22140,
+        57577: 22149,
+        57578: 22163,
+        57579: 22191,
+        57580: 22228,
+        57581: 22231,
+        57582: 22237,
+        57583: 22241,
+        57584: 22261,
+        57585: 22251,
+        57586: 22265,
+        57587: 22271,
+        57588: 22276,
+        57589: 22282,
+        57590: 22281,
+        57591: 22300,
+        57592: 24079,
+        57593: 24089,
+        57594: 24084,
+        57595: 24081,
+        57596: 24113,
+        57597: 24123,
+        57598: 24124,
+        57664: 37189,
+        57665: 37191,
+        57666: 37192,
+        57667: 37201,
+        57668: 37203,
+        57669: 37204,
+        57670: 37205,
+        57671: 37206,
+        57672: 37208,
+        57673: 37209,
+        57674: 37211,
+        57675: 37212,
+        57676: 37215,
+        57677: 37216,
+        57678: 37222,
+        57679: 37223,
+        57680: 37224,
+        57681: 37227,
+        57682: 37229,
+        57683: 37235,
+        57684: 37242,
+        57685: 37243,
+        57686: 37244,
+        57687: 37248,
+        57688: 37249,
+        57689: 37250,
+        57690: 37251,
+        57691: 37252,
+        57692: 37254,
+        57693: 37256,
+        57694: 37258,
+        57695: 37262,
+        57696: 37263,
+        57697: 37267,
+        57698: 37268,
+        57699: 37269,
+        57700: 37270,
+        57701: 37271,
+        57702: 37272,
+        57703: 37273,
+        57704: 37276,
+        57705: 37277,
+        57706: 37278,
+        57707: 37279,
+        57708: 37280,
+        57709: 37281,
+        57710: 37284,
+        57711: 37285,
+        57712: 37286,
+        57713: 37287,
+        57714: 37288,
+        57715: 37289,
+        57716: 37291,
+        57717: 37292,
+        57718: 37296,
+        57719: 37297,
+        57720: 37298,
+        57721: 37299,
+        57722: 37302,
+        57723: 37303,
+        57724: 37304,
+        57725: 37305,
+        57726: 37307,
+        57728: 37308,
+        57729: 37309,
+        57730: 37310,
+        57731: 37311,
+        57732: 37312,
+        57733: 37313,
+        57734: 37314,
+        57735: 37315,
+        57736: 37316,
+        57737: 37317,
+        57738: 37318,
+        57739: 37320,
+        57740: 37323,
+        57741: 37328,
+        57742: 37330,
+        57743: 37331,
+        57744: 37332,
+        57745: 37333,
+        57746: 37334,
+        57747: 37335,
+        57748: 37336,
+        57749: 37337,
+        57750: 37338,
+        57751: 37339,
+        57752: 37341,
+        57753: 37342,
+        57754: 37343,
+        57755: 37344,
+        57756: 37345,
+        57757: 37346,
+        57758: 37347,
+        57759: 37348,
+        57760: 37349,
+        57761: 24119,
+        57762: 24132,
+        57763: 24148,
+        57764: 24155,
+        57765: 24158,
+        57766: 24161,
+        57767: 23692,
+        57768: 23674,
+        57769: 23693,
+        57770: 23696,
+        57771: 23702,
+        57772: 23688,
+        57773: 23704,
+        57774: 23705,
+        57775: 23697,
+        57776: 23706,
+        57777: 23708,
+        57778: 23733,
+        57779: 23714,
+        57780: 23741,
+        57781: 23724,
+        57782: 23723,
+        57783: 23729,
+        57784: 23715,
+        57785: 23745,
+        57786: 23735,
+        57787: 23748,
+        57788: 23762,
+        57789: 23780,
+        57790: 23755,
+        57791: 23781,
+        57792: 23810,
+        57793: 23811,
+        57794: 23847,
+        57795: 23846,
+        57796: 23854,
+        57797: 23844,
+        57798: 23838,
+        57799: 23814,
+        57800: 23835,
+        57801: 23896,
+        57802: 23870,
+        57803: 23860,
+        57804: 23869,
+        57805: 23916,
+        57806: 23899,
+        57807: 23919,
+        57808: 23901,
+        57809: 23915,
+        57810: 23883,
+        57811: 23882,
+        57812: 23913,
+        57813: 23924,
+        57814: 23938,
+        57815: 23961,
+        57816: 23965,
+        57817: 35955,
+        57818: 23991,
+        57819: 24005,
+        57820: 24435,
+        57821: 24439,
+        57822: 24450,
+        57823: 24455,
+        57824: 24457,
+        57825: 24460,
+        57826: 24469,
+        57827: 24473,
+        57828: 24476,
+        57829: 24488,
+        57830: 24493,
+        57831: 24501,
+        57832: 24508,
+        57833: 34914,
+        57834: 24417,
+        57835: 29357,
+        57836: 29360,
+        57837: 29364,
+        57838: 29367,
+        57839: 29368,
+        57840: 29379,
+        57841: 29377,
+        57842: 29390,
+        57843: 29389,
+        57844: 29394,
+        57845: 29416,
+        57846: 29423,
+        57847: 29417,
+        57848: 29426,
+        57849: 29428,
+        57850: 29431,
+        57851: 29441,
+        57852: 29427,
+        57853: 29443,
+        57854: 29434,
+        57920: 37350,
+        57921: 37351,
+        57922: 37352,
+        57923: 37353,
+        57924: 37354,
+        57925: 37355,
+        57926: 37356,
+        57927: 37357,
+        57928: 37358,
+        57929: 37359,
+        57930: 37360,
+        57931: 37361,
+        57932: 37362,
+        57933: 37363,
+        57934: 37364,
+        57935: 37365,
+        57936: 37366,
+        57937: 37367,
+        57938: 37368,
+        57939: 37369,
+        57940: 37370,
+        57941: 37371,
+        57942: 37372,
+        57943: 37373,
+        57944: 37374,
+        57945: 37375,
+        57946: 37376,
+        57947: 37377,
+        57948: 37378,
+        57949: 37379,
+        57950: 37380,
+        57951: 37381,
+        57952: 37382,
+        57953: 37383,
+        57954: 37384,
+        57955: 37385,
+        57956: 37386,
+        57957: 37387,
+        57958: 37388,
+        57959: 37389,
+        57960: 37390,
+        57961: 37391,
+        57962: 37392,
+        57963: 37393,
+        57964: 37394,
+        57965: 37395,
+        57966: 37396,
+        57967: 37397,
+        57968: 37398,
+        57969: 37399,
+        57970: 37400,
+        57971: 37401,
+        57972: 37402,
+        57973: 37403,
+        57974: 37404,
+        57975: 37405,
+        57976: 37406,
+        57977: 37407,
+        57978: 37408,
+        57979: 37409,
+        57980: 37410,
+        57981: 37411,
+        57982: 37412,
+        57984: 37413,
+        57985: 37414,
+        57986: 37415,
+        57987: 37416,
+        57988: 37417,
+        57989: 37418,
+        57990: 37419,
+        57991: 37420,
+        57992: 37421,
+        57993: 37422,
+        57994: 37423,
+        57995: 37424,
+        57996: 37425,
+        57997: 37426,
+        57998: 37427,
+        57999: 37428,
+        58000: 37429,
+        58001: 37430,
+        58002: 37431,
+        58003: 37432,
+        58004: 37433,
+        58005: 37434,
+        58006: 37435,
+        58007: 37436,
+        58008: 37437,
+        58009: 37438,
+        58010: 37439,
+        58011: 37440,
+        58012: 37441,
+        58013: 37442,
+        58014: 37443,
+        58015: 37444,
+        58016: 37445,
+        58017: 29435,
+        58018: 29463,
+        58019: 29459,
+        58020: 29473,
+        58021: 29450,
+        58022: 29470,
+        58023: 29469,
+        58024: 29461,
+        58025: 29474,
+        58026: 29497,
+        58027: 29477,
+        58028: 29484,
+        58029: 29496,
+        58030: 29489,
+        58031: 29520,
+        58032: 29517,
+        58033: 29527,
+        58034: 29536,
+        58035: 29548,
+        58036: 29551,
+        58037: 29566,
+        58038: 33307,
+        58039: 22821,
+        58040: 39143,
+        58041: 22820,
+        58042: 22786,
+        58043: 39267,
+        58044: 39271,
+        58045: 39272,
+        58046: 39273,
+        58047: 39274,
+        58048: 39275,
+        58049: 39276,
+        58050: 39284,
+        58051: 39287,
+        58052: 39293,
+        58053: 39296,
+        58054: 39300,
+        58055: 39303,
+        58056: 39306,
+        58057: 39309,
+        58058: 39312,
+        58059: 39313,
+        58060: 39315,
+        58061: 39316,
+        58062: 39317,
+        58063: 24192,
+        58064: 24209,
+        58065: 24203,
+        58066: 24214,
+        58067: 24229,
+        58068: 24224,
+        58069: 24249,
+        58070: 24245,
+        58071: 24254,
+        58072: 24243,
+        58073: 36179,
+        58074: 24274,
+        58075: 24273,
+        58076: 24283,
+        58077: 24296,
+        58078: 24298,
+        58079: 33210,
+        58080: 24516,
+        58081: 24521,
+        58082: 24534,
+        58083: 24527,
+        58084: 24579,
+        58085: 24558,
+        58086: 24580,
+        58087: 24545,
+        58088: 24548,
+        58089: 24574,
+        58090: 24581,
+        58091: 24582,
+        58092: 24554,
+        58093: 24557,
+        58094: 24568,
+        58095: 24601,
+        58096: 24629,
+        58097: 24614,
+        58098: 24603,
+        58099: 24591,
+        58100: 24589,
+        58101: 24617,
+        58102: 24619,
+        58103: 24586,
+        58104: 24639,
+        58105: 24609,
+        58106: 24696,
+        58107: 24697,
+        58108: 24699,
+        58109: 24698,
+        58110: 24642,
+        58176: 37446,
+        58177: 37447,
+        58178: 37448,
+        58179: 37449,
+        58180: 37450,
+        58181: 37451,
+        58182: 37452,
+        58183: 37453,
+        58184: 37454,
+        58185: 37455,
+        58186: 37456,
+        58187: 37457,
+        58188: 37458,
+        58189: 37459,
+        58190: 37460,
+        58191: 37461,
+        58192: 37462,
+        58193: 37463,
+        58194: 37464,
+        58195: 37465,
+        58196: 37466,
+        58197: 37467,
+        58198: 37468,
+        58199: 37469,
+        58200: 37470,
+        58201: 37471,
+        58202: 37472,
+        58203: 37473,
+        58204: 37474,
+        58205: 37475,
+        58206: 37476,
+        58207: 37477,
+        58208: 37478,
+        58209: 37479,
+        58210: 37480,
+        58211: 37481,
+        58212: 37482,
+        58213: 37483,
+        58214: 37484,
+        58215: 37485,
+        58216: 37486,
+        58217: 37487,
+        58218: 37488,
+        58219: 37489,
+        58220: 37490,
+        58221: 37491,
+        58222: 37493,
+        58223: 37494,
+        58224: 37495,
+        58225: 37496,
+        58226: 37497,
+        58227: 37498,
+        58228: 37499,
+        58229: 37500,
+        58230: 37501,
+        58231: 37502,
+        58232: 37503,
+        58233: 37504,
+        58234: 37505,
+        58235: 37506,
+        58236: 37507,
+        58237: 37508,
+        58238: 37509,
+        58240: 37510,
+        58241: 37511,
+        58242: 37512,
+        58243: 37513,
+        58244: 37514,
+        58245: 37515,
+        58246: 37516,
+        58247: 37517,
+        58248: 37519,
+        58249: 37520,
+        58250: 37521,
+        58251: 37522,
+        58252: 37523,
+        58253: 37524,
+        58254: 37525,
+        58255: 37526,
+        58256: 37527,
+        58257: 37528,
+        58258: 37529,
+        58259: 37530,
+        58260: 37531,
+        58261: 37532,
+        58262: 37533,
+        58263: 37534,
+        58264: 37535,
+        58265: 37536,
+        58266: 37537,
+        58267: 37538,
+        58268: 37539,
+        58269: 37540,
+        58270: 37541,
+        58271: 37542,
+        58272: 37543,
+        58273: 24682,
+        58274: 24701,
+        58275: 24726,
+        58276: 24730,
+        58277: 24749,
+        58278: 24733,
+        58279: 24707,
+        58280: 24722,
+        58281: 24716,
+        58282: 24731,
+        58283: 24812,
+        58284: 24763,
+        58285: 24753,
+        58286: 24797,
+        58287: 24792,
+        58288: 24774,
+        58289: 24794,
+        58290: 24756,
+        58291: 24864,
+        58292: 24870,
+        58293: 24853,
+        58294: 24867,
+        58295: 24820,
+        58296: 24832,
+        58297: 24846,
+        58298: 24875,
+        58299: 24906,
+        58300: 24949,
+        58301: 25004,
+        58302: 24980,
+        58303: 24999,
+        58304: 25015,
+        58305: 25044,
+        58306: 25077,
+        58307: 24541,
+        58308: 38579,
+        58309: 38377,
+        58310: 38379,
+        58311: 38385,
+        58312: 38387,
+        58313: 38389,
+        58314: 38390,
+        58315: 38396,
+        58316: 38398,
+        58317: 38403,
+        58318: 38404,
+        58319: 38406,
+        58320: 38408,
+        58321: 38410,
+        58322: 38411,
+        58323: 38412,
+        58324: 38413,
+        58325: 38415,
+        58326: 38418,
+        58327: 38421,
+        58328: 38422,
+        58329: 38423,
+        58330: 38425,
+        58331: 38426,
+        58332: 20012,
+        58333: 29247,
+        58334: 25109,
+        58335: 27701,
+        58336: 27732,
+        58337: 27740,
+        58338: 27722,
+        58339: 27811,
+        58340: 27781,
+        58341: 27792,
+        58342: 27796,
+        58343: 27788,
+        58344: 27752,
+        58345: 27753,
+        58346: 27764,
+        58347: 27766,
+        58348: 27782,
+        58349: 27817,
+        58350: 27856,
+        58351: 27860,
+        58352: 27821,
+        58353: 27895,
+        58354: 27896,
+        58355: 27889,
+        58356: 27863,
+        58357: 27826,
+        58358: 27872,
+        58359: 27862,
+        58360: 27898,
+        58361: 27883,
+        58362: 27886,
+        58363: 27825,
+        58364: 27859,
+        58365: 27887,
+        58366: 27902,
+        58432: 37544,
+        58433: 37545,
+        58434: 37546,
+        58435: 37547,
+        58436: 37548,
+        58437: 37549,
+        58438: 37551,
+        58439: 37552,
+        58440: 37553,
+        58441: 37554,
+        58442: 37555,
+        58443: 37556,
+        58444: 37557,
+        58445: 37558,
+        58446: 37559,
+        58447: 37560,
+        58448: 37561,
+        58449: 37562,
+        58450: 37563,
+        58451: 37564,
+        58452: 37565,
+        58453: 37566,
+        58454: 37567,
+        58455: 37568,
+        58456: 37569,
+        58457: 37570,
+        58458: 37571,
+        58459: 37572,
+        58460: 37573,
+        58461: 37574,
+        58462: 37575,
+        58463: 37577,
+        58464: 37578,
+        58465: 37579,
+        58466: 37580,
+        58467: 37581,
+        58468: 37582,
+        58469: 37583,
+        58470: 37584,
+        58471: 37585,
+        58472: 37586,
+        58473: 37587,
+        58474: 37588,
+        58475: 37589,
+        58476: 37590,
+        58477: 37591,
+        58478: 37592,
+        58479: 37593,
+        58480: 37594,
+        58481: 37595,
+        58482: 37596,
+        58483: 37597,
+        58484: 37598,
+        58485: 37599,
+        58486: 37600,
+        58487: 37601,
+        58488: 37602,
+        58489: 37603,
+        58490: 37604,
+        58491: 37605,
+        58492: 37606,
+        58493: 37607,
+        58494: 37608,
+        58496: 37609,
+        58497: 37610,
+        58498: 37611,
+        58499: 37612,
+        58500: 37613,
+        58501: 37614,
+        58502: 37615,
+        58503: 37616,
+        58504: 37617,
+        58505: 37618,
+        58506: 37619,
+        58507: 37620,
+        58508: 37621,
+        58509: 37622,
+        58510: 37623,
+        58511: 37624,
+        58512: 37625,
+        58513: 37626,
+        58514: 37627,
+        58515: 37628,
+        58516: 37629,
+        58517: 37630,
+        58518: 37631,
+        58519: 37632,
+        58520: 37633,
+        58521: 37634,
+        58522: 37635,
+        58523: 37636,
+        58524: 37637,
+        58525: 37638,
+        58526: 37639,
+        58527: 37640,
+        58528: 37641,
+        58529: 27961,
+        58530: 27943,
+        58531: 27916,
+        58532: 27971,
+        58533: 27976,
+        58534: 27911,
+        58535: 27908,
+        58536: 27929,
+        58537: 27918,
+        58538: 27947,
+        58539: 27981,
+        58540: 27950,
+        58541: 27957,
+        58542: 27930,
+        58543: 27983,
+        58544: 27986,
+        58545: 27988,
+        58546: 27955,
+        58547: 28049,
+        58548: 28015,
+        58549: 28062,
+        58550: 28064,
+        58551: 27998,
+        58552: 28051,
+        58553: 28052,
+        58554: 27996,
+        58555: 28000,
+        58556: 28028,
+        58557: 28003,
+        58558: 28186,
+        58559: 28103,
+        58560: 28101,
+        58561: 28126,
+        58562: 28174,
+        58563: 28095,
+        58564: 28128,
+        58565: 28177,
+        58566: 28134,
+        58567: 28125,
+        58568: 28121,
+        58569: 28182,
+        58570: 28075,
+        58571: 28172,
+        58572: 28078,
+        58573: 28203,
+        58574: 28270,
+        58575: 28238,
+        58576: 28267,
+        58577: 28338,
+        58578: 28255,
+        58579: 28294,
+        58580: 28243,
+        58581: 28244,
+        58582: 28210,
+        58583: 28197,
+        58584: 28228,
+        58585: 28383,
+        58586: 28337,
+        58587: 28312,
+        58588: 28384,
+        58589: 28461,
+        58590: 28386,
+        58591: 28325,
+        58592: 28327,
+        58593: 28349,
+        58594: 28347,
+        58595: 28343,
+        58596: 28375,
+        58597: 28340,
+        58598: 28367,
+        58599: 28303,
+        58600: 28354,
+        58601: 28319,
+        58602: 28514,
+        58603: 28486,
+        58604: 28487,
+        58605: 28452,
+        58606: 28437,
+        58607: 28409,
+        58608: 28463,
+        58609: 28470,
+        58610: 28491,
+        58611: 28532,
+        58612: 28458,
+        58613: 28425,
+        58614: 28457,
+        58615: 28553,
+        58616: 28557,
+        58617: 28556,
+        58618: 28536,
+        58619: 28530,
+        58620: 28540,
+        58621: 28538,
+        58622: 28625,
+        58688: 37642,
+        58689: 37643,
+        58690: 37644,
+        58691: 37645,
+        58692: 37646,
+        58693: 37647,
+        58694: 37648,
+        58695: 37649,
+        58696: 37650,
+        58697: 37651,
+        58698: 37652,
+        58699: 37653,
+        58700: 37654,
+        58701: 37655,
+        58702: 37656,
+        58703: 37657,
+        58704: 37658,
+        58705: 37659,
+        58706: 37660,
+        58707: 37661,
+        58708: 37662,
+        58709: 37663,
+        58710: 37664,
+        58711: 37665,
+        58712: 37666,
+        58713: 37667,
+        58714: 37668,
+        58715: 37669,
+        58716: 37670,
+        58717: 37671,
+        58718: 37672,
+        58719: 37673,
+        58720: 37674,
+        58721: 37675,
+        58722: 37676,
+        58723: 37677,
+        58724: 37678,
+        58725: 37679,
+        58726: 37680,
+        58727: 37681,
+        58728: 37682,
+        58729: 37683,
+        58730: 37684,
+        58731: 37685,
+        58732: 37686,
+        58733: 37687,
+        58734: 37688,
+        58735: 37689,
+        58736: 37690,
+        58737: 37691,
+        58738: 37692,
+        58739: 37693,
+        58740: 37695,
+        58741: 37696,
+        58742: 37697,
+        58743: 37698,
+        58744: 37699,
+        58745: 37700,
+        58746: 37701,
+        58747: 37702,
+        58748: 37703,
+        58749: 37704,
+        58750: 37705,
+        58752: 37706,
+        58753: 37707,
+        58754: 37708,
+        58755: 37709,
+        58756: 37710,
+        58757: 37711,
+        58758: 37712,
+        58759: 37713,
+        58760: 37714,
+        58761: 37715,
+        58762: 37716,
+        58763: 37717,
+        58764: 37718,
+        58765: 37719,
+        58766: 37720,
+        58767: 37721,
+        58768: 37722,
+        58769: 37723,
+        58770: 37724,
+        58771: 37725,
+        58772: 37726,
+        58773: 37727,
+        58774: 37728,
+        58775: 37729,
+        58776: 37730,
+        58777: 37731,
+        58778: 37732,
+        58779: 37733,
+        58780: 37734,
+        58781: 37735,
+        58782: 37736,
+        58783: 37737,
+        58784: 37739,
+        58785: 28617,
+        58786: 28583,
+        58787: 28601,
+        58788: 28598,
+        58789: 28610,
+        58790: 28641,
+        58791: 28654,
+        58792: 28638,
+        58793: 28640,
+        58794: 28655,
+        58795: 28698,
+        58796: 28707,
+        58797: 28699,
+        58798: 28729,
+        58799: 28725,
+        58800: 28751,
+        58801: 28766,
+        58802: 23424,
+        58803: 23428,
+        58804: 23445,
+        58805: 23443,
+        58806: 23461,
+        58807: 23480,
+        58808: 29999,
+        58809: 39582,
+        58810: 25652,
+        58811: 23524,
+        58812: 23534,
+        58813: 35120,
+        58814: 23536,
+        58815: 36423,
+        58816: 35591,
+        58817: 36790,
+        58818: 36819,
+        58819: 36821,
+        58820: 36837,
+        58821: 36846,
+        58822: 36836,
+        58823: 36841,
+        58824: 36838,
+        58825: 36851,
+        58826: 36840,
+        58827: 36869,
+        58828: 36868,
+        58829: 36875,
+        58830: 36902,
+        58831: 36881,
+        58832: 36877,
+        58833: 36886,
+        58834: 36897,
+        58835: 36917,
+        58836: 36918,
+        58837: 36909,
+        58838: 36911,
+        58839: 36932,
+        58840: 36945,
+        58841: 36946,
+        58842: 36944,
+        58843: 36968,
+        58844: 36952,
+        58845: 36962,
+        58846: 36955,
+        58847: 26297,
+        58848: 36980,
+        58849: 36989,
+        58850: 36994,
+        58851: 37000,
+        58852: 36995,
+        58853: 37003,
+        58854: 24400,
+        58855: 24407,
+        58856: 24406,
+        58857: 24408,
+        58858: 23611,
+        58859: 21675,
+        58860: 23632,
+        58861: 23641,
+        58862: 23409,
+        58863: 23651,
+        58864: 23654,
+        58865: 32700,
+        58866: 24362,
+        58867: 24361,
+        58868: 24365,
+        58869: 33396,
+        58870: 24380,
+        58871: 39739,
+        58872: 23662,
+        58873: 22913,
+        58874: 22915,
+        58875: 22925,
+        58876: 22953,
+        58877: 22954,
+        58878: 22947,
+        58944: 37740,
+        58945: 37741,
+        58946: 37742,
+        58947: 37743,
+        58948: 37744,
+        58949: 37745,
+        58950: 37746,
+        58951: 37747,
+        58952: 37748,
+        58953: 37749,
+        58954: 37750,
+        58955: 37751,
+        58956: 37752,
+        58957: 37753,
+        58958: 37754,
+        58959: 37755,
+        58960: 37756,
+        58961: 37757,
+        58962: 37758,
+        58963: 37759,
+        58964: 37760,
+        58965: 37761,
+        58966: 37762,
+        58967: 37763,
+        58968: 37764,
+        58969: 37765,
+        58970: 37766,
+        58971: 37767,
+        58972: 37768,
+        58973: 37769,
+        58974: 37770,
+        58975: 37771,
+        58976: 37772,
+        58977: 37773,
+        58978: 37774,
+        58979: 37776,
+        58980: 37777,
+        58981: 37778,
+        58982: 37779,
+        58983: 37780,
+        58984: 37781,
+        58985: 37782,
+        58986: 37783,
+        58987: 37784,
+        58988: 37785,
+        58989: 37786,
+        58990: 37787,
+        58991: 37788,
+        58992: 37789,
+        58993: 37790,
+        58994: 37791,
+        58995: 37792,
+        58996: 37793,
+        58997: 37794,
+        58998: 37795,
+        58999: 37796,
+        59000: 37797,
+        59001: 37798,
+        59002: 37799,
+        59003: 37800,
+        59004: 37801,
+        59005: 37802,
+        59006: 37803,
+        59008: 37804,
+        59009: 37805,
+        59010: 37806,
+        59011: 37807,
+        59012: 37808,
+        59013: 37809,
+        59014: 37810,
+        59015: 37811,
+        59016: 37812,
+        59017: 37813,
+        59018: 37814,
+        59019: 37815,
+        59020: 37816,
+        59021: 37817,
+        59022: 37818,
+        59023: 37819,
+        59024: 37820,
+        59025: 37821,
+        59026: 37822,
+        59027: 37823,
+        59028: 37824,
+        59029: 37825,
+        59030: 37826,
+        59031: 37827,
+        59032: 37828,
+        59033: 37829,
+        59034: 37830,
+        59035: 37831,
+        59036: 37832,
+        59037: 37833,
+        59038: 37835,
+        59039: 37836,
+        59040: 37837,
+        59041: 22935,
+        59042: 22986,
+        59043: 22955,
+        59044: 22942,
+        59045: 22948,
+        59046: 22994,
+        59047: 22962,
+        59048: 22959,
+        59049: 22999,
+        59050: 22974,
+        59051: 23045,
+        59052: 23046,
+        59053: 23005,
+        59054: 23048,
+        59055: 23011,
+        59056: 23000,
+        59057: 23033,
+        59058: 23052,
+        59059: 23049,
+        59060: 23090,
+        59061: 23092,
+        59062: 23057,
+        59063: 23075,
+        59064: 23059,
+        59065: 23104,
+        59066: 23143,
+        59067: 23114,
+        59068: 23125,
+        59069: 23100,
+        59070: 23138,
+        59071: 23157,
+        59072: 33004,
+        59073: 23210,
+        59074: 23195,
+        59075: 23159,
+        59076: 23162,
+        59077: 23230,
+        59078: 23275,
+        59079: 23218,
+        59080: 23250,
+        59081: 23252,
+        59082: 23224,
+        59083: 23264,
+        59084: 23267,
+        59085: 23281,
+        59086: 23254,
+        59087: 23270,
+        59088: 23256,
+        59089: 23260,
+        59090: 23305,
+        59091: 23319,
+        59092: 23318,
+        59093: 23346,
+        59094: 23351,
+        59095: 23360,
+        59096: 23573,
+        59097: 23580,
+        59098: 23386,
+        59099: 23397,
+        59100: 23411,
+        59101: 23377,
+        59102: 23379,
+        59103: 23394,
+        59104: 39541,
+        59105: 39543,
+        59106: 39544,
+        59107: 39546,
+        59108: 39551,
+        59109: 39549,
+        59110: 39552,
+        59111: 39553,
+        59112: 39557,
+        59113: 39560,
+        59114: 39562,
+        59115: 39568,
+        59116: 39570,
+        59117: 39571,
+        59118: 39574,
+        59119: 39576,
+        59120: 39579,
+        59121: 39580,
+        59122: 39581,
+        59123: 39583,
+        59124: 39584,
+        59125: 39586,
+        59126: 39587,
+        59127: 39589,
+        59128: 39591,
+        59129: 32415,
+        59130: 32417,
+        59131: 32419,
+        59132: 32421,
+        59133: 32424,
+        59134: 32425,
+        59200: 37838,
+        59201: 37839,
+        59202: 37840,
+        59203: 37841,
+        59204: 37842,
+        59205: 37843,
+        59206: 37844,
+        59207: 37845,
+        59208: 37847,
+        59209: 37848,
+        59210: 37849,
+        59211: 37850,
+        59212: 37851,
+        59213: 37852,
+        59214: 37853,
+        59215: 37854,
+        59216: 37855,
+        59217: 37856,
+        59218: 37857,
+        59219: 37858,
+        59220: 37859,
+        59221: 37860,
+        59222: 37861,
+        59223: 37862,
+        59224: 37863,
+        59225: 37864,
+        59226: 37865,
+        59227: 37866,
+        59228: 37867,
+        59229: 37868,
+        59230: 37869,
+        59231: 37870,
+        59232: 37871,
+        59233: 37872,
+        59234: 37873,
+        59235: 37874,
+        59236: 37875,
+        59237: 37876,
+        59238: 37877,
+        59239: 37878,
+        59240: 37879,
+        59241: 37880,
+        59242: 37881,
+        59243: 37882,
+        59244: 37883,
+        59245: 37884,
+        59246: 37885,
+        59247: 37886,
+        59248: 37887,
+        59249: 37888,
+        59250: 37889,
+        59251: 37890,
+        59252: 37891,
+        59253: 37892,
+        59254: 37893,
+        59255: 37894,
+        59256: 37895,
+        59257: 37896,
+        59258: 37897,
+        59259: 37898,
+        59260: 37899,
+        59261: 37900,
+        59262: 37901,
+        59264: 37902,
+        59265: 37903,
+        59266: 37904,
+        59267: 37905,
+        59268: 37906,
+        59269: 37907,
+        59270: 37908,
+        59271: 37909,
+        59272: 37910,
+        59273: 37911,
+        59274: 37912,
+        59275: 37913,
+        59276: 37914,
+        59277: 37915,
+        59278: 37916,
+        59279: 37917,
+        59280: 37918,
+        59281: 37919,
+        59282: 37920,
+        59283: 37921,
+        59284: 37922,
+        59285: 37923,
+        59286: 37924,
+        59287: 37925,
+        59288: 37926,
+        59289: 37927,
+        59290: 37928,
+        59291: 37929,
+        59292: 37930,
+        59293: 37931,
+        59294: 37932,
+        59295: 37933,
+        59296: 37934,
+        59297: 32429,
+        59298: 32432,
+        59299: 32446,
+        59300: 32448,
+        59301: 32449,
+        59302: 32450,
+        59303: 32457,
+        59304: 32459,
+        59305: 32460,
+        59306: 32464,
+        59307: 32468,
+        59308: 32471,
+        59309: 32475,
+        59310: 32480,
+        59311: 32481,
+        59312: 32488,
+        59313: 32491,
+        59314: 32494,
+        59315: 32495,
+        59316: 32497,
+        59317: 32498,
+        59318: 32525,
+        59319: 32502,
+        59320: 32506,
+        59321: 32507,
+        59322: 32510,
+        59323: 32513,
+        59324: 32514,
+        59325: 32515,
+        59326: 32519,
+        59327: 32520,
+        59328: 32523,
+        59329: 32524,
+        59330: 32527,
+        59331: 32529,
+        59332: 32530,
+        59333: 32535,
+        59334: 32537,
+        59335: 32540,
+        59336: 32539,
+        59337: 32543,
+        59338: 32545,
+        59339: 32546,
+        59340: 32547,
+        59341: 32548,
+        59342: 32549,
+        59343: 32550,
+        59344: 32551,
+        59345: 32554,
+        59346: 32555,
+        59347: 32556,
+        59348: 32557,
+        59349: 32559,
+        59350: 32560,
+        59351: 32561,
+        59352: 32562,
+        59353: 32563,
+        59354: 32565,
+        59355: 24186,
+        59356: 30079,
+        59357: 24027,
+        59358: 30014,
+        59359: 37013,
+        59360: 29582,
+        59361: 29585,
+        59362: 29614,
+        59363: 29602,
+        59364: 29599,
+        59365: 29647,
+        59366: 29634,
+        59367: 29649,
+        59368: 29623,
+        59369: 29619,
+        59370: 29632,
+        59371: 29641,
+        59372: 29640,
+        59373: 29669,
+        59374: 29657,
+        59375: 39036,
+        59376: 29706,
+        59377: 29673,
+        59378: 29671,
+        59379: 29662,
+        59380: 29626,
+        59381: 29682,
+        59382: 29711,
+        59383: 29738,
+        59384: 29787,
+        59385: 29734,
+        59386: 29733,
+        59387: 29736,
+        59388: 29744,
+        59389: 29742,
+        59390: 29740,
+        59456: 37935,
+        59457: 37936,
+        59458: 37937,
+        59459: 37938,
+        59460: 37939,
+        59461: 37940,
+        59462: 37941,
+        59463: 37942,
+        59464: 37943,
+        59465: 37944,
+        59466: 37945,
+        59467: 37946,
+        59468: 37947,
+        59469: 37948,
+        59470: 37949,
+        59471: 37951,
+        59472: 37952,
+        59473: 37953,
+        59474: 37954,
+        59475: 37955,
+        59476: 37956,
+        59477: 37957,
+        59478: 37958,
+        59479: 37959,
+        59480: 37960,
+        59481: 37961,
+        59482: 37962,
+        59483: 37963,
+        59484: 37964,
+        59485: 37965,
+        59486: 37966,
+        59487: 37967,
+        59488: 37968,
+        59489: 37969,
+        59490: 37970,
+        59491: 37971,
+        59492: 37972,
+        59493: 37973,
+        59494: 37974,
+        59495: 37975,
+        59496: 37976,
+        59497: 37977,
+        59498: 37978,
+        59499: 37979,
+        59500: 37980,
+        59501: 37981,
+        59502: 37982,
+        59503: 37983,
+        59504: 37984,
+        59505: 37985,
+        59506: 37986,
+        59507: 37987,
+        59508: 37988,
+        59509: 37989,
+        59510: 37990,
+        59511: 37991,
+        59512: 37992,
+        59513: 37993,
+        59514: 37994,
+        59515: 37996,
+        59516: 37997,
+        59517: 37998,
+        59518: 37999,
+        59520: 38000,
+        59521: 38001,
+        59522: 38002,
+        59523: 38003,
+        59524: 38004,
+        59525: 38005,
+        59526: 38006,
+        59527: 38007,
+        59528: 38008,
+        59529: 38009,
+        59530: 38010,
+        59531: 38011,
+        59532: 38012,
+        59533: 38013,
+        59534: 38014,
+        59535: 38015,
+        59536: 38016,
+        59537: 38017,
+        59538: 38018,
+        59539: 38019,
+        59540: 38020,
+        59541: 38033,
+        59542: 38038,
+        59543: 38040,
+        59544: 38087,
+        59545: 38095,
+        59546: 38099,
+        59547: 38100,
+        59548: 38106,
+        59549: 38118,
+        59550: 38139,
+        59551: 38172,
+        59552: 38176,
+        59553: 29723,
+        59554: 29722,
+        59555: 29761,
+        59556: 29788,
+        59557: 29783,
+        59558: 29781,
+        59559: 29785,
+        59560: 29815,
+        59561: 29805,
+        59562: 29822,
+        59563: 29852,
+        59564: 29838,
+        59565: 29824,
+        59566: 29825,
+        59567: 29831,
+        59568: 29835,
+        59569: 29854,
+        59570: 29864,
+        59571: 29865,
+        59572: 29840,
+        59573: 29863,
+        59574: 29906,
+        59575: 29882,
+        59576: 38890,
+        59577: 38891,
+        59578: 38892,
+        59579: 26444,
+        59580: 26451,
+        59581: 26462,
+        59582: 26440,
+        59583: 26473,
+        59584: 26533,
+        59585: 26503,
+        59586: 26474,
+        59587: 26483,
+        59588: 26520,
+        59589: 26535,
+        59590: 26485,
+        59591: 26536,
+        59592: 26526,
+        59593: 26541,
+        59594: 26507,
+        59595: 26487,
+        59596: 26492,
+        59597: 26608,
+        59598: 26633,
+        59599: 26584,
+        59600: 26634,
+        59601: 26601,
+        59602: 26544,
+        59603: 26636,
+        59604: 26585,
+        59605: 26549,
+        59606: 26586,
+        59607: 26547,
+        59608: 26589,
+        59609: 26624,
+        59610: 26563,
+        59611: 26552,
+        59612: 26594,
+        59613: 26638,
+        59614: 26561,
+        59615: 26621,
+        59616: 26674,
+        59617: 26675,
+        59618: 26720,
+        59619: 26721,
+        59620: 26702,
+        59621: 26722,
+        59622: 26692,
+        59623: 26724,
+        59624: 26755,
+        59625: 26653,
+        59626: 26709,
+        59627: 26726,
+        59628: 26689,
+        59629: 26727,
+        59630: 26688,
+        59631: 26686,
+        59632: 26698,
+        59633: 26697,
+        59634: 26665,
+        59635: 26805,
+        59636: 26767,
+        59637: 26740,
+        59638: 26743,
+        59639: 26771,
+        59640: 26731,
+        59641: 26818,
+        59642: 26990,
+        59643: 26876,
+        59644: 26911,
+        59645: 26912,
+        59646: 26873,
+        59712: 38183,
+        59713: 38195,
+        59714: 38205,
+        59715: 38211,
+        59716: 38216,
+        59717: 38219,
+        59718: 38229,
+        59719: 38234,
+        59720: 38240,
+        59721: 38254,
+        59722: 38260,
+        59723: 38261,
+        59724: 38263,
+        59725: 38264,
+        59726: 38265,
+        59727: 38266,
+        59728: 38267,
+        59729: 38268,
+        59730: 38269,
+        59731: 38270,
+        59732: 38272,
+        59733: 38273,
+        59734: 38274,
+        59735: 38275,
+        59736: 38276,
+        59737: 38277,
+        59738: 38278,
+        59739: 38279,
+        59740: 38280,
+        59741: 38281,
+        59742: 38282,
+        59743: 38283,
+        59744: 38284,
+        59745: 38285,
+        59746: 38286,
+        59747: 38287,
+        59748: 38288,
+        59749: 38289,
+        59750: 38290,
+        59751: 38291,
+        59752: 38292,
+        59753: 38293,
+        59754: 38294,
+        59755: 38295,
+        59756: 38296,
+        59757: 38297,
+        59758: 38298,
+        59759: 38299,
+        59760: 38300,
+        59761: 38301,
+        59762: 38302,
+        59763: 38303,
+        59764: 38304,
+        59765: 38305,
+        59766: 38306,
+        59767: 38307,
+        59768: 38308,
+        59769: 38309,
+        59770: 38310,
+        59771: 38311,
+        59772: 38312,
+        59773: 38313,
+        59774: 38314,
+        59776: 38315,
+        59777: 38316,
+        59778: 38317,
+        59779: 38318,
+        59780: 38319,
+        59781: 38320,
+        59782: 38321,
+        59783: 38322,
+        59784: 38323,
+        59785: 38324,
+        59786: 38325,
+        59787: 38326,
+        59788: 38327,
+        59789: 38328,
+        59790: 38329,
+        59791: 38330,
+        59792: 38331,
+        59793: 38332,
+        59794: 38333,
+        59795: 38334,
+        59796: 38335,
+        59797: 38336,
+        59798: 38337,
+        59799: 38338,
+        59800: 38339,
+        59801: 38340,
+        59802: 38341,
+        59803: 38342,
+        59804: 38343,
+        59805: 38344,
+        59806: 38345,
+        59807: 38346,
+        59808: 38347,
+        59809: 26916,
+        59810: 26864,
+        59811: 26891,
+        59812: 26881,
+        59813: 26967,
+        59814: 26851,
+        59815: 26896,
+        59816: 26993,
+        59817: 26937,
+        59818: 26976,
+        59819: 26946,
+        59820: 26973,
+        59821: 27012,
+        59822: 26987,
+        59823: 27008,
+        59824: 27032,
+        59825: 27000,
+        59826: 26932,
+        59827: 27084,
+        59828: 27015,
+        59829: 27016,
+        59830: 27086,
+        59831: 27017,
+        59832: 26982,
+        59833: 26979,
+        59834: 27001,
+        59835: 27035,
+        59836: 27047,
+        59837: 27067,
+        59838: 27051,
+        59839: 27053,
+        59840: 27092,
+        59841: 27057,
+        59842: 27073,
+        59843: 27082,
+        59844: 27103,
+        59845: 27029,
+        59846: 27104,
+        59847: 27021,
+        59848: 27135,
+        59849: 27183,
+        59850: 27117,
+        59851: 27159,
+        59852: 27160,
+        59853: 27237,
+        59854: 27122,
+        59855: 27204,
+        59856: 27198,
+        59857: 27296,
+        59858: 27216,
+        59859: 27227,
+        59860: 27189,
+        59861: 27278,
+        59862: 27257,
+        59863: 27197,
+        59864: 27176,
+        59865: 27224,
+        59866: 27260,
+        59867: 27281,
+        59868: 27280,
+        59869: 27305,
+        59870: 27287,
+        59871: 27307,
+        59872: 29495,
+        59873: 29522,
+        59874: 27521,
+        59875: 27522,
+        59876: 27527,
+        59877: 27524,
+        59878: 27538,
+        59879: 27539,
+        59880: 27533,
+        59881: 27546,
+        59882: 27547,
+        59883: 27553,
+        59884: 27562,
+        59885: 36715,
+        59886: 36717,
+        59887: 36721,
+        59888: 36722,
+        59889: 36723,
+        59890: 36725,
+        59891: 36726,
+        59892: 36728,
+        59893: 36727,
+        59894: 36729,
+        59895: 36730,
+        59896: 36732,
+        59897: 36734,
+        59898: 36737,
+        59899: 36738,
+        59900: 36740,
+        59901: 36743,
+        59902: 36747,
+        59968: 38348,
+        59969: 38349,
+        59970: 38350,
+        59971: 38351,
+        59972: 38352,
+        59973: 38353,
+        59974: 38354,
+        59975: 38355,
+        59976: 38356,
+        59977: 38357,
+        59978: 38358,
+        59979: 38359,
+        59980: 38360,
+        59981: 38361,
+        59982: 38362,
+        59983: 38363,
+        59984: 38364,
+        59985: 38365,
+        59986: 38366,
+        59987: 38367,
+        59988: 38368,
+        59989: 38369,
+        59990: 38370,
+        59991: 38371,
+        59992: 38372,
+        59993: 38373,
+        59994: 38374,
+        59995: 38375,
+        59996: 38380,
+        59997: 38399,
+        59998: 38407,
+        59999: 38419,
+        60000: 38424,
+        60001: 38427,
+        60002: 38430,
+        60003: 38432,
+        60004: 38435,
+        60005: 38436,
+        60006: 38437,
+        60007: 38438,
+        60008: 38439,
+        60009: 38440,
+        60010: 38441,
+        60011: 38443,
+        60012: 38444,
+        60013: 38445,
+        60014: 38447,
+        60015: 38448,
+        60016: 38455,
+        60017: 38456,
+        60018: 38457,
+        60019: 38458,
+        60020: 38462,
+        60021: 38465,
+        60022: 38467,
+        60023: 38474,
+        60024: 38478,
+        60025: 38479,
+        60026: 38481,
+        60027: 38482,
+        60028: 38483,
+        60029: 38486,
+        60030: 38487,
+        60032: 38488,
+        60033: 38489,
+        60034: 38490,
+        60035: 38492,
+        60036: 38493,
+        60037: 38494,
+        60038: 38496,
+        60039: 38499,
+        60040: 38501,
+        60041: 38502,
+        60042: 38507,
+        60043: 38509,
+        60044: 38510,
+        60045: 38511,
+        60046: 38512,
+        60047: 38513,
+        60048: 38515,
+        60049: 38520,
+        60050: 38521,
+        60051: 38522,
+        60052: 38523,
+        60053: 38524,
+        60054: 38525,
+        60055: 38526,
+        60056: 38527,
+        60057: 38528,
+        60058: 38529,
+        60059: 38530,
+        60060: 38531,
+        60061: 38532,
+        60062: 38535,
+        60063: 38537,
+        60064: 38538,
+        60065: 36749,
+        60066: 36750,
+        60067: 36751,
+        60068: 36760,
+        60069: 36762,
+        60070: 36558,
+        60071: 25099,
+        60072: 25111,
+        60073: 25115,
+        60074: 25119,
+        60075: 25122,
+        60076: 25121,
+        60077: 25125,
+        60078: 25124,
+        60079: 25132,
+        60080: 33255,
+        60081: 29935,
+        60082: 29940,
+        60083: 29951,
+        60084: 29967,
+        60085: 29969,
+        60086: 29971,
+        60087: 25908,
+        60088: 26094,
+        60089: 26095,
+        60090: 26096,
+        60091: 26122,
+        60092: 26137,
+        60093: 26482,
+        60094: 26115,
+        60095: 26133,
+        60096: 26112,
+        60097: 28805,
+        60098: 26359,
+        60099: 26141,
+        60100: 26164,
+        60101: 26161,
+        60102: 26166,
+        60103: 26165,
+        60104: 32774,
+        60105: 26207,
+        60106: 26196,
+        60107: 26177,
+        60108: 26191,
+        60109: 26198,
+        60110: 26209,
+        60111: 26199,
+        60112: 26231,
+        60113: 26244,
+        60114: 26252,
+        60115: 26279,
+        60116: 26269,
+        60117: 26302,
+        60118: 26331,
+        60119: 26332,
+        60120: 26342,
+        60121: 26345,
+        60122: 36146,
+        60123: 36147,
+        60124: 36150,
+        60125: 36155,
+        60126: 36157,
+        60127: 36160,
+        60128: 36165,
+        60129: 36166,
+        60130: 36168,
+        60131: 36169,
+        60132: 36167,
+        60133: 36173,
+        60134: 36181,
+        60135: 36185,
+        60136: 35271,
+        60137: 35274,
+        60138: 35275,
+        60139: 35276,
+        60140: 35278,
+        60141: 35279,
+        60142: 35280,
+        60143: 35281,
+        60144: 29294,
+        60145: 29343,
+        60146: 29277,
+        60147: 29286,
+        60148: 29295,
+        60149: 29310,
+        60150: 29311,
+        60151: 29316,
+        60152: 29323,
+        60153: 29325,
+        60154: 29327,
+        60155: 29330,
+        60156: 25352,
+        60157: 25394,
+        60158: 25520,
+        60224: 38540,
+        60225: 38542,
+        60226: 38545,
+        60227: 38546,
+        60228: 38547,
+        60229: 38549,
+        60230: 38550,
+        60231: 38554,
+        60232: 38555,
+        60233: 38557,
+        60234: 38558,
+        60235: 38559,
+        60236: 38560,
+        60237: 38561,
+        60238: 38562,
+        60239: 38563,
+        60240: 38564,
+        60241: 38565,
+        60242: 38566,
+        60243: 38568,
+        60244: 38569,
+        60245: 38570,
+        60246: 38571,
+        60247: 38572,
+        60248: 38573,
+        60249: 38574,
+        60250: 38575,
+        60251: 38577,
+        60252: 38578,
+        60253: 38580,
+        60254: 38581,
+        60255: 38583,
+        60256: 38584,
+        60257: 38586,
+        60258: 38587,
+        60259: 38591,
+        60260: 38594,
+        60261: 38595,
+        60262: 38600,
+        60263: 38602,
+        60264: 38603,
+        60265: 38608,
+        60266: 38609,
+        60267: 38611,
+        60268: 38612,
+        60269: 38614,
+        60270: 38615,
+        60271: 38616,
+        60272: 38617,
+        60273: 38618,
+        60274: 38619,
+        60275: 38620,
+        60276: 38621,
+        60277: 38622,
+        60278: 38623,
+        60279: 38625,
+        60280: 38626,
+        60281: 38627,
+        60282: 38628,
+        60283: 38629,
+        60284: 38630,
+        60285: 38631,
+        60286: 38635,
+        60288: 38636,
+        60289: 38637,
+        60290: 38638,
+        60291: 38640,
+        60292: 38641,
+        60293: 38642,
+        60294: 38644,
+        60295: 38645,
+        60296: 38648,
+        60297: 38650,
+        60298: 38651,
+        60299: 38652,
+        60300: 38653,
+        60301: 38655,
+        60302: 38658,
+        60303: 38659,
+        60304: 38661,
+        60305: 38666,
+        60306: 38667,
+        60307: 38668,
+        60308: 38672,
+        60309: 38673,
+        60310: 38674,
+        60311: 38676,
+        60312: 38677,
+        60313: 38679,
+        60314: 38680,
+        60315: 38681,
+        60316: 38682,
+        60317: 38683,
+        60318: 38685,
+        60319: 38687,
+        60320: 38688,
+        60321: 25663,
+        60322: 25816,
+        60323: 32772,
+        60324: 27626,
+        60325: 27635,
+        60326: 27645,
+        60327: 27637,
+        60328: 27641,
+        60329: 27653,
+        60330: 27655,
+        60331: 27654,
+        60332: 27661,
+        60333: 27669,
+        60334: 27672,
+        60335: 27673,
+        60336: 27674,
+        60337: 27681,
+        60338: 27689,
+        60339: 27684,
+        60340: 27690,
+        60341: 27698,
+        60342: 25909,
+        60343: 25941,
+        60344: 25963,
+        60345: 29261,
+        60346: 29266,
+        60347: 29270,
+        60348: 29232,
+        60349: 34402,
+        60350: 21014,
+        60351: 32927,
+        60352: 32924,
+        60353: 32915,
+        60354: 32956,
+        60355: 26378,
+        60356: 32957,
+        60357: 32945,
+        60358: 32939,
+        60359: 32941,
+        60360: 32948,
+        60361: 32951,
+        60362: 32999,
+        60363: 33000,
+        60364: 33001,
+        60365: 33002,
+        60366: 32987,
+        60367: 32962,
+        60368: 32964,
+        60369: 32985,
+        60370: 32973,
+        60371: 32983,
+        60372: 26384,
+        60373: 32989,
+        60374: 33003,
+        60375: 33009,
+        60376: 33012,
+        60377: 33005,
+        60378: 33037,
+        60379: 33038,
+        60380: 33010,
+        60381: 33020,
+        60382: 26389,
+        60383: 33042,
+        60384: 35930,
+        60385: 33078,
+        60386: 33054,
+        60387: 33068,
+        60388: 33048,
+        60389: 33074,
+        60390: 33096,
+        60391: 33100,
+        60392: 33107,
+        60393: 33140,
+        60394: 33113,
+        60395: 33114,
+        60396: 33137,
+        60397: 33120,
+        60398: 33129,
+        60399: 33148,
+        60400: 33149,
+        60401: 33133,
+        60402: 33127,
+        60403: 22605,
+        60404: 23221,
+        60405: 33160,
+        60406: 33154,
+        60407: 33169,
+        60408: 28373,
+        60409: 33187,
+        60410: 33194,
+        60411: 33228,
+        60412: 26406,
+        60413: 33226,
+        60414: 33211,
+        60480: 38689,
+        60481: 38690,
+        60482: 38691,
+        60483: 38692,
+        60484: 38693,
+        60485: 38694,
+        60486: 38695,
+        60487: 38696,
+        60488: 38697,
+        60489: 38699,
+        60490: 38700,
+        60491: 38702,
+        60492: 38703,
+        60493: 38705,
+        60494: 38707,
+        60495: 38708,
+        60496: 38709,
+        60497: 38710,
+        60498: 38711,
+        60499: 38714,
+        60500: 38715,
+        60501: 38716,
+        60502: 38717,
+        60503: 38719,
+        60504: 38720,
+        60505: 38721,
+        60506: 38722,
+        60507: 38723,
+        60508: 38724,
+        60509: 38725,
+        60510: 38726,
+        60511: 38727,
+        60512: 38728,
+        60513: 38729,
+        60514: 38730,
+        60515: 38731,
+        60516: 38732,
+        60517: 38733,
+        60518: 38734,
+        60519: 38735,
+        60520: 38736,
+        60521: 38737,
+        60522: 38740,
+        60523: 38741,
+        60524: 38743,
+        60525: 38744,
+        60526: 38746,
+        60527: 38748,
+        60528: 38749,
+        60529: 38751,
+        60530: 38755,
+        60531: 38756,
+        60532: 38758,
+        60533: 38759,
+        60534: 38760,
+        60535: 38762,
+        60536: 38763,
+        60537: 38764,
+        60538: 38765,
+        60539: 38766,
+        60540: 38767,
+        60541: 38768,
+        60542: 38769,
+        60544: 38770,
+        60545: 38773,
+        60546: 38775,
+        60547: 38776,
+        60548: 38777,
+        60549: 38778,
+        60550: 38779,
+        60551: 38781,
+        60552: 38782,
+        60553: 38783,
+        60554: 38784,
+        60555: 38785,
+        60556: 38786,
+        60557: 38787,
+        60558: 38788,
+        60559: 38790,
+        60560: 38791,
+        60561: 38792,
+        60562: 38793,
+        60563: 38794,
+        60564: 38796,
+        60565: 38798,
+        60566: 38799,
+        60567: 38800,
+        60568: 38803,
+        60569: 38805,
+        60570: 38806,
+        60571: 38807,
+        60572: 38809,
+        60573: 38810,
+        60574: 38811,
+        60575: 38812,
+        60576: 38813,
+        60577: 33217,
+        60578: 33190,
+        60579: 27428,
+        60580: 27447,
+        60581: 27449,
+        60582: 27459,
+        60583: 27462,
+        60584: 27481,
+        60585: 39121,
+        60586: 39122,
+        60587: 39123,
+        60588: 39125,
+        60589: 39129,
+        60590: 39130,
+        60591: 27571,
+        60592: 24384,
+        60593: 27586,
+        60594: 35315,
+        60595: 26000,
+        60596: 40785,
+        60597: 26003,
+        60598: 26044,
+        60599: 26054,
+        60600: 26052,
+        60601: 26051,
+        60602: 26060,
+        60603: 26062,
+        60604: 26066,
+        60605: 26070,
+        60606: 28800,
+        60607: 28828,
+        60608: 28822,
+        60609: 28829,
+        60610: 28859,
+        60611: 28864,
+        60612: 28855,
+        60613: 28843,
+        60614: 28849,
+        60615: 28904,
+        60616: 28874,
+        60617: 28944,
+        60618: 28947,
+        60619: 28950,
+        60620: 28975,
+        60621: 28977,
+        60622: 29043,
+        60623: 29020,
+        60624: 29032,
+        60625: 28997,
+        60626: 29042,
+        60627: 29002,
+        60628: 29048,
+        60629: 29050,
+        60630: 29080,
+        60631: 29107,
+        60632: 29109,
+        60633: 29096,
+        60634: 29088,
+        60635: 29152,
+        60636: 29140,
+        60637: 29159,
+        60638: 29177,
+        60639: 29213,
+        60640: 29224,
+        60641: 28780,
+        60642: 28952,
+        60643: 29030,
+        60644: 29113,
+        60645: 25150,
+        60646: 25149,
+        60647: 25155,
+        60648: 25160,
+        60649: 25161,
+        60650: 31035,
+        60651: 31040,
+        60652: 31046,
+        60653: 31049,
+        60654: 31067,
+        60655: 31068,
+        60656: 31059,
+        60657: 31066,
+        60658: 31074,
+        60659: 31063,
+        60660: 31072,
+        60661: 31087,
+        60662: 31079,
+        60663: 31098,
+        60664: 31109,
+        60665: 31114,
+        60666: 31130,
+        60667: 31143,
+        60668: 31155,
+        60669: 24529,
+        60670: 24528,
+        60736: 38814,
+        60737: 38815,
+        60738: 38817,
+        60739: 38818,
+        60740: 38820,
+        60741: 38821,
+        60742: 38822,
+        60743: 38823,
+        60744: 38824,
+        60745: 38825,
+        60746: 38826,
+        60747: 38828,
+        60748: 38830,
+        60749: 38832,
+        60750: 38833,
+        60751: 38835,
+        60752: 38837,
+        60753: 38838,
+        60754: 38839,
+        60755: 38840,
+        60756: 38841,
+        60757: 38842,
+        60758: 38843,
+        60759: 38844,
+        60760: 38845,
+        60761: 38846,
+        60762: 38847,
+        60763: 38848,
+        60764: 38849,
+        60765: 38850,
+        60766: 38851,
+        60767: 38852,
+        60768: 38853,
+        60769: 38854,
+        60770: 38855,
+        60771: 38856,
+        60772: 38857,
+        60773: 38858,
+        60774: 38859,
+        60775: 38860,
+        60776: 38861,
+        60777: 38862,
+        60778: 38863,
+        60779: 38864,
+        60780: 38865,
+        60781: 38866,
+        60782: 38867,
+        60783: 38868,
+        60784: 38869,
+        60785: 38870,
+        60786: 38871,
+        60787: 38872,
+        60788: 38873,
+        60789: 38874,
+        60790: 38875,
+        60791: 38876,
+        60792: 38877,
+        60793: 38878,
+        60794: 38879,
+        60795: 38880,
+        60796: 38881,
+        60797: 38882,
+        60798: 38883,
+        60800: 38884,
+        60801: 38885,
+        60802: 38888,
+        60803: 38894,
+        60804: 38895,
+        60805: 38896,
+        60806: 38897,
+        60807: 38898,
+        60808: 38900,
+        60809: 38903,
+        60810: 38904,
+        60811: 38905,
+        60812: 38906,
+        60813: 38907,
+        60814: 38908,
+        60815: 38909,
+        60816: 38910,
+        60817: 38911,
+        60818: 38912,
+        60819: 38913,
+        60820: 38914,
+        60821: 38915,
+        60822: 38916,
+        60823: 38917,
+        60824: 38918,
+        60825: 38919,
+        60826: 38920,
+        60827: 38921,
+        60828: 38922,
+        60829: 38923,
+        60830: 38924,
+        60831: 38925,
+        60832: 38926,
+        60833: 24636,
+        60834: 24669,
+        60835: 24666,
+        60836: 24679,
+        60837: 24641,
+        60838: 24665,
+        60839: 24675,
+        60840: 24747,
+        60841: 24838,
+        60842: 24845,
+        60843: 24925,
+        60844: 25001,
+        60845: 24989,
+        60846: 25035,
+        60847: 25041,
+        60848: 25094,
+        60849: 32896,
+        60850: 32895,
+        60851: 27795,
+        60852: 27894,
+        60853: 28156,
+        60854: 30710,
+        60855: 30712,
+        60856: 30720,
+        60857: 30729,
+        60858: 30743,
+        60859: 30744,
+        60860: 30737,
+        60861: 26027,
+        60862: 30765,
+        60863: 30748,
+        60864: 30749,
+        60865: 30777,
+        60866: 30778,
+        60867: 30779,
+        60868: 30751,
+        60869: 30780,
+        60870: 30757,
+        60871: 30764,
+        60872: 30755,
+        60873: 30761,
+        60874: 30798,
+        60875: 30829,
+        60876: 30806,
+        60877: 30807,
+        60878: 30758,
+        60879: 30800,
+        60880: 30791,
+        60881: 30796,
+        60882: 30826,
+        60883: 30875,
+        60884: 30867,
+        60885: 30874,
+        60886: 30855,
+        60887: 30876,
+        60888: 30881,
+        60889: 30883,
+        60890: 30898,
+        60891: 30905,
+        60892: 30885,
+        60893: 30932,
+        60894: 30937,
+        60895: 30921,
+        60896: 30956,
+        60897: 30962,
+        60898: 30981,
+        60899: 30964,
+        60900: 30995,
+        60901: 31012,
+        60902: 31006,
+        60903: 31028,
+        60904: 40859,
+        60905: 40697,
+        60906: 40699,
+        60907: 40700,
+        60908: 30449,
+        60909: 30468,
+        60910: 30477,
+        60911: 30457,
+        60912: 30471,
+        60913: 30472,
+        60914: 30490,
+        60915: 30498,
+        60916: 30489,
+        60917: 30509,
+        60918: 30502,
+        60919: 30517,
+        60920: 30520,
+        60921: 30544,
+        60922: 30545,
+        60923: 30535,
+        60924: 30531,
+        60925: 30554,
+        60926: 30568,
+        60992: 38927,
+        60993: 38928,
+        60994: 38929,
+        60995: 38930,
+        60996: 38931,
+        60997: 38932,
+        60998: 38933,
+        60999: 38934,
+        61000: 38935,
+        61001: 38936,
+        61002: 38937,
+        61003: 38938,
+        61004: 38939,
+        61005: 38940,
+        61006: 38941,
+        61007: 38942,
+        61008: 38943,
+        61009: 38944,
+        61010: 38945,
+        61011: 38946,
+        61012: 38947,
+        61013: 38948,
+        61014: 38949,
+        61015: 38950,
+        61016: 38951,
+        61017: 38952,
+        61018: 38953,
+        61019: 38954,
+        61020: 38955,
+        61021: 38956,
+        61022: 38957,
+        61023: 38958,
+        61024: 38959,
+        61025: 38960,
+        61026: 38961,
+        61027: 38962,
+        61028: 38963,
+        61029: 38964,
+        61030: 38965,
+        61031: 38966,
+        61032: 38967,
+        61033: 38968,
+        61034: 38969,
+        61035: 38970,
+        61036: 38971,
+        61037: 38972,
+        61038: 38973,
+        61039: 38974,
+        61040: 38975,
+        61041: 38976,
+        61042: 38977,
+        61043: 38978,
+        61044: 38979,
+        61045: 38980,
+        61046: 38981,
+        61047: 38982,
+        61048: 38983,
+        61049: 38984,
+        61050: 38985,
+        61051: 38986,
+        61052: 38987,
+        61053: 38988,
+        61054: 38989,
+        61056: 38990,
+        61057: 38991,
+        61058: 38992,
+        61059: 38993,
+        61060: 38994,
+        61061: 38995,
+        61062: 38996,
+        61063: 38997,
+        61064: 38998,
+        61065: 38999,
+        61066: 39000,
+        61067: 39001,
+        61068: 39002,
+        61069: 39003,
+        61070: 39004,
+        61071: 39005,
+        61072: 39006,
+        61073: 39007,
+        61074: 39008,
+        61075: 39009,
+        61076: 39010,
+        61077: 39011,
+        61078: 39012,
+        61079: 39013,
+        61080: 39014,
+        61081: 39015,
+        61082: 39016,
+        61083: 39017,
+        61084: 39018,
+        61085: 39019,
+        61086: 39020,
+        61087: 39021,
+        61088: 39022,
+        61089: 30562,
+        61090: 30565,
+        61091: 30591,
+        61092: 30605,
+        61093: 30589,
+        61094: 30592,
+        61095: 30604,
+        61096: 30609,
+        61097: 30623,
+        61098: 30624,
+        61099: 30640,
+        61100: 30645,
+        61101: 30653,
+        61102: 30010,
+        61103: 30016,
+        61104: 30030,
+        61105: 30027,
+        61106: 30024,
+        61107: 30043,
+        61108: 30066,
+        61109: 30073,
+        61110: 30083,
+        61111: 32600,
+        61112: 32609,
+        61113: 32607,
+        61114: 35400,
+        61115: 32616,
+        61116: 32628,
+        61117: 32625,
+        61118: 32633,
+        61119: 32641,
+        61120: 32638,
+        61121: 30413,
+        61122: 30437,
+        61123: 34866,
+        61124: 38021,
+        61125: 38022,
+        61126: 38023,
+        61127: 38027,
+        61128: 38026,
+        61129: 38028,
+        61130: 38029,
+        61131: 38031,
+        61132: 38032,
+        61133: 38036,
+        61134: 38039,
+        61135: 38037,
+        61136: 38042,
+        61137: 38043,
+        61138: 38044,
+        61139: 38051,
+        61140: 38052,
+        61141: 38059,
+        61142: 38058,
+        61143: 38061,
+        61144: 38060,
+        61145: 38063,
+        61146: 38064,
+        61147: 38066,
+        61148: 38068,
+        61149: 38070,
+        61150: 38071,
+        61151: 38072,
+        61152: 38073,
+        61153: 38074,
+        61154: 38076,
+        61155: 38077,
+        61156: 38079,
+        61157: 38084,
+        61158: 38088,
+        61159: 38089,
+        61160: 38090,
+        61161: 38091,
+        61162: 38092,
+        61163: 38093,
+        61164: 38094,
+        61165: 38096,
+        61166: 38097,
+        61167: 38098,
+        61168: 38101,
+        61169: 38102,
+        61170: 38103,
+        61171: 38105,
+        61172: 38104,
+        61173: 38107,
+        61174: 38110,
+        61175: 38111,
+        61176: 38112,
+        61177: 38114,
+        61178: 38116,
+        61179: 38117,
+        61180: 38119,
+        61181: 38120,
+        61182: 38122,
+        61248: 39023,
+        61249: 39024,
+        61250: 39025,
+        61251: 39026,
+        61252: 39027,
+        61253: 39028,
+        61254: 39051,
+        61255: 39054,
+        61256: 39058,
+        61257: 39061,
+        61258: 39065,
+        61259: 39075,
+        61260: 39080,
+        61261: 39081,
+        61262: 39082,
+        61263: 39083,
+        61264: 39084,
+        61265: 39085,
+        61266: 39086,
+        61267: 39087,
+        61268: 39088,
+        61269: 39089,
+        61270: 39090,
+        61271: 39091,
+        61272: 39092,
+        61273: 39093,
+        61274: 39094,
+        61275: 39095,
+        61276: 39096,
+        61277: 39097,
+        61278: 39098,
+        61279: 39099,
+        61280: 39100,
+        61281: 39101,
+        61282: 39102,
+        61283: 39103,
+        61284: 39104,
+        61285: 39105,
+        61286: 39106,
+        61287: 39107,
+        61288: 39108,
+        61289: 39109,
+        61290: 39110,
+        61291: 39111,
+        61292: 39112,
+        61293: 39113,
+        61294: 39114,
+        61295: 39115,
+        61296: 39116,
+        61297: 39117,
+        61298: 39119,
+        61299: 39120,
+        61300: 39124,
+        61301: 39126,
+        61302: 39127,
+        61303: 39131,
+        61304: 39132,
+        61305: 39133,
+        61306: 39136,
+        61307: 39137,
+        61308: 39138,
+        61309: 39139,
+        61310: 39140,
+        61312: 39141,
+        61313: 39142,
+        61314: 39145,
+        61315: 39146,
+        61316: 39147,
+        61317: 39148,
+        61318: 39149,
+        61319: 39150,
+        61320: 39151,
+        61321: 39152,
+        61322: 39153,
+        61323: 39154,
+        61324: 39155,
+        61325: 39156,
+        61326: 39157,
+        61327: 39158,
+        61328: 39159,
+        61329: 39160,
+        61330: 39161,
+        61331: 39162,
+        61332: 39163,
+        61333: 39164,
+        61334: 39165,
+        61335: 39166,
+        61336: 39167,
+        61337: 39168,
+        61338: 39169,
+        61339: 39170,
+        61340: 39171,
+        61341: 39172,
+        61342: 39173,
+        61343: 39174,
+        61344: 39175,
+        61345: 38121,
+        61346: 38123,
+        61347: 38126,
+        61348: 38127,
+        61349: 38131,
+        61350: 38132,
+        61351: 38133,
+        61352: 38135,
+        61353: 38137,
+        61354: 38140,
+        61355: 38141,
+        61356: 38143,
+        61357: 38147,
+        61358: 38146,
+        61359: 38150,
+        61360: 38151,
+        61361: 38153,
+        61362: 38154,
+        61363: 38157,
+        61364: 38158,
+        61365: 38159,
+        61366: 38162,
+        61367: 38163,
+        61368: 38164,
+        61369: 38165,
+        61370: 38166,
+        61371: 38168,
+        61372: 38171,
+        61373: 38173,
+        61374: 38174,
+        61375: 38175,
+        61376: 38178,
+        61377: 38186,
+        61378: 38187,
+        61379: 38185,
+        61380: 38188,
+        61381: 38193,
+        61382: 38194,
+        61383: 38196,
+        61384: 38198,
+        61385: 38199,
+        61386: 38200,
+        61387: 38204,
+        61388: 38206,
+        61389: 38207,
+        61390: 38210,
+        61391: 38197,
+        61392: 38212,
+        61393: 38213,
+        61394: 38214,
+        61395: 38217,
+        61396: 38220,
+        61397: 38222,
+        61398: 38223,
+        61399: 38226,
+        61400: 38227,
+        61401: 38228,
+        61402: 38230,
+        61403: 38231,
+        61404: 38232,
+        61405: 38233,
+        61406: 38235,
+        61407: 38238,
+        61408: 38239,
+        61409: 38237,
+        61410: 38241,
+        61411: 38242,
+        61412: 38244,
+        61413: 38245,
+        61414: 38246,
+        61415: 38247,
+        61416: 38248,
+        61417: 38249,
+        61418: 38250,
+        61419: 38251,
+        61420: 38252,
+        61421: 38255,
+        61422: 38257,
+        61423: 38258,
+        61424: 38259,
+        61425: 38202,
+        61426: 30695,
+        61427: 30700,
+        61428: 38601,
+        61429: 31189,
+        61430: 31213,
+        61431: 31203,
+        61432: 31211,
+        61433: 31238,
+        61434: 23879,
+        61435: 31235,
+        61436: 31234,
+        61437: 31262,
+        61438: 31252,
+        61504: 39176,
+        61505: 39177,
+        61506: 39178,
+        61507: 39179,
+        61508: 39180,
+        61509: 39182,
+        61510: 39183,
+        61511: 39185,
+        61512: 39186,
+        61513: 39187,
+        61514: 39188,
+        61515: 39189,
+        61516: 39190,
+        61517: 39191,
+        61518: 39192,
+        61519: 39193,
+        61520: 39194,
+        61521: 39195,
+        61522: 39196,
+        61523: 39197,
+        61524: 39198,
+        61525: 39199,
+        61526: 39200,
+        61527: 39201,
+        61528: 39202,
+        61529: 39203,
+        61530: 39204,
+        61531: 39205,
+        61532: 39206,
+        61533: 39207,
+        61534: 39208,
+        61535: 39209,
+        61536: 39210,
+        61537: 39211,
+        61538: 39212,
+        61539: 39213,
+        61540: 39215,
+        61541: 39216,
+        61542: 39217,
+        61543: 39218,
+        61544: 39219,
+        61545: 39220,
+        61546: 39221,
+        61547: 39222,
+        61548: 39223,
+        61549: 39224,
+        61550: 39225,
+        61551: 39226,
+        61552: 39227,
+        61553: 39228,
+        61554: 39229,
+        61555: 39230,
+        61556: 39231,
+        61557: 39232,
+        61558: 39233,
+        61559: 39234,
+        61560: 39235,
+        61561: 39236,
+        61562: 39237,
+        61563: 39238,
+        61564: 39239,
+        61565: 39240,
+        61566: 39241,
+        61568: 39242,
+        61569: 39243,
+        61570: 39244,
+        61571: 39245,
+        61572: 39246,
+        61573: 39247,
+        61574: 39248,
+        61575: 39249,
+        61576: 39250,
+        61577: 39251,
+        61578: 39254,
+        61579: 39255,
+        61580: 39256,
+        61581: 39257,
+        61582: 39258,
+        61583: 39259,
+        61584: 39260,
+        61585: 39261,
+        61586: 39262,
+        61587: 39263,
+        61588: 39264,
+        61589: 39265,
+        61590: 39266,
+        61591: 39268,
+        61592: 39270,
+        61593: 39283,
+        61594: 39288,
+        61595: 39289,
+        61596: 39291,
+        61597: 39294,
+        61598: 39298,
+        61599: 39299,
+        61600: 39305,
+        61601: 31289,
+        61602: 31287,
+        61603: 31313,
+        61604: 40655,
+        61605: 39333,
+        61606: 31344,
+        61607: 30344,
+        61608: 30350,
+        61609: 30355,
+        61610: 30361,
+        61611: 30372,
+        61612: 29918,
+        61613: 29920,
+        61614: 29996,
+        61615: 40480,
+        61616: 40482,
+        61617: 40488,
+        61618: 40489,
+        61619: 40490,
+        61620: 40491,
+        61621: 40492,
+        61622: 40498,
+        61623: 40497,
+        61624: 40502,
+        61625: 40504,
+        61626: 40503,
+        61627: 40505,
+        61628: 40506,
+        61629: 40510,
+        61630: 40513,
+        61631: 40514,
+        61632: 40516,
+        61633: 40518,
+        61634: 40519,
+        61635: 40520,
+        61636: 40521,
+        61637: 40523,
+        61638: 40524,
+        61639: 40526,
+        61640: 40529,
+        61641: 40533,
+        61642: 40535,
+        61643: 40538,
+        61644: 40539,
+        61645: 40540,
+        61646: 40542,
+        61647: 40547,
+        61648: 40550,
+        61649: 40551,
+        61650: 40552,
+        61651: 40553,
+        61652: 40554,
+        61653: 40555,
+        61654: 40556,
+        61655: 40561,
+        61656: 40557,
+        61657: 40563,
+        61658: 30098,
+        61659: 30100,
+        61660: 30102,
+        61661: 30112,
+        61662: 30109,
+        61663: 30124,
+        61664: 30115,
+        61665: 30131,
+        61666: 30132,
+        61667: 30136,
+        61668: 30148,
+        61669: 30129,
+        61670: 30128,
+        61671: 30147,
+        61672: 30146,
+        61673: 30166,
+        61674: 30157,
+        61675: 30179,
+        61676: 30184,
+        61677: 30182,
+        61678: 30180,
+        61679: 30187,
+        61680: 30183,
+        61681: 30211,
+        61682: 30193,
+        61683: 30204,
+        61684: 30207,
+        61685: 30224,
+        61686: 30208,
+        61687: 30213,
+        61688: 30220,
+        61689: 30231,
+        61690: 30218,
+        61691: 30245,
+        61692: 30232,
+        61693: 30229,
+        61694: 30233,
+        61760: 39308,
+        61761: 39310,
+        61762: 39322,
+        61763: 39323,
+        61764: 39324,
+        61765: 39325,
+        61766: 39326,
+        61767: 39327,
+        61768: 39328,
+        61769: 39329,
+        61770: 39330,
+        61771: 39331,
+        61772: 39332,
+        61773: 39334,
+        61774: 39335,
+        61775: 39337,
+        61776: 39338,
+        61777: 39339,
+        61778: 39340,
+        61779: 39341,
+        61780: 39342,
+        61781: 39343,
+        61782: 39344,
+        61783: 39345,
+        61784: 39346,
+        61785: 39347,
+        61786: 39348,
+        61787: 39349,
+        61788: 39350,
+        61789: 39351,
+        61790: 39352,
+        61791: 39353,
+        61792: 39354,
+        61793: 39355,
+        61794: 39356,
+        61795: 39357,
+        61796: 39358,
+        61797: 39359,
+        61798: 39360,
+        61799: 39361,
+        61800: 39362,
+        61801: 39363,
+        61802: 39364,
+        61803: 39365,
+        61804: 39366,
+        61805: 39367,
+        61806: 39368,
+        61807: 39369,
+        61808: 39370,
+        61809: 39371,
+        61810: 39372,
+        61811: 39373,
+        61812: 39374,
+        61813: 39375,
+        61814: 39376,
+        61815: 39377,
+        61816: 39378,
+        61817: 39379,
+        61818: 39380,
+        61819: 39381,
+        61820: 39382,
+        61821: 39383,
+        61822: 39384,
+        61824: 39385,
+        61825: 39386,
+        61826: 39387,
+        61827: 39388,
+        61828: 39389,
+        61829: 39390,
+        61830: 39391,
+        61831: 39392,
+        61832: 39393,
+        61833: 39394,
+        61834: 39395,
+        61835: 39396,
+        61836: 39397,
+        61837: 39398,
+        61838: 39399,
+        61839: 39400,
+        61840: 39401,
+        61841: 39402,
+        61842: 39403,
+        61843: 39404,
+        61844: 39405,
+        61845: 39406,
+        61846: 39407,
+        61847: 39408,
+        61848: 39409,
+        61849: 39410,
+        61850: 39411,
+        61851: 39412,
+        61852: 39413,
+        61853: 39414,
+        61854: 39415,
+        61855: 39416,
+        61856: 39417,
+        61857: 30235,
+        61858: 30268,
+        61859: 30242,
+        61860: 30240,
+        61861: 30272,
+        61862: 30253,
+        61863: 30256,
+        61864: 30271,
+        61865: 30261,
+        61866: 30275,
+        61867: 30270,
+        61868: 30259,
+        61869: 30285,
+        61870: 30302,
+        61871: 30292,
+        61872: 30300,
+        61873: 30294,
+        61874: 30315,
+        61875: 30319,
+        61876: 32714,
+        61877: 31462,
+        61878: 31352,
+        61879: 31353,
+        61880: 31360,
+        61881: 31366,
+        61882: 31368,
+        61883: 31381,
+        61884: 31398,
+        61885: 31392,
+        61886: 31404,
+        61887: 31400,
+        61888: 31405,
+        61889: 31411,
+        61890: 34916,
+        61891: 34921,
+        61892: 34930,
+        61893: 34941,
+        61894: 34943,
+        61895: 34946,
+        61896: 34978,
+        61897: 35014,
+        61898: 34999,
+        61899: 35004,
+        61900: 35017,
+        61901: 35042,
+        61902: 35022,
+        61903: 35043,
+        61904: 35045,
+        61905: 35057,
+        61906: 35098,
+        61907: 35068,
+        61908: 35048,
+        61909: 35070,
+        61910: 35056,
+        61911: 35105,
+        61912: 35097,
+        61913: 35091,
+        61914: 35099,
+        61915: 35082,
+        61916: 35124,
+        61917: 35115,
+        61918: 35126,
+        61919: 35137,
+        61920: 35174,
+        61921: 35195,
+        61922: 30091,
+        61923: 32997,
+        61924: 30386,
+        61925: 30388,
+        61926: 30684,
+        61927: 32786,
+        61928: 32788,
+        61929: 32790,
+        61930: 32796,
+        61931: 32800,
+        61932: 32802,
+        61933: 32805,
+        61934: 32806,
+        61935: 32807,
+        61936: 32809,
+        61937: 32808,
+        61938: 32817,
+        61939: 32779,
+        61940: 32821,
+        61941: 32835,
+        61942: 32838,
+        61943: 32845,
+        61944: 32850,
+        61945: 32873,
+        61946: 32881,
+        61947: 35203,
+        61948: 39032,
+        61949: 39040,
+        61950: 39043,
+        62016: 39418,
+        62017: 39419,
+        62018: 39420,
+        62019: 39421,
+        62020: 39422,
+        62021: 39423,
+        62022: 39424,
+        62023: 39425,
+        62024: 39426,
+        62025: 39427,
+        62026: 39428,
+        62027: 39429,
+        62028: 39430,
+        62029: 39431,
+        62030: 39432,
+        62031: 39433,
+        62032: 39434,
+        62033: 39435,
+        62034: 39436,
+        62035: 39437,
+        62036: 39438,
+        62037: 39439,
+        62038: 39440,
+        62039: 39441,
+        62040: 39442,
+        62041: 39443,
+        62042: 39444,
+        62043: 39445,
+        62044: 39446,
+        62045: 39447,
+        62046: 39448,
+        62047: 39449,
+        62048: 39450,
+        62049: 39451,
+        62050: 39452,
+        62051: 39453,
+        62052: 39454,
+        62053: 39455,
+        62054: 39456,
+        62055: 39457,
+        62056: 39458,
+        62057: 39459,
+        62058: 39460,
+        62059: 39461,
+        62060: 39462,
+        62061: 39463,
+        62062: 39464,
+        62063: 39465,
+        62064: 39466,
+        62065: 39467,
+        62066: 39468,
+        62067: 39469,
+        62068: 39470,
+        62069: 39471,
+        62070: 39472,
+        62071: 39473,
+        62072: 39474,
+        62073: 39475,
+        62074: 39476,
+        62075: 39477,
+        62076: 39478,
+        62077: 39479,
+        62078: 39480,
+        62080: 39481,
+        62081: 39482,
+        62082: 39483,
+        62083: 39484,
+        62084: 39485,
+        62085: 39486,
+        62086: 39487,
+        62087: 39488,
+        62088: 39489,
+        62089: 39490,
+        62090: 39491,
+        62091: 39492,
+        62092: 39493,
+        62093: 39494,
+        62094: 39495,
+        62095: 39496,
+        62096: 39497,
+        62097: 39498,
+        62098: 39499,
+        62099: 39500,
+        62100: 39501,
+        62101: 39502,
+        62102: 39503,
+        62103: 39504,
+        62104: 39505,
+        62105: 39506,
+        62106: 39507,
+        62107: 39508,
+        62108: 39509,
+        62109: 39510,
+        62110: 39511,
+        62111: 39512,
+        62112: 39513,
+        62113: 39049,
+        62114: 39052,
+        62115: 39053,
+        62116: 39055,
+        62117: 39060,
+        62118: 39066,
+        62119: 39067,
+        62120: 39070,
+        62121: 39071,
+        62122: 39073,
+        62123: 39074,
+        62124: 39077,
+        62125: 39078,
+        62126: 34381,
+        62127: 34388,
+        62128: 34412,
+        62129: 34414,
+        62130: 34431,
+        62131: 34426,
+        62132: 34428,
+        62133: 34427,
+        62134: 34472,
+        62135: 34445,
+        62136: 34443,
+        62137: 34476,
+        62138: 34461,
+        62139: 34471,
+        62140: 34467,
+        62141: 34474,
+        62142: 34451,
+        62143: 34473,
+        62144: 34486,
+        62145: 34500,
+        62146: 34485,
+        62147: 34510,
+        62148: 34480,
+        62149: 34490,
+        62150: 34481,
+        62151: 34479,
+        62152: 34505,
+        62153: 34511,
+        62154: 34484,
+        62155: 34537,
+        62156: 34545,
+        62157: 34546,
+        62158: 34541,
+        62159: 34547,
+        62160: 34512,
+        62161: 34579,
+        62162: 34526,
+        62163: 34548,
+        62164: 34527,
+        62165: 34520,
+        62166: 34513,
+        62167: 34563,
+        62168: 34567,
+        62169: 34552,
+        62170: 34568,
+        62171: 34570,
+        62172: 34573,
+        62173: 34569,
+        62174: 34595,
+        62175: 34619,
+        62176: 34590,
+        62177: 34597,
+        62178: 34606,
+        62179: 34586,
+        62180: 34622,
+        62181: 34632,
+        62182: 34612,
+        62183: 34609,
+        62184: 34601,
+        62185: 34615,
+        62186: 34623,
+        62187: 34690,
+        62188: 34594,
+        62189: 34685,
+        62190: 34686,
+        62191: 34683,
+        62192: 34656,
+        62193: 34672,
+        62194: 34636,
+        62195: 34670,
+        62196: 34699,
+        62197: 34643,
+        62198: 34659,
+        62199: 34684,
+        62200: 34660,
+        62201: 34649,
+        62202: 34661,
+        62203: 34707,
+        62204: 34735,
+        62205: 34728,
+        62206: 34770,
+        62272: 39514,
+        62273: 39515,
+        62274: 39516,
+        62275: 39517,
+        62276: 39518,
+        62277: 39519,
+        62278: 39520,
+        62279: 39521,
+        62280: 39522,
+        62281: 39523,
+        62282: 39524,
+        62283: 39525,
+        62284: 39526,
+        62285: 39527,
+        62286: 39528,
+        62287: 39529,
+        62288: 39530,
+        62289: 39531,
+        62290: 39538,
+        62291: 39555,
+        62292: 39561,
+        62293: 39565,
+        62294: 39566,
+        62295: 39572,
+        62296: 39573,
+        62297: 39577,
+        62298: 39590,
+        62299: 39593,
+        62300: 39594,
+        62301: 39595,
+        62302: 39596,
+        62303: 39597,
+        62304: 39598,
+        62305: 39599,
+        62306: 39602,
+        62307: 39603,
+        62308: 39604,
+        62309: 39605,
+        62310: 39609,
+        62311: 39611,
+        62312: 39613,
+        62313: 39614,
+        62314: 39615,
+        62315: 39619,
+        62316: 39620,
+        62317: 39622,
+        62318: 39623,
+        62319: 39624,
+        62320: 39625,
+        62321: 39626,
+        62322: 39629,
+        62323: 39630,
+        62324: 39631,
+        62325: 39632,
+        62326: 39634,
+        62327: 39636,
+        62328: 39637,
+        62329: 39638,
+        62330: 39639,
+        62331: 39641,
+        62332: 39642,
+        62333: 39643,
+        62334: 39644,
+        62336: 39645,
+        62337: 39646,
+        62338: 39648,
+        62339: 39650,
+        62340: 39651,
+        62341: 39652,
+        62342: 39653,
+        62343: 39655,
+        62344: 39656,
+        62345: 39657,
+        62346: 39658,
+        62347: 39660,
+        62348: 39662,
+        62349: 39664,
+        62350: 39665,
+        62351: 39666,
+        62352: 39667,
+        62353: 39668,
+        62354: 39669,
+        62355: 39670,
+        62356: 39671,
+        62357: 39672,
+        62358: 39674,
+        62359: 39676,
+        62360: 39677,
+        62361: 39678,
+        62362: 39679,
+        62363: 39680,
+        62364: 39681,
+        62365: 39682,
+        62366: 39684,
+        62367: 39685,
+        62368: 39686,
+        62369: 34758,
+        62370: 34696,
+        62371: 34693,
+        62372: 34733,
+        62373: 34711,
+        62374: 34691,
+        62375: 34731,
+        62376: 34789,
+        62377: 34732,
+        62378: 34741,
+        62379: 34739,
+        62380: 34763,
+        62381: 34771,
+        62382: 34749,
+        62383: 34769,
+        62384: 34752,
+        62385: 34762,
+        62386: 34779,
+        62387: 34794,
+        62388: 34784,
+        62389: 34798,
+        62390: 34838,
+        62391: 34835,
+        62392: 34814,
+        62393: 34826,
+        62394: 34843,
+        62395: 34849,
+        62396: 34873,
+        62397: 34876,
+        62398: 32566,
+        62399: 32578,
+        62400: 32580,
+        62401: 32581,
+        62402: 33296,
+        62403: 31482,
+        62404: 31485,
+        62405: 31496,
+        62406: 31491,
+        62407: 31492,
+        62408: 31509,
+        62409: 31498,
+        62410: 31531,
+        62411: 31503,
+        62412: 31559,
+        62413: 31544,
+        62414: 31530,
+        62415: 31513,
+        62416: 31534,
+        62417: 31537,
+        62418: 31520,
+        62419: 31525,
+        62420: 31524,
+        62421: 31539,
+        62422: 31550,
+        62423: 31518,
+        62424: 31576,
+        62425: 31578,
+        62426: 31557,
+        62427: 31605,
+        62428: 31564,
+        62429: 31581,
+        62430: 31584,
+        62431: 31598,
+        62432: 31611,
+        62433: 31586,
+        62434: 31602,
+        62435: 31601,
+        62436: 31632,
+        62437: 31654,
+        62438: 31655,
+        62439: 31672,
+        62440: 31660,
+        62441: 31645,
+        62442: 31656,
+        62443: 31621,
+        62444: 31658,
+        62445: 31644,
+        62446: 31650,
+        62447: 31659,
+        62448: 31668,
+        62449: 31697,
+        62450: 31681,
+        62451: 31692,
+        62452: 31709,
+        62453: 31706,
+        62454: 31717,
+        62455: 31718,
+        62456: 31722,
+        62457: 31756,
+        62458: 31742,
+        62459: 31740,
+        62460: 31759,
+        62461: 31766,
+        62462: 31755,
+        62528: 39687,
+        62529: 39689,
+        62530: 39690,
+        62531: 39691,
+        62532: 39692,
+        62533: 39693,
+        62534: 39694,
+        62535: 39696,
+        62536: 39697,
+        62537: 39698,
+        62538: 39700,
+        62539: 39701,
+        62540: 39702,
+        62541: 39703,
+        62542: 39704,
+        62543: 39705,
+        62544: 39706,
+        62545: 39707,
+        62546: 39708,
+        62547: 39709,
+        62548: 39710,
+        62549: 39712,
+        62550: 39713,
+        62551: 39714,
+        62552: 39716,
+        62553: 39717,
+        62554: 39718,
+        62555: 39719,
+        62556: 39720,
+        62557: 39721,
+        62558: 39722,
+        62559: 39723,
+        62560: 39724,
+        62561: 39725,
+        62562: 39726,
+        62563: 39728,
+        62564: 39729,
+        62565: 39731,
+        62566: 39732,
+        62567: 39733,
+        62568: 39734,
+        62569: 39735,
+        62570: 39736,
+        62571: 39737,
+        62572: 39738,
+        62573: 39741,
+        62574: 39742,
+        62575: 39743,
+        62576: 39744,
+        62577: 39750,
+        62578: 39754,
+        62579: 39755,
+        62580: 39756,
+        62581: 39758,
+        62582: 39760,
+        62583: 39762,
+        62584: 39763,
+        62585: 39765,
+        62586: 39766,
+        62587: 39767,
+        62588: 39768,
+        62589: 39769,
+        62590: 39770,
+        62592: 39771,
+        62593: 39772,
+        62594: 39773,
+        62595: 39774,
+        62596: 39775,
+        62597: 39776,
+        62598: 39777,
+        62599: 39778,
+        62600: 39779,
+        62601: 39780,
+        62602: 39781,
+        62603: 39782,
+        62604: 39783,
+        62605: 39784,
+        62606: 39785,
+        62607: 39786,
+        62608: 39787,
+        62609: 39788,
+        62610: 39789,
+        62611: 39790,
+        62612: 39791,
+        62613: 39792,
+        62614: 39793,
+        62615: 39794,
+        62616: 39795,
+        62617: 39796,
+        62618: 39797,
+        62619: 39798,
+        62620: 39799,
+        62621: 39800,
+        62622: 39801,
+        62623: 39802,
+        62624: 39803,
+        62625: 31775,
+        62626: 31786,
+        62627: 31782,
+        62628: 31800,
+        62629: 31809,
+        62630: 31808,
+        62631: 33278,
+        62632: 33281,
+        62633: 33282,
+        62634: 33284,
+        62635: 33260,
+        62636: 34884,
+        62637: 33313,
+        62638: 33314,
+        62639: 33315,
+        62640: 33325,
+        62641: 33327,
+        62642: 33320,
+        62643: 33323,
+        62644: 33336,
+        62645: 33339,
+        62646: 33331,
+        62647: 33332,
+        62648: 33342,
+        62649: 33348,
+        62650: 33353,
+        62651: 33355,
+        62652: 33359,
+        62653: 33370,
+        62654: 33375,
+        62655: 33384,
+        62656: 34942,
+        62657: 34949,
+        62658: 34952,
+        62659: 35032,
+        62660: 35039,
+        62661: 35166,
+        62662: 32669,
+        62663: 32671,
+        62664: 32679,
+        62665: 32687,
+        62666: 32688,
+        62667: 32690,
+        62668: 31868,
+        62669: 25929,
+        62670: 31889,
+        62671: 31901,
+        62672: 31900,
+        62673: 31902,
+        62674: 31906,
+        62675: 31922,
+        62676: 31932,
+        62677: 31933,
+        62678: 31937,
+        62679: 31943,
+        62680: 31948,
+        62681: 31949,
+        62682: 31944,
+        62683: 31941,
+        62684: 31959,
+        62685: 31976,
+        62686: 33390,
+        62687: 26280,
+        62688: 32703,
+        62689: 32718,
+        62690: 32725,
+        62691: 32741,
+        62692: 32737,
+        62693: 32742,
+        62694: 32745,
+        62695: 32750,
+        62696: 32755,
+        62697: 31992,
+        62698: 32119,
+        62699: 32166,
+        62700: 32174,
+        62701: 32327,
+        62702: 32411,
+        62703: 40632,
+        62704: 40628,
+        62705: 36211,
+        62706: 36228,
+        62707: 36244,
+        62708: 36241,
+        62709: 36273,
+        62710: 36199,
+        62711: 36205,
+        62712: 35911,
+        62713: 35913,
+        62714: 37194,
+        62715: 37200,
+        62716: 37198,
+        62717: 37199,
+        62718: 37220,
+        62784: 39804,
+        62785: 39805,
+        62786: 39806,
+        62787: 39807,
+        62788: 39808,
+        62789: 39809,
+        62790: 39810,
+        62791: 39811,
+        62792: 39812,
+        62793: 39813,
+        62794: 39814,
+        62795: 39815,
+        62796: 39816,
+        62797: 39817,
+        62798: 39818,
+        62799: 39819,
+        62800: 39820,
+        62801: 39821,
+        62802: 39822,
+        62803: 39823,
+        62804: 39824,
+        62805: 39825,
+        62806: 39826,
+        62807: 39827,
+        62808: 39828,
+        62809: 39829,
+        62810: 39830,
+        62811: 39831,
+        62812: 39832,
+        62813: 39833,
+        62814: 39834,
+        62815: 39835,
+        62816: 39836,
+        62817: 39837,
+        62818: 39838,
+        62819: 39839,
+        62820: 39840,
+        62821: 39841,
+        62822: 39842,
+        62823: 39843,
+        62824: 39844,
+        62825: 39845,
+        62826: 39846,
+        62827: 39847,
+        62828: 39848,
+        62829: 39849,
+        62830: 39850,
+        62831: 39851,
+        62832: 39852,
+        62833: 39853,
+        62834: 39854,
+        62835: 39855,
+        62836: 39856,
+        62837: 39857,
+        62838: 39858,
+        62839: 39859,
+        62840: 39860,
+        62841: 39861,
+        62842: 39862,
+        62843: 39863,
+        62844: 39864,
+        62845: 39865,
+        62846: 39866,
+        62848: 39867,
+        62849: 39868,
+        62850: 39869,
+        62851: 39870,
+        62852: 39871,
+        62853: 39872,
+        62854: 39873,
+        62855: 39874,
+        62856: 39875,
+        62857: 39876,
+        62858: 39877,
+        62859: 39878,
+        62860: 39879,
+        62861: 39880,
+        62862: 39881,
+        62863: 39882,
+        62864: 39883,
+        62865: 39884,
+        62866: 39885,
+        62867: 39886,
+        62868: 39887,
+        62869: 39888,
+        62870: 39889,
+        62871: 39890,
+        62872: 39891,
+        62873: 39892,
+        62874: 39893,
+        62875: 39894,
+        62876: 39895,
+        62877: 39896,
+        62878: 39897,
+        62879: 39898,
+        62880: 39899,
+        62881: 37218,
+        62882: 37217,
+        62883: 37232,
+        62884: 37225,
+        62885: 37231,
+        62886: 37245,
+        62887: 37246,
+        62888: 37234,
+        62889: 37236,
+        62890: 37241,
+        62891: 37260,
+        62892: 37253,
+        62893: 37264,
+        62894: 37261,
+        62895: 37265,
+        62896: 37282,
+        62897: 37283,
+        62898: 37290,
+        62899: 37293,
+        62900: 37294,
+        62901: 37295,
+        62902: 37301,
+        62903: 37300,
+        62904: 37306,
+        62905: 35925,
+        62906: 40574,
+        62907: 36280,
+        62908: 36331,
+        62909: 36357,
+        62910: 36441,
+        62911: 36457,
+        62912: 36277,
+        62913: 36287,
+        62914: 36284,
+        62915: 36282,
+        62916: 36292,
+        62917: 36310,
+        62918: 36311,
+        62919: 36314,
+        62920: 36318,
+        62921: 36302,
+        62922: 36303,
+        62923: 36315,
+        62924: 36294,
+        62925: 36332,
+        62926: 36343,
+        62927: 36344,
+        62928: 36323,
+        62929: 36345,
+        62930: 36347,
+        62931: 36324,
+        62932: 36361,
+        62933: 36349,
+        62934: 36372,
+        62935: 36381,
+        62936: 36383,
+        62937: 36396,
+        62938: 36398,
+        62939: 36387,
+        62940: 36399,
+        62941: 36410,
+        62942: 36416,
+        62943: 36409,
+        62944: 36405,
+        62945: 36413,
+        62946: 36401,
+        62947: 36425,
+        62948: 36417,
+        62949: 36418,
+        62950: 36433,
+        62951: 36434,
+        62952: 36426,
+        62953: 36464,
+        62954: 36470,
+        62955: 36476,
+        62956: 36463,
+        62957: 36468,
+        62958: 36485,
+        62959: 36495,
+        62960: 36500,
+        62961: 36496,
+        62962: 36508,
+        62963: 36510,
+        62964: 35960,
+        62965: 35970,
+        62966: 35978,
+        62967: 35973,
+        62968: 35992,
+        62969: 35988,
+        62970: 26011,
+        62971: 35286,
+        62972: 35294,
+        62973: 35290,
+        62974: 35292,
+        63040: 39900,
+        63041: 39901,
+        63042: 39902,
+        63043: 39903,
+        63044: 39904,
+        63045: 39905,
+        63046: 39906,
+        63047: 39907,
+        63048: 39908,
+        63049: 39909,
+        63050: 39910,
+        63051: 39911,
+        63052: 39912,
+        63053: 39913,
+        63054: 39914,
+        63055: 39915,
+        63056: 39916,
+        63057: 39917,
+        63058: 39918,
+        63059: 39919,
+        63060: 39920,
+        63061: 39921,
+        63062: 39922,
+        63063: 39923,
+        63064: 39924,
+        63065: 39925,
+        63066: 39926,
+        63067: 39927,
+        63068: 39928,
+        63069: 39929,
+        63070: 39930,
+        63071: 39931,
+        63072: 39932,
+        63073: 39933,
+        63074: 39934,
+        63075: 39935,
+        63076: 39936,
+        63077: 39937,
+        63078: 39938,
+        63079: 39939,
+        63080: 39940,
+        63081: 39941,
+        63082: 39942,
+        63083: 39943,
+        63084: 39944,
+        63085: 39945,
+        63086: 39946,
+        63087: 39947,
+        63088: 39948,
+        63089: 39949,
+        63090: 39950,
+        63091: 39951,
+        63092: 39952,
+        63093: 39953,
+        63094: 39954,
+        63095: 39955,
+        63096: 39956,
+        63097: 39957,
+        63098: 39958,
+        63099: 39959,
+        63100: 39960,
+        63101: 39961,
+        63102: 39962,
+        63104: 39963,
+        63105: 39964,
+        63106: 39965,
+        63107: 39966,
+        63108: 39967,
+        63109: 39968,
+        63110: 39969,
+        63111: 39970,
+        63112: 39971,
+        63113: 39972,
+        63114: 39973,
+        63115: 39974,
+        63116: 39975,
+        63117: 39976,
+        63118: 39977,
+        63119: 39978,
+        63120: 39979,
+        63121: 39980,
+        63122: 39981,
+        63123: 39982,
+        63124: 39983,
+        63125: 39984,
+        63126: 39985,
+        63127: 39986,
+        63128: 39987,
+        63129: 39988,
+        63130: 39989,
+        63131: 39990,
+        63132: 39991,
+        63133: 39992,
+        63134: 39993,
+        63135: 39994,
+        63136: 39995,
+        63137: 35301,
+        63138: 35307,
+        63139: 35311,
+        63140: 35390,
+        63141: 35622,
+        63142: 38739,
+        63143: 38633,
+        63144: 38643,
+        63145: 38639,
+        63146: 38662,
+        63147: 38657,
+        63148: 38664,
+        63149: 38671,
+        63150: 38670,
+        63151: 38698,
+        63152: 38701,
+        63153: 38704,
+        63154: 38718,
+        63155: 40832,
+        63156: 40835,
+        63157: 40837,
+        63158: 40838,
+        63159: 40839,
+        63160: 40840,
+        63161: 40841,
+        63162: 40842,
+        63163: 40844,
+        63164: 40702,
+        63165: 40715,
+        63166: 40717,
+        63167: 38585,
+        63168: 38588,
+        63169: 38589,
+        63170: 38606,
+        63171: 38610,
+        63172: 30655,
+        63173: 38624,
+        63174: 37518,
+        63175: 37550,
+        63176: 37576,
+        63177: 37694,
+        63178: 37738,
+        63179: 37834,
+        63180: 37775,
+        63181: 37950,
+        63182: 37995,
+        63183: 40063,
+        63184: 40066,
+        63185: 40069,
+        63186: 40070,
+        63187: 40071,
+        63188: 40072,
+        63189: 31267,
+        63190: 40075,
+        63191: 40078,
+        63192: 40080,
+        63193: 40081,
+        63194: 40082,
+        63195: 40084,
+        63196: 40085,
+        63197: 40090,
+        63198: 40091,
+        63199: 40094,
+        63200: 40095,
+        63201: 40096,
+        63202: 40097,
+        63203: 40098,
+        63204: 40099,
+        63205: 40101,
+        63206: 40102,
+        63207: 40103,
+        63208: 40104,
+        63209: 40105,
+        63210: 40107,
+        63211: 40109,
+        63212: 40110,
+        63213: 40112,
+        63214: 40113,
+        63215: 40114,
+        63216: 40115,
+        63217: 40116,
+        63218: 40117,
+        63219: 40118,
+        63220: 40119,
+        63221: 40122,
+        63222: 40123,
+        63223: 40124,
+        63224: 40125,
+        63225: 40132,
+        63226: 40133,
+        63227: 40134,
+        63228: 40135,
+        63229: 40138,
+        63230: 40139,
+        63296: 39996,
+        63297: 39997,
+        63298: 39998,
+        63299: 39999,
+        63300: 40000,
+        63301: 40001,
+        63302: 40002,
+        63303: 40003,
+        63304: 40004,
+        63305: 40005,
+        63306: 40006,
+        63307: 40007,
+        63308: 40008,
+        63309: 40009,
+        63310: 40010,
+        63311: 40011,
+        63312: 40012,
+        63313: 40013,
+        63314: 40014,
+        63315: 40015,
+        63316: 40016,
+        63317: 40017,
+        63318: 40018,
+        63319: 40019,
+        63320: 40020,
+        63321: 40021,
+        63322: 40022,
+        63323: 40023,
+        63324: 40024,
+        63325: 40025,
+        63326: 40026,
+        63327: 40027,
+        63328: 40028,
+        63329: 40029,
+        63330: 40030,
+        63331: 40031,
+        63332: 40032,
+        63333: 40033,
+        63334: 40034,
+        63335: 40035,
+        63336: 40036,
+        63337: 40037,
+        63338: 40038,
+        63339: 40039,
+        63340: 40040,
+        63341: 40041,
+        63342: 40042,
+        63343: 40043,
+        63344: 40044,
+        63345: 40045,
+        63346: 40046,
+        63347: 40047,
+        63348: 40048,
+        63349: 40049,
+        63350: 40050,
+        63351: 40051,
+        63352: 40052,
+        63353: 40053,
+        63354: 40054,
+        63355: 40055,
+        63356: 40056,
+        63357: 40057,
+        63358: 40058,
+        63360: 40059,
+        63361: 40061,
+        63362: 40062,
+        63363: 40064,
+        63364: 40067,
+        63365: 40068,
+        63366: 40073,
+        63367: 40074,
+        63368: 40076,
+        63369: 40079,
+        63370: 40083,
+        63371: 40086,
+        63372: 40087,
+        63373: 40088,
+        63374: 40089,
+        63375: 40093,
+        63376: 40106,
+        63377: 40108,
+        63378: 40111,
+        63379: 40121,
+        63380: 40126,
+        63381: 40127,
+        63382: 40128,
+        63383: 40129,
+        63384: 40130,
+        63385: 40136,
+        63386: 40137,
+        63387: 40145,
+        63388: 40146,
+        63389: 40154,
+        63390: 40155,
+        63391: 40160,
+        63392: 40161,
+        63393: 40140,
+        63394: 40141,
+        63395: 40142,
+        63396: 40143,
+        63397: 40144,
+        63398: 40147,
+        63399: 40148,
+        63400: 40149,
+        63401: 40151,
+        63402: 40152,
+        63403: 40153,
+        63404: 40156,
+        63405: 40157,
+        63406: 40159,
+        63407: 40162,
+        63408: 38780,
+        63409: 38789,
+        63410: 38801,
+        63411: 38802,
+        63412: 38804,
+        63413: 38831,
+        63414: 38827,
+        63415: 38819,
+        63416: 38834,
+        63417: 38836,
+        63418: 39601,
+        63419: 39600,
+        63420: 39607,
+        63421: 40536,
+        63422: 39606,
+        63423: 39610,
+        63424: 39612,
+        63425: 39617,
+        63426: 39616,
+        63427: 39621,
+        63428: 39618,
+        63429: 39627,
+        63430: 39628,
+        63431: 39633,
+        63432: 39749,
+        63433: 39747,
+        63434: 39751,
+        63435: 39753,
+        63436: 39752,
+        63437: 39757,
+        63438: 39761,
+        63439: 39144,
+        63440: 39181,
+        63441: 39214,
+        63442: 39253,
+        63443: 39252,
+        63444: 39647,
+        63445: 39649,
+        63446: 39654,
+        63447: 39663,
+        63448: 39659,
+        63449: 39675,
+        63450: 39661,
+        63451: 39673,
+        63452: 39688,
+        63453: 39695,
+        63454: 39699,
+        63455: 39711,
+        63456: 39715,
+        63457: 40637,
+        63458: 40638,
+        63459: 32315,
+        63460: 40578,
+        63461: 40583,
+        63462: 40584,
+        63463: 40587,
+        63464: 40594,
+        63465: 37846,
+        63466: 40605,
+        63467: 40607,
+        63468: 40667,
+        63469: 40668,
+        63470: 40669,
+        63471: 40672,
+        63472: 40671,
+        63473: 40674,
+        63474: 40681,
+        63475: 40679,
+        63476: 40677,
+        63477: 40682,
+        63478: 40687,
+        63479: 40738,
+        63480: 40748,
+        63481: 40751,
+        63482: 40761,
+        63483: 40759,
+        63484: 40765,
+        63485: 40766,
+        63486: 40772,
+        63552: 40163,
+        63553: 40164,
+        63554: 40165,
+        63555: 40166,
+        63556: 40167,
+        63557: 40168,
+        63558: 40169,
+        63559: 40170,
+        63560: 40171,
+        63561: 40172,
+        63562: 40173,
+        63563: 40174,
+        63564: 40175,
+        63565: 40176,
+        63566: 40177,
+        63567: 40178,
+        63568: 40179,
+        63569: 40180,
+        63570: 40181,
+        63571: 40182,
+        63572: 40183,
+        63573: 40184,
+        63574: 40185,
+        63575: 40186,
+        63576: 40187,
+        63577: 40188,
+        63578: 40189,
+        63579: 40190,
+        63580: 40191,
+        63581: 40192,
+        63582: 40193,
+        63583: 40194,
+        63584: 40195,
+        63585: 40196,
+        63586: 40197,
+        63587: 40198,
+        63588: 40199,
+        63589: 40200,
+        63590: 40201,
+        63591: 40202,
+        63592: 40203,
+        63593: 40204,
+        63594: 40205,
+        63595: 40206,
+        63596: 40207,
+        63597: 40208,
+        63598: 40209,
+        63599: 40210,
+        63600: 40211,
+        63601: 40212,
+        63602: 40213,
+        63603: 40214,
+        63604: 40215,
+        63605: 40216,
+        63606: 40217,
+        63607: 40218,
+        63608: 40219,
+        63609: 40220,
+        63610: 40221,
+        63611: 40222,
+        63612: 40223,
+        63613: 40224,
+        63614: 40225,
+        63616: 40226,
+        63617: 40227,
+        63618: 40228,
+        63619: 40229,
+        63620: 40230,
+        63621: 40231,
+        63622: 40232,
+        63623: 40233,
+        63624: 40234,
+        63625: 40235,
+        63626: 40236,
+        63627: 40237,
+        63628: 40238,
+        63629: 40239,
+        63630: 40240,
+        63631: 40241,
+        63632: 40242,
+        63633: 40243,
+        63634: 40244,
+        63635: 40245,
+        63636: 40246,
+        63637: 40247,
+        63638: 40248,
+        63639: 40249,
+        63640: 40250,
+        63641: 40251,
+        63642: 40252,
+        63643: 40253,
+        63644: 40254,
+        63645: 40255,
+        63646: 40256,
+        63647: 40257,
+        63648: 40258,
+        63649: 57908,
+        63650: 57909,
+        63651: 57910,
+        63652: 57911,
+        63653: 57912,
+        63654: 57913,
+        63655: 57914,
+        63656: 57915,
+        63657: 57916,
+        63658: 57917,
+        63659: 57918,
+        63660: 57919,
+        63661: 57920,
+        63662: 57921,
+        63663: 57922,
+        63664: 57923,
+        63665: 57924,
+        63666: 57925,
+        63667: 57926,
+        63668: 57927,
+        63669: 57928,
+        63670: 57929,
+        63671: 57930,
+        63672: 57931,
+        63673: 57932,
+        63674: 57933,
+        63675: 57934,
+        63676: 57935,
+        63677: 57936,
+        63678: 57937,
+        63679: 57938,
+        63680: 57939,
+        63681: 57940,
+        63682: 57941,
+        63683: 57942,
+        63684: 57943,
+        63685: 57944,
+        63686: 57945,
+        63687: 57946,
+        63688: 57947,
+        63689: 57948,
+        63690: 57949,
+        63691: 57950,
+        63692: 57951,
+        63693: 57952,
+        63694: 57953,
+        63695: 57954,
+        63696: 57955,
+        63697: 57956,
+        63698: 57957,
+        63699: 57958,
+        63700: 57959,
+        63701: 57960,
+        63702: 57961,
+        63703: 57962,
+        63704: 57963,
+        63705: 57964,
+        63706: 57965,
+        63707: 57966,
+        63708: 57967,
+        63709: 57968,
+        63710: 57969,
+        63711: 57970,
+        63712: 57971,
+        63713: 57972,
+        63714: 57973,
+        63715: 57974,
+        63716: 57975,
+        63717: 57976,
+        63718: 57977,
+        63719: 57978,
+        63720: 57979,
+        63721: 57980,
+        63722: 57981,
+        63723: 57982,
+        63724: 57983,
+        63725: 57984,
+        63726: 57985,
+        63727: 57986,
+        63728: 57987,
+        63729: 57988,
+        63730: 57989,
+        63731: 57990,
+        63732: 57991,
+        63733: 57992,
+        63734: 57993,
+        63735: 57994,
+        63736: 57995,
+        63737: 57996,
+        63738: 57997,
+        63739: 57998,
+        63740: 57999,
+        63741: 58000,
+        63742: 58001,
+        63808: 40259,
+        63809: 40260,
+        63810: 40261,
+        63811: 40262,
+        63812: 40263,
+        63813: 40264,
+        63814: 40265,
+        63815: 40266,
+        63816: 40267,
+        63817: 40268,
+        63818: 40269,
+        63819: 40270,
+        63820: 40271,
+        63821: 40272,
+        63822: 40273,
+        63823: 40274,
+        63824: 40275,
+        63825: 40276,
+        63826: 40277,
+        63827: 40278,
+        63828: 40279,
+        63829: 40280,
+        63830: 40281,
+        63831: 40282,
+        63832: 40283,
+        63833: 40284,
+        63834: 40285,
+        63835: 40286,
+        63836: 40287,
+        63837: 40288,
+        63838: 40289,
+        63839: 40290,
+        63840: 40291,
+        63841: 40292,
+        63842: 40293,
+        63843: 40294,
+        63844: 40295,
+        63845: 40296,
+        63846: 40297,
+        63847: 40298,
+        63848: 40299,
+        63849: 40300,
+        63850: 40301,
+        63851: 40302,
+        63852: 40303,
+        63853: 40304,
+        63854: 40305,
+        63855: 40306,
+        63856: 40307,
+        63857: 40308,
+        63858: 40309,
+        63859: 40310,
+        63860: 40311,
+        63861: 40312,
+        63862: 40313,
+        63863: 40314,
+        63864: 40315,
+        63865: 40316,
+        63866: 40317,
+        63867: 40318,
+        63868: 40319,
+        63869: 40320,
+        63870: 40321,
+        63872: 40322,
+        63873: 40323,
+        63874: 40324,
+        63875: 40325,
+        63876: 40326,
+        63877: 40327,
+        63878: 40328,
+        63879: 40329,
+        63880: 40330,
+        63881: 40331,
+        63882: 40332,
+        63883: 40333,
+        63884: 40334,
+        63885: 40335,
+        63886: 40336,
+        63887: 40337,
+        63888: 40338,
+        63889: 40339,
+        63890: 40340,
+        63891: 40341,
+        63892: 40342,
+        63893: 40343,
+        63894: 40344,
+        63895: 40345,
+        63896: 40346,
+        63897: 40347,
+        63898: 40348,
+        63899: 40349,
+        63900: 40350,
+        63901: 40351,
+        63902: 40352,
+        63903: 40353,
+        63904: 40354,
+        63905: 58002,
+        63906: 58003,
+        63907: 58004,
+        63908: 58005,
+        63909: 58006,
+        63910: 58007,
+        63911: 58008,
+        63912: 58009,
+        63913: 58010,
+        63914: 58011,
+        63915: 58012,
+        63916: 58013,
+        63917: 58014,
+        63918: 58015,
+        63919: 58016,
+        63920: 58017,
+        63921: 58018,
+        63922: 58019,
+        63923: 58020,
+        63924: 58021,
+        63925: 58022,
+        63926: 58023,
+        63927: 58024,
+        63928: 58025,
+        63929: 58026,
+        63930: 58027,
+        63931: 58028,
+        63932: 58029,
+        63933: 58030,
+        63934: 58031,
+        63935: 58032,
+        63936: 58033,
+        63937: 58034,
+        63938: 58035,
+        63939: 58036,
+        63940: 58037,
+        63941: 58038,
+        63942: 58039,
+        63943: 58040,
+        63944: 58041,
+        63945: 58042,
+        63946: 58043,
+        63947: 58044,
+        63948: 58045,
+        63949: 58046,
+        63950: 58047,
+        63951: 58048,
+        63952: 58049,
+        63953: 58050,
+        63954: 58051,
+        63955: 58052,
+        63956: 58053,
+        63957: 58054,
+        63958: 58055,
+        63959: 58056,
+        63960: 58057,
+        63961: 58058,
+        63962: 58059,
+        63963: 58060,
+        63964: 58061,
+        63965: 58062,
+        63966: 58063,
+        63967: 58064,
+        63968: 58065,
+        63969: 58066,
+        63970: 58067,
+        63971: 58068,
+        63972: 58069,
+        63973: 58070,
+        63974: 58071,
+        63975: 58072,
+        63976: 58073,
+        63977: 58074,
+        63978: 58075,
+        63979: 58076,
+        63980: 58077,
+        63981: 58078,
+        63982: 58079,
+        63983: 58080,
+        63984: 58081,
+        63985: 58082,
+        63986: 58083,
+        63987: 58084,
+        63988: 58085,
+        63989: 58086,
+        63990: 58087,
+        63991: 58088,
+        63992: 58089,
+        63993: 58090,
+        63994: 58091,
+        63995: 58092,
+        63996: 58093,
+        63997: 58094,
+        63998: 58095,
+        64064: 40355,
+        64065: 40356,
+        64066: 40357,
+        64067: 40358,
+        64068: 40359,
+        64069: 40360,
+        64070: 40361,
+        64071: 40362,
+        64072: 40363,
+        64073: 40364,
+        64074: 40365,
+        64075: 40366,
+        64076: 40367,
+        64077: 40368,
+        64078: 40369,
+        64079: 40370,
+        64080: 40371,
+        64081: 40372,
+        64082: 40373,
+        64083: 40374,
+        64084: 40375,
+        64085: 40376,
+        64086: 40377,
+        64087: 40378,
+        64088: 40379,
+        64089: 40380,
+        64090: 40381,
+        64091: 40382,
+        64092: 40383,
+        64093: 40384,
+        64094: 40385,
+        64095: 40386,
+        64096: 40387,
+        64097: 40388,
+        64098: 40389,
+        64099: 40390,
+        64100: 40391,
+        64101: 40392,
+        64102: 40393,
+        64103: 40394,
+        64104: 40395,
+        64105: 40396,
+        64106: 40397,
+        64107: 40398,
+        64108: 40399,
+        64109: 40400,
+        64110: 40401,
+        64111: 40402,
+        64112: 40403,
+        64113: 40404,
+        64114: 40405,
+        64115: 40406,
+        64116: 40407,
+        64117: 40408,
+        64118: 40409,
+        64119: 40410,
+        64120: 40411,
+        64121: 40412,
+        64122: 40413,
+        64123: 40414,
+        64124: 40415,
+        64125: 40416,
+        64126: 40417,
+        64128: 40418,
+        64129: 40419,
+        64130: 40420,
+        64131: 40421,
+        64132: 40422,
+        64133: 40423,
+        64134: 40424,
+        64135: 40425,
+        64136: 40426,
+        64137: 40427,
+        64138: 40428,
+        64139: 40429,
+        64140: 40430,
+        64141: 40431,
+        64142: 40432,
+        64143: 40433,
+        64144: 40434,
+        64145: 40435,
+        64146: 40436,
+        64147: 40437,
+        64148: 40438,
+        64149: 40439,
+        64150: 40440,
+        64151: 40441,
+        64152: 40442,
+        64153: 40443,
+        64154: 40444,
+        64155: 40445,
+        64156: 40446,
+        64157: 40447,
+        64158: 40448,
+        64159: 40449,
+        64160: 40450,
+        64161: 58096,
+        64162: 58097,
+        64163: 58098,
+        64164: 58099,
+        64165: 58100,
+        64166: 58101,
+        64167: 58102,
+        64168: 58103,
+        64169: 58104,
+        64170: 58105,
+        64171: 58106,
+        64172: 58107,
+        64173: 58108,
+        64174: 58109,
+        64175: 58110,
+        64176: 58111,
+        64177: 58112,
+        64178: 58113,
+        64179: 58114,
+        64180: 58115,
+        64181: 58116,
+        64182: 58117,
+        64183: 58118,
+        64184: 58119,
+        64185: 58120,
+        64186: 58121,
+        64187: 58122,
+        64188: 58123,
+        64189: 58124,
+        64190: 58125,
+        64191: 58126,
+        64192: 58127,
+        64193: 58128,
+        64194: 58129,
+        64195: 58130,
+        64196: 58131,
+        64197: 58132,
+        64198: 58133,
+        64199: 58134,
+        64200: 58135,
+        64201: 58136,
+        64202: 58137,
+        64203: 58138,
+        64204: 58139,
+        64205: 58140,
+        64206: 58141,
+        64207: 58142,
+        64208: 58143,
+        64209: 58144,
+        64210: 58145,
+        64211: 58146,
+        64212: 58147,
+        64213: 58148,
+        64214: 58149,
+        64215: 58150,
+        64216: 58151,
+        64217: 58152,
+        64218: 58153,
+        64219: 58154,
+        64220: 58155,
+        64221: 58156,
+        64222: 58157,
+        64223: 58158,
+        64224: 58159,
+        64225: 58160,
+        64226: 58161,
+        64227: 58162,
+        64228: 58163,
+        64229: 58164,
+        64230: 58165,
+        64231: 58166,
+        64232: 58167,
+        64233: 58168,
+        64234: 58169,
+        64235: 58170,
+        64236: 58171,
+        64237: 58172,
+        64238: 58173,
+        64239: 58174,
+        64240: 58175,
+        64241: 58176,
+        64242: 58177,
+        64243: 58178,
+        64244: 58179,
+        64245: 58180,
+        64246: 58181,
+        64247: 58182,
+        64248: 58183,
+        64249: 58184,
+        64250: 58185,
+        64251: 58186,
+        64252: 58187,
+        64253: 58188,
+        64254: 58189,
+        64320: 40451,
+        64321: 40452,
+        64322: 40453,
+        64323: 40454,
+        64324: 40455,
+        64325: 40456,
+        64326: 40457,
+        64327: 40458,
+        64328: 40459,
+        64329: 40460,
+        64330: 40461,
+        64331: 40462,
+        64332: 40463,
+        64333: 40464,
+        64334: 40465,
+        64335: 40466,
+        64336: 40467,
+        64337: 40468,
+        64338: 40469,
+        64339: 40470,
+        64340: 40471,
+        64341: 40472,
+        64342: 40473,
+        64343: 40474,
+        64344: 40475,
+        64345: 40476,
+        64346: 40477,
+        64347: 40478,
+        64348: 40484,
+        64349: 40487,
+        64350: 40494,
+        64351: 40496,
+        64352: 40500,
+        64353: 40507,
+        64354: 40508,
+        64355: 40512,
+        64356: 40525,
+        64357: 40528,
+        64358: 40530,
+        64359: 40531,
+        64360: 40532,
+        64361: 40534,
+        64362: 40537,
+        64363: 40541,
+        64364: 40543,
+        64365: 40544,
+        64366: 40545,
+        64367: 40546,
+        64368: 40549,
+        64369: 40558,
+        64370: 40559,
+        64371: 40562,
+        64372: 40564,
+        64373: 40565,
+        64374: 40566,
+        64375: 40567,
+        64376: 40568,
+        64377: 40569,
+        64378: 40570,
+        64379: 40571,
+        64380: 40572,
+        64381: 40573,
+        64382: 40576,
+        64384: 40577,
+        64385: 40579,
+        64386: 40580,
+        64387: 40581,
+        64388: 40582,
+        64389: 40585,
+        64390: 40586,
+        64391: 40588,
+        64392: 40589,
+        64393: 40590,
+        64394: 40591,
+        64395: 40592,
+        64396: 40593,
+        64397: 40596,
+        64398: 40597,
+        64399: 40598,
+        64400: 40599,
+        64401: 40600,
+        64402: 40601,
+        64403: 40602,
+        64404: 40603,
+        64405: 40604,
+        64406: 40606,
+        64407: 40608,
+        64408: 40609,
+        64409: 40610,
+        64410: 40611,
+        64411: 40612,
+        64412: 40613,
+        64413: 40615,
+        64414: 40616,
+        64415: 40617,
+        64416: 40618,
+        64417: 58190,
+        64418: 58191,
+        64419: 58192,
+        64420: 58193,
+        64421: 58194,
+        64422: 58195,
+        64423: 58196,
+        64424: 58197,
+        64425: 58198,
+        64426: 58199,
+        64427: 58200,
+        64428: 58201,
+        64429: 58202,
+        64430: 58203,
+        64431: 58204,
+        64432: 58205,
+        64433: 58206,
+        64434: 58207,
+        64435: 58208,
+        64436: 58209,
+        64437: 58210,
+        64438: 58211,
+        64439: 58212,
+        64440: 58213,
+        64441: 58214,
+        64442: 58215,
+        64443: 58216,
+        64444: 58217,
+        64445: 58218,
+        64446: 58219,
+        64447: 58220,
+        64448: 58221,
+        64449: 58222,
+        64450: 58223,
+        64451: 58224,
+        64452: 58225,
+        64453: 58226,
+        64454: 58227,
+        64455: 58228,
+        64456: 58229,
+        64457: 58230,
+        64458: 58231,
+        64459: 58232,
+        64460: 58233,
+        64461: 58234,
+        64462: 58235,
+        64463: 58236,
+        64464: 58237,
+        64465: 58238,
+        64466: 58239,
+        64467: 58240,
+        64468: 58241,
+        64469: 58242,
+        64470: 58243,
+        64471: 58244,
+        64472: 58245,
+        64473: 58246,
+        64474: 58247,
+        64475: 58248,
+        64476: 58249,
+        64477: 58250,
+        64478: 58251,
+        64479: 58252,
+        64480: 58253,
+        64481: 58254,
+        64482: 58255,
+        64483: 58256,
+        64484: 58257,
+        64485: 58258,
+        64486: 58259,
+        64487: 58260,
+        64488: 58261,
+        64489: 58262,
+        64490: 58263,
+        64491: 58264,
+        64492: 58265,
+        64493: 58266,
+        64494: 58267,
+        64495: 58268,
+        64496: 58269,
+        64497: 58270,
+        64498: 58271,
+        64499: 58272,
+        64500: 58273,
+        64501: 58274,
+        64502: 58275,
+        64503: 58276,
+        64504: 58277,
+        64505: 58278,
+        64506: 58279,
+        64507: 58280,
+        64508: 58281,
+        64509: 58282,
+        64510: 58283,
+        64576: 40619,
+        64577: 40620,
+        64578: 40621,
+        64579: 40622,
+        64580: 40623,
+        64581: 40624,
+        64582: 40625,
+        64583: 40626,
+        64584: 40627,
+        64585: 40629,
+        64586: 40630,
+        64587: 40631,
+        64588: 40633,
+        64589: 40634,
+        64590: 40636,
+        64591: 40639,
+        64592: 40640,
+        64593: 40641,
+        64594: 40642,
+        64595: 40643,
+        64596: 40645,
+        64597: 40646,
+        64598: 40647,
+        64599: 40648,
+        64600: 40650,
+        64601: 40651,
+        64602: 40652,
+        64603: 40656,
+        64604: 40658,
+        64605: 40659,
+        64606: 40661,
+        64607: 40662,
+        64608: 40663,
+        64609: 40665,
+        64610: 40666,
+        64611: 40670,
+        64612: 40673,
+        64613: 40675,
+        64614: 40676,
+        64615: 40678,
+        64616: 40680,
+        64617: 40683,
+        64618: 40684,
+        64619: 40685,
+        64620: 40686,
+        64621: 40688,
+        64622: 40689,
+        64623: 40690,
+        64624: 40691,
+        64625: 40692,
+        64626: 40693,
+        64627: 40694,
+        64628: 40695,
+        64629: 40696,
+        64630: 40698,
+        64631: 40701,
+        64632: 40703,
+        64633: 40704,
+        64634: 40705,
+        64635: 40706,
+        64636: 40707,
+        64637: 40708,
+        64638: 40709,
+        64640: 40710,
+        64641: 40711,
+        64642: 40712,
+        64643: 40713,
+        64644: 40714,
+        64645: 40716,
+        64646: 40719,
+        64647: 40721,
+        64648: 40722,
+        64649: 40724,
+        64650: 40725,
+        64651: 40726,
+        64652: 40728,
+        64653: 40730,
+        64654: 40731,
+        64655: 40732,
+        64656: 40733,
+        64657: 40734,
+        64658: 40735,
+        64659: 40737,
+        64660: 40739,
+        64661: 40740,
+        64662: 40741,
+        64663: 40742,
+        64664: 40743,
+        64665: 40744,
+        64666: 40745,
+        64667: 40746,
+        64668: 40747,
+        64669: 40749,
+        64670: 40750,
+        64671: 40752,
+        64672: 40753,
+        64673: 58284,
+        64674: 58285,
+        64675: 58286,
+        64676: 58287,
+        64677: 58288,
+        64678: 58289,
+        64679: 58290,
+        64680: 58291,
+        64681: 58292,
+        64682: 58293,
+        64683: 58294,
+        64684: 58295,
+        64685: 58296,
+        64686: 58297,
+        64687: 58298,
+        64688: 58299,
+        64689: 58300,
+        64690: 58301,
+        64691: 58302,
+        64692: 58303,
+        64693: 58304,
+        64694: 58305,
+        64695: 58306,
+        64696: 58307,
+        64697: 58308,
+        64698: 58309,
+        64699: 58310,
+        64700: 58311,
+        64701: 58312,
+        64702: 58313,
+        64703: 58314,
+        64704: 58315,
+        64705: 58316,
+        64706: 58317,
+        64707: 58318,
+        64708: 58319,
+        64709: 58320,
+        64710: 58321,
+        64711: 58322,
+        64712: 58323,
+        64713: 58324,
+        64714: 58325,
+        64715: 58326,
+        64716: 58327,
+        64717: 58328,
+        64718: 58329,
+        64719: 58330,
+        64720: 58331,
+        64721: 58332,
+        64722: 58333,
+        64723: 58334,
+        64724: 58335,
+        64725: 58336,
+        64726: 58337,
+        64727: 58338,
+        64728: 58339,
+        64729: 58340,
+        64730: 58341,
+        64731: 58342,
+        64732: 58343,
+        64733: 58344,
+        64734: 58345,
+        64735: 58346,
+        64736: 58347,
+        64737: 58348,
+        64738: 58349,
+        64739: 58350,
+        64740: 58351,
+        64741: 58352,
+        64742: 58353,
+        64743: 58354,
+        64744: 58355,
+        64745: 58356,
+        64746: 58357,
+        64747: 58358,
+        64748: 58359,
+        64749: 58360,
+        64750: 58361,
+        64751: 58362,
+        64752: 58363,
+        64753: 58364,
+        64754: 58365,
+        64755: 58366,
+        64756: 58367,
+        64757: 58368,
+        64758: 58369,
+        64759: 58370,
+        64760: 58371,
+        64761: 58372,
+        64762: 58373,
+        64763: 58374,
+        64764: 58375,
+        64765: 58376,
+        64766: 58377,
+        64832: 40754,
+        64833: 40755,
+        64834: 40756,
+        64835: 40757,
+        64836: 40758,
+        64837: 40760,
+        64838: 40762,
+        64839: 40764,
+        64840: 40767,
+        64841: 40768,
+        64842: 40769,
+        64843: 40770,
+        64844: 40771,
+        64845: 40773,
+        64846: 40774,
+        64847: 40775,
+        64848: 40776,
+        64849: 40777,
+        64850: 40778,
+        64851: 40779,
+        64852: 40780,
+        64853: 40781,
+        64854: 40782,
+        64855: 40783,
+        64856: 40786,
+        64857: 40787,
+        64858: 40788,
+        64859: 40789,
+        64860: 40790,
+        64861: 40791,
+        64862: 40792,
+        64863: 40793,
+        64864: 40794,
+        64865: 40795,
+        64866: 40796,
+        64867: 40797,
+        64868: 40798,
+        64869: 40799,
+        64870: 40800,
+        64871: 40801,
+        64872: 40802,
+        64873: 40803,
+        64874: 40804,
+        64875: 40805,
+        64876: 40806,
+        64877: 40807,
+        64878: 40808,
+        64879: 40809,
+        64880: 40810,
+        64881: 40811,
+        64882: 40812,
+        64883: 40813,
+        64884: 40814,
+        64885: 40815,
+        64886: 40816,
+        64887: 40817,
+        64888: 40818,
+        64889: 40819,
+        64890: 40820,
+        64891: 40821,
+        64892: 40822,
+        64893: 40823,
+        64894: 40824,
+        64896: 40825,
+        64897: 40826,
+        64898: 40827,
+        64899: 40828,
+        64900: 40829,
+        64901: 40830,
+        64902: 40833,
+        64903: 40834,
+        64904: 40845,
+        64905: 40846,
+        64906: 40847,
+        64907: 40848,
+        64908: 40849,
+        64909: 40850,
+        64910: 40851,
+        64911: 40852,
+        64912: 40853,
+        64913: 40854,
+        64914: 40855,
+        64915: 40856,
+        64916: 40860,
+        64917: 40861,
+        64918: 40862,
+        64919: 40865,
+        64920: 40866,
+        64921: 40867,
+        64922: 40868,
+        64923: 40869,
+        64924: 63788,
+        64925: 63865,
+        64926: 63893,
+        64927: 63975,
+        64928: 63985,
+        64929: 58378,
+        64930: 58379,
+        64931: 58380,
+        64932: 58381,
+        64933: 58382,
+        64934: 58383,
+        64935: 58384,
+        64936: 58385,
+        64937: 58386,
+        64938: 58387,
+        64939: 58388,
+        64940: 58389,
+        64941: 58390,
+        64942: 58391,
+        64943: 58392,
+        64944: 58393,
+        64945: 58394,
+        64946: 58395,
+        64947: 58396,
+        64948: 58397,
+        64949: 58398,
+        64950: 58399,
+        64951: 58400,
+        64952: 58401,
+        64953: 58402,
+        64954: 58403,
+        64955: 58404,
+        64956: 58405,
+        64957: 58406,
+        64958: 58407,
+        64959: 58408,
+        64960: 58409,
+        64961: 58410,
+        64962: 58411,
+        64963: 58412,
+        64964: 58413,
+        64965: 58414,
+        64966: 58415,
+        64967: 58416,
+        64968: 58417,
+        64969: 58418,
+        64970: 58419,
+        64971: 58420,
+        64972: 58421,
+        64973: 58422,
+        64974: 58423,
+        64975: 58424,
+        64976: 58425,
+        64977: 58426,
+        64978: 58427,
+        64979: 58428,
+        64980: 58429,
+        64981: 58430,
+        64982: 58431,
+        64983: 58432,
+        64984: 58433,
+        64985: 58434,
+        64986: 58435,
+        64987: 58436,
+        64988: 58437,
+        64989: 58438,
+        64990: 58439,
+        64991: 58440,
+        64992: 58441,
+        64993: 58442,
+        64994: 58443,
+        64995: 58444,
+        64996: 58445,
+        64997: 58446,
+        64998: 58447,
+        64999: 58448,
+        65000: 58449,
+        65001: 58450,
+        65002: 58451,
+        65003: 58452,
+        65004: 58453,
+        65005: 58454,
+        65006: 58455,
+        65007: 58456,
+        65008: 58457,
+        65009: 58458,
+        65010: 58459,
+        65011: 58460,
+        65012: 58461,
+        65013: 58462,
+        65014: 58463,
+        65015: 58464,
+        65016: 58465,
+        65017: 58466,
+        65018: 58467,
+        65019: 58468,
+        65020: 58469,
+        65021: 58470,
+        65022: 58471,
+        65088: 64012,
+        65089: 64013,
+        65090: 64014,
+        65091: 64015,
+        65092: 64017,
+        65093: 64019,
+        65094: 64020,
+        65095: 64024,
+        65096: 64031,
+        65097: 64032,
+        65098: 64033,
+        65099: 64035,
+        65100: 64036,
+        65101: 64039,
+        65102: 64040,
+        65103: 64041,
+        65104: 11905,
+        65105: 59414,
+        65106: 59415,
+        65107: 59416,
+        65108: 11908,
+        65109: 13427,
+        65110: 13383,
+        65111: 11912,
+        65112: 11915,
+        65113: 59422,
+        65114: 13726,
+        65115: 13850,
+        65116: 13838,
+        65117: 11916,
+        65118: 11927,
+        65119: 14702,
+        65120: 14616,
+        65121: 59430,
+        65122: 14799,
+        65123: 14815,
+        65124: 14963,
+        65125: 14800,
+        65126: 59435,
+        65127: 59436,
+        65128: 15182,
+        65129: 15470,
+        65130: 15584,
+        65131: 11943,
+        65132: 59441,
+        65133: 59442,
+        65134: 11946,
+        65135: 16470,
+        65136: 16735,
+        65137: 11950,
+        65138: 17207,
+        65139: 11955,
+        65140: 11958,
+        65141: 11959,
+        65142: 59451,
+        65143: 17329,
+        65144: 17324,
+        65145: 11963,
+        65146: 17373,
+        65147: 17622,
+        65148: 18017,
+        65149: 17996,
+        65150: 59459,
+        65152: 18211,
+        65153: 18217,
+        65154: 18300,
+        65155: 18317,
+        65156: 11978,
+        65157: 18759,
+        65158: 18810,
+        65159: 18813,
+        65160: 18818,
+        65161: 18819,
+        65162: 18821,
+        65163: 18822,
+        65164: 18847,
+        65165: 18843,
+        65166: 18871,
+        65167: 18870,
+        65168: 59476,
+        65169: 59477,
+        65170: 19619,
+        65171: 19615,
+        65172: 19616,
+        65173: 19617,
+        65174: 19575,
+        65175: 19618,
+        65176: 19731,
+        65177: 19732,
+        65178: 19733,
+        65179: 19734,
+        65180: 19735,
+        65181: 19736,
+        65182: 19737,
+        65183: 19886,
+        65184: 59492,
+        65185: 58472,
+        65186: 58473,
+        65187: 58474,
+        65188: 58475,
+        65189: 58476,
+        65190: 58477,
+        65191: 58478,
+        65192: 58479,
+        65193: 58480,
+        65194: 58481,
+        65195: 58482,
+        65196: 58483,
+        65197: 58484,
+        65198: 58485,
+        65199: 58486,
+        65200: 58487,
+        65201: 58488,
+        65202: 58489,
+        65203: 58490,
+        65204: 58491,
+        65205: 58492,
+        65206: 58493,
+        65207: 58494,
+        65208: 58495,
+        65209: 58496,
+        65210: 58497,
+        65211: 58498,
+        65212: 58499,
+        65213: 58500,
+        65214: 58501,
+        65215: 58502,
+        65216: 58503,
+        65217: 58504,
+        65218: 58505,
+        65219: 58506,
+        65220: 58507,
+        65221: 58508,
+        65222: 58509,
+        65223: 58510,
+        65224: 58511,
+        65225: 58512,
+        65226: 58513,
+        65227: 58514,
+        65228: 58515,
+        65229: 58516,
+        65230: 58517,
+        65231: 58518,
+        65232: 58519,
+        65233: 58520,
+        65234: 58521,
+        65235: 58522,
+        65236: 58523,
+        65237: 58524,
+        65238: 58525,
+        65239: 58526,
+        65240: 58527,
+        65241: 58528,
+        65242: 58529,
+        65243: 58530,
+        65244: 58531,
+        65245: 58532,
+        65246: 58533,
+        65247: 58534,
+        65248: 58535,
+        65249: 58536,
+        65250: 58537,
+        65251: 58538,
+        65252: 58539,
+        65253: 58540,
+        65254: 58541,
+        65255: 58542,
+        65256: 58543,
+        65257: 58544,
+        65258: 58545,
+        65259: 58546,
+        65260: 58547,
+        65261: 58548,
+        65262: 58549,
+        65263: 58550,
+        65264: 58551,
+        65265: 58552,
+        65266: 58553,
+        65267: 58554,
+        65268: 58555,
+        65269: 58556,
+        65270: 58557,
+        65271: 58558,
+        65272: 58559,
+        65273: 58560,
+        65274: 58561,
+        65275: 58562,
+        65276: undefined,
+        65277: null,
+        65278: last
+    };
+}
+
+for (var i = 0; i < 2; i++) {
+    var obj = getObject();
+    print(obj[33088]);
+    print(obj[65275]);
+    print(obj[65276]);
+    print(obj[65277]);
+    print(obj[65278]);
+    var keys = Object.keys(obj);
+    print(obj[keys[0]]);
+    print(obj[keys[keys.length - 1]]);
+    print(keys.length);
+    obj[65275] = 0;
+    print(obj[65275]);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8020132.js.EXPECTED	Wed Jul 05 19:07:19 2017 +0200
@@ -0,0 +1,18 @@
+19970
+58562
+undefined
+null
+58565
+19970
+58565
+23940
+0
+19970
+58562
+undefined
+null
+58565
+19970
+58565
+23940
+0