// Path: msgpack-core/src/main/java/org/msgpack/value/impl/ImmutableTimestampValueImpl.java
// public class ImmutableTimestampValueImpl
//         extends AbstractImmutableValue
//         implements ImmutableExtensionValue, ImmutableTimestampValue
// {
//     private final Instant instant;
//     private byte[] data;
// 
//     public ImmutableTimestampValueImpl(Instant timestamp)
//     {
//         this.instant = timestamp;
//     }
// 
//     @Override
//     public boolean isTimestampValue()
//     {
//         return true;
//     }
// 
//     @Override
//     public byte getType()
//     {
//         return EXT_TIMESTAMP;
//     }
// 
//     @Override
//     public ValueType getValueType()
//     {
//         // Note: Future version should return ValueType.TIMESTAMP instead.
//         return ValueType.EXTENSION;
//     }
// 
//     @Override
//     public ImmutableTimestampValue immutableValue()
//     {
//         return this;
//     }
// 
//     @Override
//     public ImmutableExtensionValue asExtensionValue()
//     {
//         return this;
//     }
// 
//     @Override
//     public ImmutableTimestampValue asTimestampValue()
//     {
//         return this;
//     }
// 
//     @Override
//     public byte[] getData()
//     {
//         if (data == null) {
//             // See MessagePacker.packTimestampImpl
//             byte[] bytes;
//             long sec = getEpochSecond();
//             int nsec = getNano();
//             if (sec >>> 34 == 0) {
//                 long data64 = (nsec << 34) | sec;
//                 if ((data64 & 0xffffffff00000000L) == 0L) {
//                     bytes = new byte[4];
//                     MessageBuffer.wrap(bytes).putInt(0, (int) sec);
//                 }
//                 else {
//                     bytes = new byte[8];
//                     MessageBuffer.wrap(bytes).putLong(0, data64);
//                 }
//             }
//             else {
//                 bytes = new byte[12];
//                 MessageBuffer buffer = MessageBuffer.wrap(bytes);
//                 buffer.putInt(0, nsec);
//                 buffer.putLong(4, sec);
//             }
//             data = bytes;
//         }
//         return data;
//     }
// 
//     @Override
//     public long getEpochSecond()
//     {
//         return instant.getEpochSecond();
//     }
// 
//     @Override
//     public int getNano()
//     {
//         return instant.getNano();
//     }
// 
//     @Override
//     public long toEpochMillis()
//     {
//         return instant.toEpochMilli();
//     }
// 
//     @Override
//     public Instant toInstant()
//     {
//         return instant;
//     }
// 
//     @Override
//     public void writeTo(MessagePacker packer)
//             throws IOException
//     {
//         packer.packTimestamp(instant);
//     }
// 
//     @Override
//     public boolean equals(Object o)
//     {
//         // Implements same behavior with ImmutableExtensionValueImpl.
//         if (o == this) {
//             return true;
//         }
//         if (!(o instanceof Value)) {
//             return false;
//         }
//         Value v = (Value) o;
// 
//         if (!v.isExtensionValue()) {
//             return false;
//         }
//         ExtensionValue ev = v.asExtensionValue();
// 
//         // Here should use isTimestampValue and asTimestampValue instead. However, because
//         // adding these methods to Value interface can't keep backward compatibility without
//         // using "default" keyword since Java 7, here uses instanceof of and cast instead.
//         if (ev instanceof TimestampValue) {
//             TimestampValue tv = (TimestampValue) ev;
//             return instant.equals(tv.toInstant());
//         }
//         else {
//             return EXT_TIMESTAMP == ev.getType() && Arrays.equals(getData(), ev.getData());
//         }
//     }
// 
//     @Override
//     public int hashCode()
//     {
//         // Implements same behavior with ImmutableExtensionValueImpl.
//         int hash = EXT_TIMESTAMP;
//         hash *= 31;
//         hash = instant.hashCode();
//         return hash;
//     }
// 
//     @Override
//     public String toJson()
//     {
//         return "\"" + toInstant().toString() + "\"";
//     }
// 
//     @Override
//     public String toString()
//     {
//         return toInstant().toString();
//     }
// }


import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.msgpack.value.impl.ImmutableArrayValueImpl;
import org.msgpack.value.impl.ImmutableBigIntegerValueImpl;
import org.msgpack.value.impl.ImmutableBinaryValueImpl;
import org.msgpack.value.impl.ImmutableBooleanValueImpl;
import org.msgpack.value.impl.ImmutableDoubleValueImpl;
import org.msgpack.value.impl.ImmutableExtensionValueImpl;
import org.msgpack.value.impl.ImmutableLongValueImpl;
import org.msgpack.value.impl.ImmutableMapValueImpl;
import org.msgpack.value.impl.ImmutableNilValueImpl;
import org.msgpack.value.impl.ImmutableStringValueImpl;
import org.msgpack.value.impl.ImmutableTimestampValueImpl;
import java.math.BigInteger;
import java.time.Instant;
import java.util.AbstractMap;
        }
        else if (omitCopy) {
            return new ImmutableArrayValueImpl(array);
        }
        else {
            return new ImmutableArrayValueImpl(Arrays.copyOf(array, array.length));
        }
    }

    public static ImmutableArrayValue emptyArray()
    {
        return ImmutableArrayValueImpl.empty();
    }

    public static <K extends Value, V extends Value>
    ImmutableMapValue newMap(Map<K, V> map)
    {
        Value[] kvs = new Value[map.size() * 2];
        int index = 0;
        for (Map.Entry<K, V> pair : map.entrySet()) {
            kvs[index] = pair.getKey();
            index++;
            kvs[index] = pair.getValue();
            index++;
        }
        return new ImmutableMapValueImpl(kvs);
    }

    public static ImmutableMapValue newMap(Value... kvs)
    {
// Path: msgpack-core/src/main/java/org/msgpack/value/impl/ImmutableTimestampValueImpl.java
// public class ImmutableTimestampValueImpl
//         extends AbstractImmutableValue
//         implements ImmutableExtensionValue, ImmutableTimestampValue
// {
//     private final Instant instant;
//     private byte[] data;
// 
//     public ImmutableTimestampValueImpl(Instant timestamp)
//     {
//         this.instant = timestamp;
//     }
// 
//     @Override
//     public boolean isTimestampValue()
//     {
//         return true;
//     }
// 
//     @Override
//     public byte getType()
//     {
//         return EXT_TIMESTAMP;
//     }
// 
//     @Override
//     public ValueType getValueType()
//     {
//         // Note: Future version should return ValueType.TIMESTAMP instead.
//         return ValueType.EXTENSION;
//     }
// 
//     @Override
//     public ImmutableTimestampValue immutableValue()
//     {
//         return this;
//     }
// 
//     @Override
//     public ImmutableExtensionValue asExtensionValue()
//     {
//         return this;
//     }
// 
//     @Override
//     public ImmutableTimestampValue asTimestampValue()
//     {
//         return this;
//     }
// 
//     @Override
//     public byte[] getData()
//     {
//         if (data == null) {
//             // See MessagePacker.packTimestampImpl
//             byte[] bytes;
//             long sec = getEpochSecond();
//             int nsec = getNano();
//             if (sec >>> 34 == 0) {
//                 long data64 = (nsec << 34) | sec;
//                 if ((data64 & 0xffffffff00000000L) == 0L) {
//                     bytes = new byte[4];
//                     MessageBuffer.wrap(bytes).putInt(0, (int) sec);
//                 }
//                 else {
//                     bytes = new byte[8];
//                     MessageBuffer.wrap(bytes).putLong(0, data64);
//                 }
//             }
//             else {
//                 bytes = new byte[12];
//                 MessageBuffer buffer = MessageBuffer.wrap(bytes);
//                 buffer.putInt(0, nsec);
//                 buffer.putLong(4, sec);
//             }
//             data = bytes;
//         }
//         return data;
//     }
// 
//     @Override
//     public long getEpochSecond()
//     {
//         return instant.getEpochSecond();
//     }
// 
//     @Override
//     public int getNano()
//     {
//         return instant.getNano();
//     }
// 
//     @Override
//     public long toEpochMillis()
//     {
//         return instant.toEpochMilli();
//     }
// 
//     @Override
//     public Instant toInstant()
//     {
//         return instant;
//     }
// 
//     @Override
//     public void writeTo(MessagePacker packer)
//             throws IOException
//     {
//         packer.packTimestamp(instant);
//     }
// 
//     @Override
//     public boolean equals(Object o)
//     {
//         // Implements same behavior with ImmutableExtensionValueImpl.
//         if (o == this) {
//             return true;
//         }
//         if (!(o instanceof Value)) {
//             return false;
//         }
//         Value v = (Value) o;
// 
//         if (!v.isExtensionValue()) {
//             return false;
//         }
//         ExtensionValue ev = v.asExtensionValue();
// 
//         // Here should use isTimestampValue and asTimestampValue instead. However, because
//         // adding these methods to Value interface can't keep backward compatibility without
//         // using "default" keyword since Java 7, here uses instanceof of and cast instead.
//         if (ev instanceof TimestampValue) {
//             TimestampValue tv = (TimestampValue) ev;
//             return instant.equals(tv.toInstant());
//         }
//         else {
//             return EXT_TIMESTAMP == ev.getType() && Arrays.equals(getData(), ev.getData());
//         }
//     }
// 
//     @Override
//     public int hashCode()
//     {
//         // Implements same behavior with ImmutableExtensionValueImpl.
//         int hash = EXT_TIMESTAMP;
//         hash *= 31;
//         hash = instant.hashCode();
//         return hash;
//     }
// 
//     @Override
//     public String toJson()
//     {
//         return "\"" + toInstant().toString() + "\"";
//     }
// 
//     @Override
//     public String toString()
//     {
//         return toInstant().toString();
//     }
// }


// Path: msgpack-core/src/main/java/org/msgpack/value/ValueFactory.java
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.msgpack.value.impl.ImmutableArrayValueImpl;
import org.msgpack.value.impl.ImmutableBigIntegerValueImpl;
import org.msgpack.value.impl.ImmutableBinaryValueImpl;
import org.msgpack.value.impl.ImmutableBooleanValueImpl;
import org.msgpack.value.impl.ImmutableDoubleValueImpl;
import org.msgpack.value.impl.ImmutableExtensionValueImpl;
import org.msgpack.value.impl.ImmutableLongValueImpl;
import org.msgpack.value.impl.ImmutableMapValueImpl;
import org.msgpack.value.impl.ImmutableNilValueImpl;
import org.msgpack.value.impl.ImmutableStringValueImpl;
import org.msgpack.value.impl.ImmutableTimestampValueImpl;
import java.math.BigInteger;
import java.time.Instant;
import java.util.AbstractMap;

        }
        else if (omitCopy) {
            return new ImmutableArrayValueImpl(array);
        }
        else {
            return new ImmutableArrayValueImpl(Arrays.copyOf(array, array.length));
        }
    }

    public static ImmutableArrayValue emptyArray()
    {
        return ImmutableArrayValueImpl.empty();
    }

    public static <K extends Value, V extends Value>
    ImmutableMapValue newMap(Map<K, V> map)
    {
        Value[] kvs = new Value[map.size() * 2];
        int index = 0;
        for (Map.Entry<K, V> pair : map.entrySet()) {
            kvs[index] = pair.getKey();
            index++;
            kvs[index] = pair.getValue();
            index++;
        }
        return new ImmutableMapValueImpl(kvs);
    }

    public static ImmutableMapValue newMap(Value... kvs)
    {
        if (kvs.length == 0) {